Service
I build Shopify apps that survive real merchant scale — embedded Remix and Polaris admin UIs, webhook pipelines, and storefront widgets that do not slow a theme down.
I have worked on two Shopify apps that between them run on over 100,000 merchant stores: SalesPop, a real-time social-proof app on 60,000+ stores, and Cartly, an automated cart-recovery app on 40,000+ merchants. That is a specific kind of experience — not "I can build a Shopify app" but "I have watched one break at scale and fixed it."
Whether you are validating a first app or fixing one that is buckling under webhook volume, I can take it from the Shopify CLI scaffold to an App Store listing that passes review.
Almost every failure I have debugged in a production Shopify app traces back to webhooks. Shopify does not promise exactly-once delivery, and it does not promise ordering. If your handler is not idempotent, the first traffic spike will send a merchant two abandoned-cart emails for the same cart, and you will hear about it in a one-star review rather than in your logs.
The second recurring problem is the storefront widget. Merchants judge an app by whether their store still feels fast with it installed, and a widget that blocks render or ships a large bundle will get uninstalled no matter how good the admin UI is. I treat the widget as the performance-critical surface it is: deferred, small, and measured against the theme it lands in.
Third is rate limits. Shopify's GraphQL Admin API uses a calculated cost model, and code written against a 50-store test account falls apart at 50,000. Bulk operations and cost-aware batching are not optimizations here — they are the difference between a sync that finishes and one that silently drops merchants.
On SalesPop I built the Remix and Polaris admin dashboard against a Gadget.dev backend and worked on the real-time data flows behind live visitor counters and purchase notifications, including the optimizations that cut widget load time. On Cartly I worked on the recovery pipeline itself — Shopify cart events, recovery timing windows, merchant settings sync, and the analytics dashboard merchants use to see what the app earned them.
A first version of a focused Shopify app is typically a four-to-eight week engagement, including App Store submission. Rescue work on an existing app usually starts with a paid audit: I read the webhook handlers, the API usage, and the widget, and come back with a written list of what will break and in what order. You can act on that list with or without me.
A first version of a focused Shopify app is typically a four-to-eight week engagement, including App Store submission. Submission itself is rarely the bottleneck — the review fixes that come back are, which is why I build against the review requirements from the start rather than treating them as a final step.
Yes, and it is a common reason people call. Rescue work usually starts with a paid audit: I read the webhook handlers, the API usage, and the storefront widget, then come back with a written list of what will break and in what order. You can act on that list with or without me.
Apps — embedded admin apps built with Remix and Polaris, webhook-driven backends, and storefront widgets. I do not build storefronts or themes. The two are different disciplines that happen to share a platform name.
I have worked on two Shopify apps that between them run on over 100,000 merchant stores: SalesPop, a real-time social-proof app installed on 60,000+ stores, and Cartly, an automated cart-recovery app on 40,000+ stores. That is a specific kind of experience — not "I can build a Shopify app" but "I have watched one break at scale and fixed it."
Almost every production failure I have debugged traces back to two things. First, webhooks: Shopify does not promise exactly-once delivery or ordering, so a handler that is not idempotent will eventually send a merchant two emails for the same cart. Second, rate limits: the GraphQL Admin API uses a calculated cost model, and code written against a 50-store test account falls apart at 50,000. Bulk operations and cost-aware batching are not optimizations there — they are the difference between a sync that finishes and one that silently drops merchants.
Real-time social-proof and sales notifications — trust badges, countdown timers, and visitor counters. Trusted by 60,000+ Shopify stores.
Read the case study →Automated cart recovery for Shopify — recovers abandoned carts through synced workflows and optimized backend processing. Trusted by 40,000+ merchants.
Read the case study →A 15-minute call is usually enough to scope it. If I am not the right fit, I will tell you on the call.