What “Shopify development agency” actually covers
The phrase spans four different engagements, and pricing logic differs by which one you’re buying.
A custom theme build modifies or replaces Shopify’s Liquid templates and sections — the visual and interactive layer a customer sees. A custom app is bespoke logic running on Shopify’s Admin or Storefront API, built when no existing app in the Shopify App Store does what you need. Third-party integrations connect Shopify to tools you already run — Klaviyo, Recharge, an ERP, a 3PL — mapping data between systems that were never designed to talk to each other. A headless build replaces the storefront entirely with a custom frontend (commonly React or Next.js) that pulls data through Shopify’s Storefront API while checkout stays on Shopify’s own infrastructure.
The four engagement types are not interchangeable, and a proposal that doesn’t name which one you are buying is the first sign to slow down. A theme build and a headless build solve different problems at different costs — see our headless ecommerce guide for when the second is worth the extra engineering surface.
Why the published price is a bid, not a budget
Three pricing models cover almost every Shopify development quote, and each shifts risk to a different party.
Fixed fee sets one price against a defined statement of work. It gives you budget certainty, but only for exactly what’s written down. Anything outside that scope becomes a change order, billed separately, at a rate that should already be stated in the contract rather than negotiated after the fact.
Time and materials bills actual hours against an estimate. It moves with real complexity, which protects you from an agency underbidding to win the work, but the estimate is not a ceiling. Ask what triggers a check-in if hours run past the estimate, not just what the estimate was.
Retainer buys a fixed block of hours per month, usually for ongoing work rather than a single build: the model most maintenance and iterative-feature relationships use once the initial project is live.
None of the three tells you the total cost of the engagement on its own. That number depends on what the quote excludes, which is where most of the gap between the number you agreed to and the number you eventually pay lives.
The hidden line items the quote leaves out
A Shopify development quote is written to win the bid, not to disclose every cost you’ll carry. The following six are the ones that most often surface after signature rather than before it.
QA and cross-device testing
Development and QA are different activities billed at different rates, and a quote that folds QA into “development” with no named hours usually means testing happens informally, by the same developer who wrote the code, on whatever device is on their desk. Ask for a QA line item naming the browser and device matrix: desktop Safari, mobile Chrome, at minimum, and whether checkout is tested end to end with a live test transaction, not just visually reviewed.
App licence fees
The agency’s fee covers configuring or connecting an app; it almost never covers the app’s own subscription. Recharge, Klaviyo, a review app, a bundling app: each bills you directly on its own pricing page, continuing whether or not the agency that installed it is still engaged. A quote that lists “Recharge integration: $X” without a separate line for Recharge’s own subscription cost is describing the build, not the total.
Post-launch maintenance
A build contract typically ends at launch acceptance. What happens after: Shopify API version deprecations, a theme update that conflicts with a custom section, a bug only real traffic surfaces. These are usually a separate relationship, priced separately, and not automatically included just because the same agency built the original theme. Confirm whether maintenance is a retainer, a support-ticket rate, or simply undefined until something breaks.
Handover and documentation
If the relationship ends (the agency’s choice or yours), what do you actually receive? Repository access with commit history, environment variable and API key documentation, a list of every app installed and how it’s configured, theme architecture notes explaining what each custom section does. A handover clause that isn’t written into the contract usually means a login and a goodbye email, not a package your next developer can work from.
Change requests
Requirements shift once a merchandising team sees the build in a staging environment. A new section type, an added filter, a design tweak that seemed small. Under a fixed-fee contract, each of these is a change order; the protection you need isn’t avoiding change requests, it’s a contract that states the change-order rate up front so the number isn’t negotiated after the work is already done.
Migration and data cleansing
If the engagement includes moving from another platform or a prior Shopify theme, data cleansing — deduplicating customer records, mapping legacy SKUs, validating historical order data — is frequently underscoped because it’s invisible until someone actually opens the export file. A quote that treats migration as a flat line item with no discovery phase is guessing at a number before anyone has looked at the data.
What the total cost actually looks like
Here is an illustrative breakdown of where a Shopify development engagement’s true cost tends to sit relative to the headline quote: hypothetical, not a real client engagement, and not a benchmark to price against.
| Line item | Typically in the headline quote? | Who usually pays it |
|---|---|---|
| Theme, app or integration build | Yes | Agency fee |
| Project management and milestones | Usually | Agency fee |
| QA and cross-device testing | Sometimes, often unstated | Agency fee if named; otherwise absorbed into build hours |
| Third-party app licences (Klaviyo, Recharge, etc.) | No | You, directly to the vendor |
| Staging or development environment costs | Rarely stated | Varies — ask explicitly |
| Post-launch maintenance | No — separate contract | You, on a new agreement |
| Handover documentation | Rarely stated | Included only if contracted |
| Change orders | No — by design | You, at the change-order rate |
The pattern to take from this table: the agency fee reliably covers the build itself. Everything that continues after the build (licences, maintenance, the app subscriptions the integration depends on) sits outside it by default, and a proposal’s silence on a row is not confirmation that row is included.
How to judge a proposal before you sign it
Five checks catch most of what goes wrong later.
Who owns the code at completion. IP assignment to you on final payment is standard for a custom build; a licence-to-use clause that leaves ownership with the agency is not, and it means you cannot take the theme or app to another developer if the relationship ends.
What counts as a change order. The statement of work should name what’s included precisely enough that anything outside it is obviously a change, and the change-order rate should be in the contract, not negotiated later.
What QA process runs before launch. A named device matrix and a live checkout test, not “we test as we go.”
What happens if a milestone slips. Ask this before it happens, not after. A fixed-fee contract with no clause covering a missed date leaves you with no lever beyond withholding final payment.
What the maintenance relationship looks like. Whether it’s a retainer, a ticket rate, or genuinely undefined until something breaks. Undefined is an answer, just not one you want to discover during an outage.
A proposal that answers all five without prompting is unusual. Most answer none of them unless you ask directly.
Freelancer, agency or in-house: when each wins
A freelancer usually costs less on the invoice for a single, well-scoped build. The trade-off shows up in continuity: no bench to cover illness or a missed deadline, no formal QA step distinct from the person who wrote the code, and no plan if they stop taking freelance work. That is a risk you’re carrying even if it’s never priced into the quote.
An agency costs more per hour but spreads risk across a team. It has a second developer to review code, a project manager to hold the timeline, a QA process distinct from development. It’s the better fit for a build with real complexity (a headless migration, a custom app touching inventory) or a timeline you can’t afford to slip.
In-house wins once the volume of ongoing Shopify work — seasonal campaigns, new sections, integration fixes — exceeds what a retainer covers in monthly hours. A salaried developer’s fixed cost starts beating metered agency time at that point, and you gain someone who carries context across projects instead of being re-briefed on each one. The crossover point is specific to your ticket volume; the way to find it is to total actual retainer hours billed over two or three quarters and compare that run rate to a loaded salary, not to guess from a single month.
If your team is at $3M–$30M in revenue on Shopify Plus or a comparable paid subscription platform, this decision usually lands on agency-for-build, in-house-or-retainer-for-run. See what Pointerflow builds for scaling brands for how that split plays out operationally, and our Shopify Plus agency guide for how that engagement model differs from a general development shop.
When it stops being worth it
A development engagement stops paying for itself in three recognisable situations. First, when the ongoing change-order volume on a fixed-fee contract starts approaching the size of the original build. At that point you’re effectively paying agency rates for what should be a maintenance relationship, and it’s worth renegotiating the structure rather than the scope. Second, when handover was never contracted and the relationship sours. You’re now paying to rebuild institutional knowledge that should have been documented from the start. Third, when the build was scoped around a headless architecture that’s outgrown its original justification. The frontend complexity is now costing more in maintenance than the theme build it replaced would have, and nobody has re-run that comparison since launch.
These three failure modes are rarely visible from a single quote. They surface from tracking actual spend against the engagement over two or three quarters, which is in practice a repeatable operational check rather than a one-time judgement call, and the kind of recurring monitoring that’s straightforward to automate rather than re-derive by hand each quarter. That’s the shape of problem our AI agents and automation service is built for: agreements, licence renewals and change-order totals tracked against budget automatically, flagging drift before it’s three quarters of invoices deep, not a plausible-sounding annual estimate.
Sources
No external figures are quoted in this article. It is written from the standard structure of Shopify development engagement contracts — fixed-fee, time-and-materials and retainer models, IP assignment clauses, and the change-order mechanics common to custom theme, app and integration work — and from Pointerflow’s first-hand delivery experience building and running Shopify, Klaviyo and Recharge integrations, including n8n automations hosted on a client’s own VPS with unlimited executions.