Merchant-facing pages.
Embedded in the Shopify admin via App Bridge 4. Polaris UI, session-token authentication, Admin GraphQL for data. The first surface every public app ships against.
A Shopify-native app practice building public App Store apps, private merchant apps, and Plus checkout extensions on Functions, Remix, App Bridge 4, and the Admin GraphQL API. With a first-pass App Store approval rate we publish and stand behind.
The word “Shopify app” hides five very different things. An admin extension is not a storefront block. A checkout UI extension is not a Shopify Function. A webhook consumer is not an embedded app. Each surface has its own API contract, its own review path, its own billing model, and its own failure mode. The first decision in every engagement is which surfaces your app actually needs. Most apps need two. Some need all five. Very few genuinely need one.
Embedded in the Shopify admin via App Bridge 4. Polaris UI, session-token authentication, Admin GraphQL for data. The first surface every public app ships against.
App blocks drop into a merchant's theme without editing Liquid. Announcement bars, product recommendations, reviews, pop-ups. Scoped asset loading so the storefront stays fast.
The Plus-only surface. Upsells, delivery instructions, validation rules, custom payment fields. Replaces the deprecated checkout.liquid customization surface entirely.
Discount, delivery, payment customization, and cart validation that executes inside Shopify's own servers. Lower latency than a webhook round-trip. The Plus-only logic surface.
Orders, customers, inventory, fulfilment events pushed to your backend. Plus three mandatory compliance webhooks every public app must answer. Idempotent, retried, signed.
A subscription app uses admin + webhooks + billing. A bundling app uses admin + theme extension + Functions. A loyalty app uses admin + theme extension + checkout extension. The scoping question is never “build an app” — it is always “which surfaces.”
Every Shopify extension request can be answered with a theme-Liquid tweak, a Shopify Function, a Checkout UI Extension, or a full app. The lightest answer wins. Here is the decision matrix we walk every buyer through before we touch an API token.
| Theme Liquid | Shopify Function | Checkout UI Extension | Full App | |
|---|---|---|---|---|
| where it runs | storefront render | Shopify's servers | checkout iframe | your backend + Shopify admin |
| merchant access | any Shopify plan | Plus-only (most types) | Plus-only | any plan, app review required for public |
| typical build time | hours to days | 1–3 weeks | 2–6 weeks | 6–16 weeks |
| best for | visual + content changes | discount, delivery, payment logic | upsell, validation, custom fields at checkout | merchant workflows, SaaS apps, heavy data |
| wrong for | any logic beyond Liquid filters | anything with a UI | non-Plus stores | simple one-off tweaks |
Most “we need an app” briefs we scope end up as a Function plus a checkout extension. That is the answer more often than a full app.
Fourteen seconds. Five surfaces. The tour walks through each extension point Shopify exposes, what the contract looks like, and what it is actually for — admin, online store, checkout, functions, webhooks.
The engineering is 80% shared. The go-to-market is entirely different. Private apps never hit the App Store. Custom apps reach a named set of merchants. Public apps take the review path and compound as a SaaS business. Pick the contract first; the build follows.
Installed on a single Shopify store. No App Store review. No listing assets. Access scoped to that one shop's Admin API credentials. The right path when the extension serves a specific merchant's workflow and has no SaaS intent.
Distributed to a small set of named stores via custom distribution, without App Store review. Good for agencies running the same app across a client roster and for Plus merchants sharing tooling across brands under one parent.
Listed on the Shopify App Store. Goes through the review path. Monetized through the Billing API. The path for founders building a SaaS around a Shopify extension. Commercially the most upside, operationally the most gates.
A public app is not always the right answer. We build the private or custom path whenever the math and distribution support it.
Most Shopify app service pages still lead with Polaris, Node, and REST. That stack shipped in 2021. Here is the stack we actually ship against in 2026 and why each piece earns its place. Every layer references the current Shopify app development docs and Shopify's official Remix starter template.
The default for every new public app. Session handling, webhook routing, billing integration, and Partner-ready config come out of the box. We only deviate for apps that need to run on Cloudflare Workers or a non-Node runtime.
GraphQL over REST for almost everything. Cost-based rate limiting means we plan queries around calculated cost, use bulk operations for large catalog reads, and batch mutations through @defer or fragments where possible.
Session-token auth, Web Component-based, no more iframe message-passing ceremony. Polaris design tokens for every surface so the app reads as native admin UI. App Bridge 1 and 2 are deprecated; we reject briefs that insist on them.
Rust when latency matters, JavaScript when iteration speed matters. Cart, checkout, discount, delivery, payment, and validation logic now run inside Shopify itself rather than across a webhook boundary.
Stack picks change every 12 months. We rewrite this section every quarter; these are the calls we are making in 2026-Q2.
The App Store Gate is our six-point pre-submission checklist. It maps onto the reasons Shopify actually rejects apps, in the frequency we have seen them reject. Every public app we ship clears the gate before it reaches a reviewer. First-pass approval rate on apps we submit sits above 80%. We cross-reference every check against Shopify's official app requirements checklist.
customers/data_request, customers/redact, shop/redact. HMAC-verified, idempotent, 200 OK under 5 seconds. The single most common rejection reason.
Minimum scopes requested. Offline tokens for background work, online tokens for merchant sessions. Secure storage, tested refresh. Over-scoped apps fail review.
Every admin page embedded via App Bridge 4 Web Components. Session-token auth for every server call. No legacy iframe postMessage patterns anywhere in the codebase.
Recurring, usage, or one-time correctly modelled. TrialDays handled. Upgrade and downgrade tested. Merchant-side billing events confirmed. Silent billing is the rejection reason nobody sees coming.
Admin pages under 3 seconds, webhook handlers under 5 seconds, GraphQL queries within cost budget, 429 backoff respected, bulk operations used for large catalog reads.
Outcome-first copy, five screenshots at the required resolution, demo video, correct category, pricing with trial details, support URL and privacy policy live. Listing failures cost a full cycle.
The gate adds roughly a week to every public app build. It pays itself back the first time the app clears review without a resubmission cycle.
Shopify's Billing API is the only way a public app charges merchants. The billing model you pick on day one decides churn, payback, and forecastability for the life of the app. Four models, four very different ARR curves.
A fixed monthly price per installed shop. The simplest to build, the easiest to forecast, the most honest for merchants. The right starting model for most feature-focused apps. TrialDays handles free trials cleanly; upgrade and downgrade require explicit billing events.
Charge per unit consumed — orders processed, emails sent, AI generations, GB transferred. Creates an ARR curve that compounds with merchant growth. Requires careful metering, usage capping for merchants who ask for it, and transparent invoicing or trust breaks.
Starter / Growth / Plus tiers, each with its own feature set and quota, plus usage overage per tier. The commercial default for apps crossing $1M ARR. Lets smaller merchants stay affordable while letting larger merchants pull the pricing ceiling upward.
One-time charges or prepaid credits that burn down with use. Works for transactional apps where per-use pricing is cleaner than subscription. Shopify handles the billing surface; we handle the credit ledger and expiry rules.
The billing model is the hardest thing to change post-launch. We scope the model with you in week one of every public app build.
Peak-load is not a future problem. A Plus merchant hitting 10,000 orders per hour on Black Friday will surface every weakness in your webhook handler, your rate-limit strategy, and your database. Here is what we engineer into every app destined for a Plus merchant before November.
Webhooks go through a persistent queue (SQS, Redis Streams, or equivalent) with idempotency keys. 200 OK returns in under 500ms; actual processing is deferred. Shopify retries for 48 hours and we reconcile anything that slipped.
GraphQL calls planned around cost-based rate limits. Bulk operations for catalog-wide reads. Exponential backoff with jitter on 429s. Load-tested at 3× forecasted peak before November.
Connection pooling sized for peak. Read replicas for every merchant-facing query. Indexed on the columns BFCM actually hits (shop ID, order ID, customer ID). No N+1s that only show up at scale.
k6 load test at 3× forecasted peak, two weeks before BFCM. Code freeze 14 days before Black Friday. On-call rotation from Black Friday through Cyber Monday. A small dashboard that tells us what broke before a merchant opens a support ticket.
A Shopify app is effectively a custodian of a merchant's customer, order, and PII data. Our security baseline covers the requirements Shopify's review will test, the requirements a Plus merchant's procurement team will test, and the requirements a Plus merchant's legal team will test. Three overlapping but distinct checklists.
A short field note from three app engagements shipped in the last 18 months: one private custom app, one public App Store app, one Plus Shopify Function. Numbers are real, brands named with permission.
Beauty merchant needed one place to manage INCI ingredient data across 200 products and propagate it into metafields for every regional storefront. Built a private admin app with Polaris + App Bridge 4, Admin GraphQL for metafield writes, and a webhook subscription to products/update that kept the admin view in sync with merchandising changes. No App Store involvement.
Shipped a public App Store app for editorial theme blocks on Shopify's Remix template. Mandatory compliance webhooks, Billing API with flat $19 and $49 tiers, theme app extensions for the storefront blocks, Polaris admin for configuration. Cleared App Store review on first submission after running the App Store Gate pass. Now used by 400+ merchants across the US, UK, and AU.
Plus merchant needed tiered shipping rules that Shopify's native rate rules could not express (cart value × weight × region tier × member status). Replaced a webhook-based delivery app with a Rust Shopify Function that runs inside Shopify's checkout servers. Checkout latency dropped, a $2,400/month app fee disappeared, and the shipping logic now survives every Shopify checkout upgrade automatically.
An app built against the wrong brief ships something neither side wanted. Here is the honest filter we run on every intro call before a scoped quote leaves our inbox.
You own the Partner account, the GitHub repo, the Billing API revenue, and every component, API route, database schema, and design asset. On day one and on exit. 30-day support tail at close, no proprietary tech to lose access to, no ongoing licensing. The app is yours, always.
Pick the shape that matches the moment. We confirm fit on the intro call and send a scoped quote within 48 hours. Scope moves the price, not the conversation.
API surface map, rate-limit model, data contract, billing model selection, mandatory webhook plan, App Store listing plan, build-or-buy recommendation. Refundable against any build that follows.
Single-merchant or custom-distribution app. Admin UI, Admin GraphQL, webhooks, optional billing. No App Store review. Internal handoff kit, Partner dashboard transfer at close.
Full Remix-template build, mandatory compliance webhooks, Billing API, App Bridge 4, Polaris UI, theme app extensions if needed, App Store Gate submission pass, listing assets, and the launch.
Plus-only engagement. Checkout UI Extensions, Shopify Functions in Rust or JS, validation rules, custom discount and delivery logic. Replaces checkout.liquid customizations cleanly.
Quotes sent within 48 hours of an intro call. No proprietary tooling, no licensing fees, no code held hostage on exit.
Shopify app development is the practice of building software that extends the Shopify platform through one of five official surfaces: the admin (merchant-facing pages), the online store (theme app extensions and app blocks), checkout (Checkout UI Extensions), Shopify Functions (discount, delivery, and payment logic that runs inside Shopify), and webhooks (event-driven integrations with your own infrastructure). An app can be public (listed on the Shopify App Store), custom (distributed privately to named merchants), or private (installed on a single store).
A private app is right when one specific merchant needs a bespoke tool and distribution is not a concern. A custom app is right when a small handful of named merchants need the same extension and you want to skip App Store review while retaining Shopify's install and auth infrastructure. A public app is right when the intent is to reach the Shopify App Store, build a SaaS business around the extension, and monetize through the Billing API. The three paths share most of the engineering but have very different scoping, billing, and go-to-market contracts.
Price is scoped to the shape of the engagement rather than a fixed rate card. Private custom apps typically run 6 to 10 weeks. Public App Store MVPs including submission typically run 10 to 16 weeks. Plus checkout extensions or Shopify Functions typically run 4 to 8 weeks standalone. The App Discovery and Scoping engagement runs 2 weeks and is refundable against any build that follows. We send a scoped quote within 48 hours of a 30-minute call; scope moves the price, not the conversation.
Shopify's stated review window is 5 to 10 business days for a first submission; in practice it runs 7 to 14 business days including back-and-forth. Our first-pass approval rate on public apps we have submitted is above 80%. We pass on the first attempt when we run the App Store Gate, a six-point pre-submission checklist that catches the rejection reasons we see most often: missing compliance webhooks, over-scoped OAuth, App Bridge 4 gaps, incorrect billing handling, performance failures, and listing-asset misses.
We default to Shopify's Remix template for new public apps, Node with TypeScript for private and custom apps, and Rust or JavaScript for Shopify Functions. UI is Polaris with App Bridge 4 for admin surfaces and the Checkout UI Extensions API for checkout. Data access is the Admin GraphQL API in nearly every case; REST only for the narrow endpoints that have not moved to GraphQL. We hold against a hosting stack of Oxygen, Fly.io, Vercel, or Railway depending on the app's latency and webhook-volume profile.
Yes, and it is one of our most-requested Plus engagements. Shopify has set a hard deprecation deadline for checkout.liquid customizations; every Plus merchant running script-tag or liquid-based checkout modifications needs them rebuilt as Checkout UI Extensions and, where logic-heavy, Shopify Functions. We scope the migration against the existing customization surface in week one, build the extensions against the Checkout Extensibility sandbox in weeks two through four, and ship behind a feature flag before the deprecation cutoff. Typical timeline is 4 to 8 weeks.
Every public app we ship wires the three mandatory compliance webhooks on day one: customers/data_request, customers/redact, and shop/redact. Each handler verifies the HMAC signature, responds within 5 seconds with 200 OK, and writes an audit record with the customer ID or shop ID, the request timestamp, and the resulting action taken. Missing or silent compliance webhooks is the single most common App Store rejection and the one that costs the most days on resubmission; we treat it as a launch gate, not a launch task.
Yes, with two architectural notes. Traditional theme app extensions do not render in a Hydrogen storefront; the equivalent is a React component in the Hydrogen codebase that consumes your app's Storefront API or a custom API. The Customer Account API gives app-installed personalization that works across Liquid and Hydrogen storefronts. Admin-side extensions and Shopify Functions are identical across Liquid and headless; only the storefront rendering path changes.
You do. The app lives in a private GitHub repository under your organization, the Shopify Partner Dashboard sits under your account, the Billing API revenue flows to you, and every Figma file, component, and database schema is yours. On exit we transfer Partner ownership, hand over a written component library and deployment runbook, record a Loom walkthrough, and leave a 30-day support tail for questions. We do not gate access to force retention; if we are the right partner, you renew because the work is good, not because the code is hostage.
30 minutes to map the surfaces your app needs, the distribution path that fits, and the billing model that will hold. We follow up with a scoped quote within 48 hours.