The order lands
Checkout completes and Shopify fires its orders/create webhook. The flow starts from that payload, so it runs on the order itself rather than a job that sweeps the store every few minutes and hopes.
Trigger · orders/create webhook
( /shopify-development )
Shopify development
Carrtel Solutions is a Shopify Partner. We build stores on Shopify.
Shopify retires things on a schedule and publishes the dates in advance. A store with no in-house developer finds out when something breaks instead, because those dates are published in a developer changelog nobody on the merchant's side is reading. We build stores, apps and integrations, and we track that calendar as part of the work.
Carrtel Solutions is a Shopify Partner. We build stores on Shopify and the order-and-tracking plumbing behind them: a store build on a Liquid theme starts at $4,900 and covers 40 hours of build — one paid theme, up to 8 templates, up to 200 products imported — a migration onto Shopify is that build plus a $2,600 add-on for the data job, so $7,500 for a full replatform, and the Order-Ops Build between Shopify and an ERP, 3PL or accounting system starts at $3,900. Theme customisation, Online Store 2.0 sections and custom single-store apps are scoped per engagement. Hydrogen and headless we assess and maintain; we do not build new ones for small merchants. Every project carries a 30-day bug warranty, and ongoing work is $299/mo or $1,290/mo.
Last updated: August 2026
Six things. Three of them come with a published price and the scope that goes with it. One of them is a capability we will actively talk you out of buying.
From $4,900 · 40 hours
A working storefront on a Liquid theme, structured the Online Store 2.0 way: JSON templates, sections on every template, and settings your merchandising team can move without opening a ticket. One paid theme, up to 8 templates, up to 200 products imported, standard payments and shipping, two revision rounds, and a 30-day bug warranty on what we delivered.
How we do it
We start from a well-maintained theme rather than a blank file. A theme with an active vendor gets updates when the platform moves; a bespoke theme written from nothing gets updates when you pay for them. Where the theme cannot do the thing, we write the section, and we write it with a schema so the next change is a settings change.
See the full price listScoped per engagement
The work of turning a purchased theme into your store: custom sections and blocks, template-level layouts, metafield-driven content, and merchandising controls that do not require a developer to use.
How we do it
The rule we hold to is that content belongs in settings and metafields, not in markup. A section with a schema can be rearranged, duplicated and re-themed by the person who owns the storefront. A hardcoded block can only be changed by someone who can read Liquid, which means every seasonal change becomes an invoice.
Scoped per engagement
A custom app installed on your store — not a public App Store listing. Admin API access with named scopes, webhook subscriptions, background jobs, and an admin surface where one is genuinely needed.
How we do it
Every app we write pins its API version in exactly one place and carries a note about when that version ages out. Every scope is named to the feature that needs it, so the access list is auditable by someone who is not a developer. If a public app already does the job, we will tell you to buy it instead.
Assessment and maintenance only
We assess an existing headless storefront and we maintain one. We do not sell greenfield headless rebuilds to small merchants, and the reason is arithmetic rather than taste.
How we do it
Hydrogen is Shopify’s React framework for custom storefronts, built on React Router 7 and deployed to Oxygen. It is a real tool with a real audience. That audience is not a store doing $80,000 a month with no in-house developer.
Why we say no, in fullPlus $2,600 on a build
Moving a live store onto Shopify from WooCommerce, Magento, BigCommerce, Wix or Squarespace. It is a line item on a build rather than a product of its own — up to 20 hours, up to 5,000 products and 10,000 historical orders, a full 301 redirect map, and a data-integrity reconciliation at the end that you can read. A full replatform is $7,500.
How we do it
The part that goes wrong in migrations is never the products. It is the URLs, the historical orders, the customer records with no password to carry over, and the analytics baseline that resets to zero on cutover day and takes your ability to compare anything with it.
How a migration runsFrom $3,900
The Order-Ops Build: the plumbing between Shopify and your ERP, 3PL or accounting system. Idempotent ingestion keyed on order id, a reconciliation ledger, and an exception queue that someone actually watches.
How we do it
Webhook delivery is at-least-once and unordered. A receiver that answers 200 and then throws internally loses the order in silence, and neither side has any way to notice an absence. Integrations that survive are the ones built on that assumption from the first line.
What the bridge coversThe dates are public. The failure is not that the platform surprises anyone, it is that the announcement lands in a developer changelog and your store does not have a developer.
A store is a stack of dependencies with expiry dates on them, and almost none of those dates live anywhere the owner can see. An API version your middleware is pinned to. A tag pasted into a settings box that is being retired. An app that injects a script into a surface the platform is moving away from. Each one is fine until the day it is not, and each one was announced months ahead in a place built for developers.
None of this is a criticism of Shopify. A platform that never deprecates anything is a platform that stops improving. The obligation the schedule creates is real, though, and somebody has to carry it.
( 06 )
Retired
Replaced by Checkout UI extensions, Shopify Functions, and web pixels
This one was never yours — checkout.liquid was a Shopify Plus file, and the stores this page is written for are on Basic, Grow or Advanced. We list it because it is the cleanest worked example of what a platform retirement is: an entire customisation surface, announced with a date, removed on that date, and replaced by something a different shape rather than a drop-in.
Retired in the same move
Replaced by Customer events and web pixels, sandboxed, subscribing to a defined event stream
This is the one that did apply to your plan. If a conversion tag, an affiliate postback or a post-purchase survey was pasted into that box, it was running on the single page that fires once per completed order. A sandboxed pixel cannot reach the page and cannot make arbitrary calls, so a tag that worked by touching the DOM does not move across. It has to be rebuilt, and until it is, that measurement is simply gone.
Being displaced
Replaced by Theme app extensions and app blocks
A script tag is invisible in the theme editor and outlives the app that created it. An app block is a thing the merchant can see, move and delete. The direction of travel is away from code an app injects behind your back and toward code you can point at, and anything still relying on the old shape is on borrowed time.
Replaced
Replaced by Custom apps with access tokens and named access scopes
Credentials issued under an old scheme stop being issued first and stop working later, which is a long gap in which nothing appears to be wrong. An integration a contractor wrote three years ago authenticates with whatever was normal three years ago, and nobody has opened it since the week it shipped.
On a fixed schedule, permanently
Replaced by A new version each quarter, each supported for a minimum of twelve months — per Shopify’s API versioning documentation
This is the deprecation that never ends. Your app or middleware is pinned to a version, that version ages out, and a field you depend on is renamed, restructured or removed in the version you are forced onto. Nothing on the store warns you. The call starts returning something slightly different, or stops returning.
Superseded
Replaced by Online Store 2.0: JSON templates, sections everywhere, app blocks, metafield definitions
A vintage theme still works, which is exactly why so many are still running. It also cannot accept an app block, so every app added since gets pasted in by hand. That is how a theme accumulates a hundred lines nobody can attribute to anything, and why a theme update becomes a project instead of a button.
Not with an alert. Deprecations rarely produce a crash, because the replacement behaviour is usually valid behaviour. Three shapes are worth knowing, because each one goes wrong quietly in a different way.
Conversions in an ad platform drop and stay down. It looks like a soft month, so it is discussed as a soft month. The optimiser, meanwhile, treats the smaller number as true and bids away from audiences that are no longer being measured. By the time anyone checks the tag, the account has been learning from a partial signal for weeks.
A discount, a shipping rate or a validation was keyed on something the platform now supplies differently, or no longer supplies. The rule still runs. It matches nothing, returns no operation, and that is a valid result. Checkout completes without it, which means nothing errors and nothing alerts.
The integration starts returning a version error on a field that moved. Retries run, then stop. Shopify is fine, the storefront is fine, and only the receiving system is short — and a receiving system has no way to know what it never received. Support absorbs the difference one ticket at a time.
Tracking the calendar is not clever. It is clerical, and being clerical about it is the entire trick.
At handover you get a list: every API version anything of yours is pinned to, every app that injects code into your theme or checkout, every metafield namespace a rule depends on, and every credential and the scheme it was issued under. One page. It is the document that makes the next change a task instead of an investigation.
When we pin an API version we write down the quarter it ages out, and that date goes in a calendar rather than in someone’s head. Shopify publishes its changelog and its version support window in the open. The information has never been the hard part; noticing it on a Tuesday in month fourteen is.
Doing the upgrade is ordinary work. Remembering to do it, forever, is the part that fails. The quarterly API-version upgrade is included in Care Plan — Operate at $1,290/month, along with the middleware itself. If you would rather own it in-house, take the inventory and do exactly that — it is yours either way.
One thing worth saying plainly: none of this locks you in. The inventory, the runbook and the code are yours at handover whether you keep us or not. A retainer should be something you renew because it is doing work, not because leaving is expensive.
None of these cost more on the day. They cost less in month fourteen, which is the only place the difference shows up.
What it prevents
A version string scattered through fourteen files means an upgrade is a search-and-hope exercise, and the one occurrence you miss is the one that fails in production four months later.
What it prevents
A pasted snippet survives uninstalling the app it belongs to. Orphaned code either double-fires an event — which inflates your conversions and reads as good news — or throws and takes down every tag queued behind it.
What it prevents
Functions and extensions bind to a declared input query against specific metafields and owner types. Rename a namespace in a bulk edit and the function receives null where it expected a value, then correctly does nothing.
What it prevents
Delivery is at-least-once and unordered. Without idempotency a retry writes the order twice; without a delivery record nobody can ever answer the question of what did not arrive, because an absence leaves no trace to count.
What it prevents
Edits typed straight into the code editor at 6pm are unattributable by the following month. When a tag stops firing, the first question is what changed and when, and a theme with no history cannot answer it.
What it prevents
A scope list nobody can explain is a scope list nobody will ever reduce. Naming each one to a purpose means access can be reviewed, narrowed and revoked by someone who does not write code.
What it prevents
It is faster on the day and it is a rebuild inside a year. If the only way to hit a deadline is to build on something with a retirement date, we say so in writing before you decide, rather than after.
If a store you already own does none of these, that is not an argument for rebuilding it. It is an argument for reading it first. The free Store Scan does that from the outside, and fixing the first named thing it turns up is the $690 Fix Sprint. Where the whole money path needs reading, that is tracking and checkout integrity.
This is the shape of the connection we build: what leaves Shopify, what comes back, and which system is allowed to be right. Every lane runs both ways — that is exactly why they drift.
The ERP usually already owns stock and pricing. Before any code is written we write down which side is authoritative for each field — a two-way sync without that answer is a loop.
The pick happens in a warehouse. Shopify only learns about it if something tells it, and a status that never came back is the same to a customer as a parcel that never shipped.
Refunds and adjustments are where the three systems most often stop agreeing, because each one applies them on its own clock. They get reconciled rather than assumed.
Source
GraphQL + webhook events
Enterprise resource planning
The ERP usually already owns stock and pricing. Before any code is written we write down which side is authoritative for each field — a two-way sync without that answer is a loop.
Warehouse and fulfilment provider
The pick happens in a warehouse. Shopify only learns about it if something tells it, and a status that never came back is the same to a customer as a parcel that never shipped.
Ledger, invoicing and payouts
Refunds and adjustments are where the three systems most often stop agreeing, because each one applies them on its own clock. They get reconciled rather than assumed.
What we build into every lane
Shopify re-sends a webhook it never got a success response for. Handled once, keyed on the event, so a retry cannot create a second fulfilment.
Every message is logged on arrival. When one never showed up, it gets re-sent from the log instead of rebuilt by hand from a spreadsheet.
Both sides of each lane are compared on a schedule. Disagreements land in an exception queue with the record attached, rather than surfacing later as an oversell.
Shopify retires Admin API versions on a published schedule. The integration is moved to the next version before the one it runs on goes away.
This describes how we build the connection, not something a merchant has already measured — we have no case studies yet. The full order-operations scope
This is the shape of a build, not a case study. An order arrives, the stock is checked where the stock actually is, and the customer hears about it before they think to ask.
Checkout completes and Shopify fires its orders/create webhook. The flow starts from that payload, so it runs on the order itself rather than a job that sweeps the store every few minutes and hopes.
Trigger · orders/create webhook
Each line item is matched to the 3PL’s own SKU — warehouse codes almost never match Shopify’s handle — and read against live stock, so the answer comes from the shelf and not from the store’s cached quantity.
Check · line items vs 3PL stock
One clean pick and it continues. Short stock, or a split across two warehouses, and it holds the message and raises the order for a person — the step that keeps automation from confidently promising a date nobody can keep.
Decide · continue or hand to a human
Twilio sends one plain message with what is shipping and when it leaves. This is the step that already runs live on our own system today — text only, no voice call.
Send · Twilio SMS
Honest about what exists: the Twilio message in step four is built and running on our own system today. The Shopify and warehouse steps are built per store, against the APIs your platform and your 3PL already expose — which is why we look at both before quoting the work. No merchant results are claimed here, because we have none to claim yet.
Hydrogen is Shopify's React framework for custom storefronts, built on React Router 7 and deployed to Oxygen. It is a serious tool with a real audience. That audience is a store with an in-house frontend team and enough traffic that a fraction of a percent of conversion pays for one.
Our rule of thumb, not an industry statistic
Below roughly $5M USD a year in revenue, the payback on a greenfield headless build does not work. The build costs a multiple of a Liquid build, and the ongoing obligation it creates does not go away afterwards. This is our own threshold, applied to our own work. Treat it as a judgement, not a finding.
Going headless does not remove work. It moves work off Shopify's roadmap and onto your payroll. Everything the platform was doing for free in the background becomes something you own, budget for and staff. Checkout stays Shopify's either way, so the part of the funnel that decides whether an order happens is not the part you gained control of.
What you take on
What you genuinely gain
What we do take
You inherited a headless storefront, or you are being sold one. We read it: what it is pinned to, what it would cost to keep current, what breaks at the next quarterly version, and whether moving back to a Liquid theme would serve you better. Sometimes the answer is to retire it, and we will say so.
If it is worth keeping, we keep it current: dependency and framework upkeep, the Storefront API surface it depends on, the deploy path, and the same quarterly version discipline we apply to everything else.
If you are a store doing $80,000 a month and someone has quoted you a headless rebuild, get a second opinion. It does not have to be ours.
These are apps our scanner fingerprints from what your storefront serves publicly. Detection is not an integration — it is how the scan tells you what you are running before anybody quotes you anything.
Detected by the free scan
Our scanner reads what your storefront already serves publicly and names the apps it finds. Detection is not an integration — it is how the scan tells you what your store is running.
43 app signatures in total, including analytics tags, page builders, subscriptions, loyalty and buy-now-pay-later.
Nothing in this strip is an integration claim, and no vendor here is a partner of ours. If an app you depend on is not on the list, the scan still reads the storefront around it and reports what it could not see.
All prices in Canadian dollars. Flat-scope items are a flat price; the rest publish a starting point and the scope it buys. Anything outside that scope is quoted at $120/hour and approved in writing before it starts.
About 90 seconds
Self-serve, no signup, no app install. Reads your public storefront and reports what is visible from the outside.
5 business days
One named problem, up to 5 hours, one revision round. The paid entry point is work rather than a document.
7 business days
The bigger remediation job: event wiring, orphaned scripts, checkout-side behaviour, webhook delivery.
40 hours of build
One paid theme, up to 8 templates, up to 200 products imported, standard payments and shipping, two revision rounds.
Up to 20 hours
A line item on a build, not a product: up to 5,000 products and 10,000 historical orders, including URL redirects. Build plus migration is $7,500.
Scoped per integration
Shopify to your ERP, 3PL or accounting system: idempotent ingestion, reconciliation ledger, exception queue.
Ongoing
Daily money-path checks, a weekly reconciliation receipt, an exception queue, and 2 hours of work each month. Hours do not roll over; extra hours are $120. Cancel any time with 30 days notice, no cancellation fee.
Ongoing
Everything in Watch, plus maintained middleware, the quarterly API-version upgrade, and 8 hours of work each month. Same 30 days notice, no cancellation fee.
The Store Scan is free, self-serve, and does not sit behind an email. The paid entry point is work rather than a document: the $690 Fix Sprint, one named problem, up to 5 hours, 5 business days.
We run a maximum of three concurrent projects. That limit is the reason a delivery date means anything.
Change orders and work beyond a published scope are $120/hour, scoped and approved in writing before anyone starts. If a flat-scope job is going to run long, we tell you before hour 6. We never send a surprise invoice.
40 hours of build. One paid theme, up to 8 templates, up to 200 products. Most builds land between $4,900 and $7,700. The right-hand column is the one worth reading twice.
Included
Not included
( 04 steps )
We look at the store, the apps, the theme and whatever sits downstream of an order. You get a fixed scope with a fixed price and a named delivery date, or you get told this is not work we should take.
Anything that touches tracking, checkout behaviour or order flow starts with the free Store Scan, because tuning anything to a store we have not read is decoration. The first paid step after it is work rather than a document: the $690 Fix Sprint covers one named problem and up to 5 hours, delivered in 5 business days with one revision round.
Weekly, you see what moved and what is left. Change requests are quoted before they are started, never absorbed quietly and never invoiced as a surprise. Overage and change orders are $120/hour.
You get the code, the inventory of dated surfaces, the scope list and the runbook. You can take that in-house, hand it to another developer, or keep us on a retainer. Nothing we build requires us to keep existing.
The questions worth asking us
30-day bug warranty
Defects in work we delivered are fixed at no charge for 30 days after delivery.
25% credit on a missed date
If we miss an agreed delivery date, you get a 25% credit toward the next engagement. A credit, not a cash refund.
Three projects at a time
We run a maximum of three concurrent projects. That limit is why the dates are meetable in the first place.
Exclusions
The warranty and the credit do not cover defects inside third-party apps, delays on your side (access, approvals, content, decisions), or platform incidents. None of those are ours to control, so we do not price as though they are.
( Fit )
A good fit
Not a fit
On that last one: we would rather lose the deal than borrow someone else's results. Here is what you can verify about us instead.
( 11 )
Estimate, not a promise
Put your figures in and the arithmetic is printed underneath, one line at a time, with every rate we assumed shown as a control you can move. If you think an assumption is wrong, change it — the estimate is yours, not ours.
Nothing is sent anywhere. This runs in your browser and we never see what you type.
Your revenue on a typical order, before shipping and tax.
Visits, not visitors — the sessions figure in your analytics.
Emails, chats and DMs a person currently has to answer.
Estimated — from your inputs
Revenue recovered
$717
per month — about 9.0 orders
Support hours saved
12.0
hours per month — about 120 messages
These are two different kinds of number, so we do not add them together into a single headline figure. Both are estimates produced by the arithmetic below from the figures you entered — not a result any store has reported to us.
Abandoned checkout recovery
Support message deflection
We have set each of these at or below the published industry averages we could find, because an estimate you can disprove in thirty seconds is worth less than a modest one you can believe. Disagree with any of them and move it — the numbers above follow.
Published storefront conversion averages sit in the low single digits; reaching checkout is a little more common than completing. Your own analytics will beat this guess — use it.
Published industry averages cluster around seventy percent. We start at the bottom of that band rather than the top.
Only the shoppers who left a phone number and agreed to be contacted. This is a consent limit, not a traffic limit, which is why it is a small fraction.
Set below the recovery rates commonly published for email cart flows, because a call reaches far fewer people than a send-all email does.
The repetitive ones: where is my order, what is the return policy, does this ship to me. Helpdesk vendors advertise higher; we do not.
Reading, looking the order up, writing back, and the switch of attention either side of it.
When a shopper leaves a checkout having given you a phone number and agreed to be contacted, the assistant follows up in their own words — answers the question that stopped them, shipping cost, delivery date, sizing, returns — and sends them back to a live checkout link. The support side answers the repetitive messages from the same order data, and hands anything it should not be answering to a person.
Contact is limited to shoppers who consented to it, which is exactly why the contactable share above is a fraction rather than everyone who abandoned.
Start at the free end
The Store Integrity Scan reads your public storefront in about 90 seconds, with no signup and no app install. It will not tell you everything. It will tell you whether the theme is carrying scripts from apps you no longer have, and that is usually enough to know which conversation to have next.
Two ways in
Store Integrity Scan
Free, self-serve, no signup and no app install. About 90 seconds.
Or email support@carrtelsolutions.com