Pulse for Shopify App Store

Pulse for Shopify App Store

Taking an internal buying dashboard multi-tenant and shipping it as a public Shopify App Store app.

Taking an internal buying dashboard multi-tenant and shipping it as a public Shopify App Store app.

Taking an internal buying dashboard multi-tenant and shipping it as a public Shopify App Store app.

Bouguessa — Luxury Fashion on Shopify Plus

React Router 7
Shopify App Bridge
Shopify Admin GraphQL
Prisma
Postgres (Supabase)
Vercel

Status

In build, not yet submitted. The app is registered, the install and authentication flow is in place, merchant data is isolated in its own schema, and the mandatory privacy webhooks are implemented and tested.


Still ahead: the three reports rebuilt against Shopify's embedded UI, Shopify-native billing, and App Store submission.

Role

Product designer & engineer

Year

2026

Industry

E-commerce operations · SaaS product

Stack

React Router 7 · Shopify App Bridge · Shopify Admin GraphQL · Prisma · Postgres · Vercel

Links

The Problem

Pulse solved a problem that is not unique to Avnzor — but I had built it as though it were.

The internal dashboard reads Avnzor's Shopify store, but it also reads a MySQL warehouse database, a consignment supplier's stock feed, in-transit purchase orders, weather data and competitor prices. That mix is exactly what makes it sharp for one merchant and impossible for any other merchant to install.

Every Shopify merchant holding inventory has the same four questions Pulse was built to answer. The work here is separating the part of the system that only needs Shopify from the part that needs Avnzor — and turning the first half into something a stranger can install in two clicks.

In build: OAuth and embedded session handling, per-merchant data isolation, the mandatory privacy webhooks, and Shopify-native billing.

How I Framed It

I asked which of Pulse's twenty-eight pages would still work on a store I had never seen.


The answer was smaller than I expected, and more valuable. The classification logic at the centre of Pulse — the thing the buying team actually trusts — needs nothing but Shopify. Units on hand set the severity band. Thirty days of paid orders set the order you work in. Everything else is enrichment.


That distinction is easy to lose. Velocity feels like it should promote an item to critical, but it never does — it decides which of the forty critical items gets dealt with before lunch. Keeping the two inputs doing separate jobs is why the list stays readable when it is long, and it is the piece that ports cleanly to any store.

How I Framed It

I asked which of Pulse's twenty-eight pages would still work on a store I had never seen.


The answer was smaller than I expected, and more valuable. The classification logic at the centre of Pulse — the thing the buying team actually trusts — needs nothing but Shopify. Units on hand set the severity band. Thirty days of paid orders set the order you work in. Everything else is enrichment.


That distinction is easy to lose. Velocity feels like it should promote an item to critical, but it never does — it decides which of the forty critical items gets dealt with before lunch. Keeping the two inputs doing separate jobs is why the list stays readable when it is long, and it is the piece that ports cleanly to any store.

Key Decisions

Ship a wedge, not the dashboard. Three reports — Stock Risk, Sell-Through, Top Sellers — instead of twenty-eight pages. One clear job, a small support surface, and room to learn what merchants actually ask for before building more.


Adopt Shopify's own app framework rather than porting the Next.js build. I had already hand-written OAuth, token encryption and webhook verification. Shopify's React Router template provides all of it, plus embedded session tokens and the Billing API, as maintained library code. Those are the parts that are fiddly, security-sensitive, and where App Store reviews fail. Throwing away working code was the cheaper decision.


Isolate merchant data at the schema level. Every merchant-scoped table carries a tenant reference with a cascading delete, so an erasure request is a single statement that cannot silently miss a table.


Treat compliance as build work. The three privacy webhooks are tested code with an audit trail, not a checkbox — reviewers probe them with a deliberately invalid signature.

What I'd Do Differently

I would have drawn the portable-versus-local line on day one.


Nothing about the warehouse integration was wrong for Avnzor — it is genuinely useful there. But because it was wired straight through the same routes as the Shopify logic, separating the two later meant untangling rather than lifting. Had the enrichment sat behind a boundary from the start, the multi-tenant version would have been an afternoon's work instead of a rebuild.


The same applies to the database. Pulse's tables were built for one store, so none of them carried a tenant column. Retrofitting that is straightforward but unglamorous, and entirely avoidable.

What I'd Do Differently

I would have drawn the portable-versus-local line on day one.


Nothing about the warehouse integration was wrong for Avnzor — it is genuinely useful there. But because it was wired straight through the same routes as the Shopify logic, separating the two later meant untangling rather than lifting. Had the enrichment sat behind a boundary from the start, the multi-tenant version would have been an afternoon's work instead of a rebuild.


The same applies to the database. Pulse's tables were built for one store, so none of them carried a tenant column. Retrofitting that is straightforward but unglamorous, and entirely avoidable.

More Projects

Creating Since 2010

I’m currently available for new work. Let me know if you need a digital designer. I’d love to talk about the next big thing!

© Molham.Works 2025