I replaced a brand's Shopify app stack with code. Here's what it really costs
The usual Shopify answer to "can the store do X?" is "there's an app for that". Install it, pay monthly, live with its widget, its script weight and its idea of how your store should look. For a publisher I run tech for
The usual Shopify answer to "can the store do X?" is "there's an app for that". Install it, pay monthly, live with its widget, its script weight and its idea of how your store should look.
For a publisher I run tech for (4 stores, 4 countries, 4 currencies), I stopped saying that. Most of what would normally be an app is now code we own. AI didn't write it for me, but it made one engineer fast enough to build and maintain all of it.
What we built instead of installing
| Need | What runs now |
|---|---|
| Frequently bought together | Sets mined from real orders + a Shopify Function that discounts only complete sets |
| Bundle builder | A guided quiz that builds a 2–4 book library, discount applied at checkout |
| Cart upsell | "Complete your library" in the cart drawer |
| Prepaid nudge | Order discount + a payment customization that hides cash on delivery when the customer opts in |
| Split-shipment fee | Orders split across parcels pay one fee, by total weight |
| International upsell | A cart bar showing weight against 5/10/20/30 kg shipping slabs |
| Back in stock | Notify-me on product cards and pages |
| AI shopping assistant | Claude-based, with every sale it creates tagged on the order |
| WhatsApp inbox | Our own CRM on Meta's coexistence API |
| Inventory | A ledger that records who changed stock, with daily drift checks |
| Reporting | P&L and a multi-store sales dashboard |
| Control panel | One embedded admin app to switch features on or off and change percentages, no developer needed |
All of these are live. Some run on all 4 stores, others only where they make sense (cash on delivery is a Pakistan problem, shipping slabs are an international one).
Why code beat apps here
- Logic apps can't express. "Discount only when the full set is in the cart" and "hide COD only when the shopper chose to prepay" aren't settings in an app. They're business rules.
- One brand, one design. Nothing looks bolted on, because nothing is.
- Speed. Every app adds its own script. Ours load only where they're used.
- The data stays ours. Orders, stock history and chats sit in our database, not in a vendor dashboard we rent.
What it actually costs (the honest part)
Owning the code means owning the bugs. These are the ones that cost us:
- The 25-discount ceiling. Shopify allows 25 automatic discounts per store. We had hundreds of real product sets, so I pack them into "shards" to stay under the limit and the config size cap.
- Plus gating. Payment and delivery customizations from a custom app need Shopify Plus. I learned this on another, non-Plus store after building and deploying a Function. Now the plan check happens before any code.
- Bundles that oversold. A bundle was its own product, separate from the books inside it. Without the right inventory settings, Shopify let 100 bundles into a cart when only 1 real book was in stock. App vendors absorb bugs like this for you. We don't have that buffer.
-
Discounts that fight. A welcome code that didn't combine with product discounts quietly cancelled a discount we'd promised. Now every active discount's
combinesWithgets checked before we promise anything. - Maintenance never ends. API versions change, and someone has to read the changelog. Here, that's me.
When I'd still install an app
When the feature is a commodity (reviews, email, subscriptions billing), when nobody on the team can own the code, or when the store is small enough that one app costs less than one day of development.
For a multi-store brand with rules no app understands, the maths flips. You stop paying rent on features and start owning an asset.
I build these systems for Shopify brands. More at fahadazhar.site.
Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.