Pre-paid hours, visible.
A shared Linear board and a monthly CSV shows every ticket, every estimate, every logged hour. No black box.
A senior Shopify and Shopify Plus retainer for in-life work. Unused hours roll over. Tiered SLAs attached to the invoice. No twelve-month lock-in, no proprietary ticketing moat, no hours-hostage on exit.
Most Shopify agencies sell a retainer the way banks sell a mortgage. Twelve-month term, opaque scope, a monthly retainer fee that buys “priority.” A retainer should be simpler than that. Pre-paid hours, visible in a shared ledger, spent against tickets you approve, rolled over when you do not use them, cancellable in 30 days. That is the whole contract. Every ticket lives in Linear, every change ships through Shopify CLI and Theme Check, every week gets a Loom. Everything else on this page is how we make those four sentences real.
A shared Linear board and a monthly CSV shows every ticket, every estimate, every logged hour. No black box.
Up to 50% of the block carries into the next month. Nothing expires instantly; nothing hoards forever.
No twelve-month term, no exit fee, no proprietary tool you lose access to. Cancel in 30 days, for any reason.
Four priority levels (P1 through P4), four response times, reported monthly. See the SLA table below.
Most “shopify retainer versus hourly” decisions are solved by looking at one thing: is the work bounded or unbounded? Bounded work wants a project. Unbounded small work wants a retainer. A single ad hoc ticket wants pure hourly and a higher rate. Here is the honest comparison.
| Pure hourly | Monthly retainer | Fixed project | |
|---|---|---|---|
| cost certainty | lowest — billed as used | fixed monthly, predictable | fixed total, scoped up front |
| rate per hour | highest per hour | lower, blended across roles | quoted against scope, not hours |
| SLA | none by default | P1 through P4, in contract | project deadline only |
| team continuity | whoever is free that day | named engineer + backup | project pod, ends at launch |
| priority | behind retainer + project | second to P1 incidents only | top priority during term |
| best for | one-off two-hour tickets | steady in-life work, seasonal bursts | theme builds, migrations, app launches |
| wrong for | ongoing weekly work | a bounded project with a deadline | small continuous changes post-launch |
Most Shopify brands past $500K a year run a project plus a retainer, not one or the other. The retainer is the second half of the lifecycle.
Fourteen seconds. A 40-hour retainer month unspooled as a ledger, one ticket at a time. Hours spent on product page speed, checkout QA, a new section, a Klaviyo fix, an accessibility tweak, a CDN sweep — and the 31.25 hours that roll into next month.
The Retainer Operating System is the weekly rhythm every DH Shopify retainer runs. Intake into Linear, triage inside 24 hours, sprint against a weekly theme, Friday demo via Loom, month-end report with SLA adherence. Same five moves, every client, every week. Visible so you can audit it; disciplined so you do not have to.
Every request lands in a shared Linear inbox. Loom videos, Slack Connect messages, email, Figma comments all fold into one queue with a consistent ticket template so nothing gets lost between channels. You see every ticket we see.
Every ticket gets a priority (P1 through P4), an hour estimate, and an owner inside 24 hours. You approve or re-order. No silent work, no half-scoped tickets, no surprises at the end of the month.
Work runs against a weekly theme. Fixes first, then features, then performance. Every change ships through a feature branch, a Theme Check pass, and a staging preview link before it goes live. The last thing to land is the merge to the live theme.
Friday demo. A 15-minute Loom walks through what shipped, what is blocked, what moved in or out of next week. You see progress without having to chase it or sit in a meeting. Watched on your schedule, not ours.
Month-end. Hours spent by ticket, hours spent by priority, rollover into next month, SLA adherence for P1 through P4, and a plain-English summary of what the retainer bought this month. Signed off before the next invoice.
The Operating System is not a sales pitch. It is how the work gets done. Every retainer client sees the same rhythm.
A $500K-a-year Shopify store does not need the same retainer as a $25M Plus merchant. Three blocks, three different team shapes, three different rollover caps. Move up a tier when you overage two months running; move down when your rollover passes 40%.
Hour top-ups available any time in 5-hour increments at the retainer's base rate. Move-up-a-tier applied the same month you go over two consecutive blocks.
Most retainer pages list inclusions and stay quiet on the exclusions. We do both. Knowing what does not fit inside retainer hours prevents the most common failure mode: a big project half-finished against a small monthly block.
Most brands past $500K a year run a project SOW for the out-of-scope work and a retainer for the in-life work. The project team ships the big thing, the retainer team keeps the store healthy while it does. After launch, the retainer absorbs the post-launch fixes and the project team rotates to the next merchant.
Every retainer invoice carries the SLA table. Response is acknowledgement plus an estimate from a real engineer, not an auto-responder. Resolution follows the ticket's hour budget. SLA adherence for P1 through P4 is reported every month; misses are flagged with a root cause in the report, not buried.
| priority | example ticket | response SLA | resolution target |
|---|---|---|---|
| P1 critical | store down, checkout broken, payment failure | 30 min – 1 hr | same day, same engineer until resolved |
| P2 high | revenue-impacting but not store-down | 4 hours | same business day |
| P3 normal | standard feature, section, Liquid change | 1 business day | within weekly sprint |
| P4 low | nice-to-have, cosmetic, low-urgency polish | 3 business days | within 2-week window |
Fig. 3 · P1 SLA on Retainer 50 is 30 minutes; Retainer 10 and Retainer 25 are 1 hour. Response hours are business hours in your timezone.
Response is acknowledgement and an estimate from an engineer. Resolution follows the ticket's hour budget and surface area.
A P1 takes priority over every P2, P3, P4 across every retainer client. Nobody waits behind another merchant's outage.
SLA adherence for P1 through P4 shown in the month-end report. Misses are flagged with root cause, not averaged into a headline number.
A Shopify retainer is a pre-paid monthly block of senior engineering hours used for in-life storefront work rather than a discrete project. Typical retainer work includes new Liquid sections, app integration, Core Web Vitals remediation, accessibility fixes, seasonal campaign pages, Klaviyo and Recharge debugging, and any small-to-mid change that does not warrant a fresh statement of work. Good retainers are hours-based, transparent, and priced the same whether the hours go into a single big ticket or twenty small ones.
US and UK boutique Shopify agency rates for senior engineers cluster between $150 and $250 per hour in 2026, with Shopify Plus specialists at the top of that range. Offshore and freelance rates run $30 to $80 per hour; mid-market Indian agencies, including us, sit around $75 to $125 per hour for senior work. A retainer reduces the effective rate versus pure hourly by blending senior and mid-level time, bundling project management, and amortizing Shopify Partner tooling across many merchants. Posted dollar rates are anchors, not contracts; the scoped quote follows an intro call.
A healthy Shopify store between $250K and $2M a year in revenue usually burns 10 to 25 engineering hours a month on in-life work. $2M to $10M brands trend toward 25 to 50 hours. Shopify Plus brands past $10M often sit above 50. The burn rises around campaign launches, Black Friday, platform updates, and app migrations. If you are hitting a 10-hour retainer ceiling every month, move up a tier. If you are rolling over more than 40% of hours two months in a row, move down.
Yes, up to a cap, for one month. Retainer 10 rolls up to 5 unused hours; Retainer 25 rolls up to 12; Retainer 50 rolls up to 25. Rolled hours expire at the end of the following month, not into perpetuity. The cap exists so the retainer stays a working relationship rather than an hour hoarding account; the rollover exists so a quiet month does not feel like money burned.
Nothing breaks. We flag the ticket that will push you past your block, you approve or defer, and overage hours are billed in 5-hour increments at the retainer's base rate. We never work silent overage. If overage becomes a pattern for two consecutive months, we move you to the next tier where the blended rate is lower.
The agreement is 30-day rolling. You can cancel, pause, or downgrade with 30 days' notice for any reason. There is no twelve-month lock-in, no exit fee, and no proprietary dashboard you lose access to. Rolled-over hours remaining at cancellation are either worked before the close date or refunded at the retainer's base rate, your choice.
Pure hourly fits a one-off question or a single two-hour fix; it is priced higher per hour because it bundles no continuity. A project fits a defined outcome with a deadline, like a theme rebuild or a checkout extension migration. A retainer fits everything in between: steady small-to-mid work, seasonal bursts, app integration, and the kind of changes you want shipped this week without scoping a fresh SOW. Most Shopify brands past $500K a year run a project plus a retainer, not one or the other.
Four priority levels, four response SLAs, published on every invoice. P1 store-down or checkout-broken: 30 minutes to 1 hour depending on the tier. P2 revenue-impacting but not store-down: 4 hours. P3 standard feature work: 1 business day. P4 nice-to-have and cosmetic: 3 business days. Response is acknowledgement plus an estimate; resolution follows the ticket's hour budget. SLA adherence is reported every month.
You do, on day one and on exit. The theme repo is under your GitHub organization. Linear tickets can be exported as CSV on request. Time logs are sent month-end in CSV plus PDF. Slack Connect channel remains yours to archive. We do not hold assets, dashboards, or ticket history to force renewal. If the retainer is the right fit, you will renew because the work is good, not because the code is hostage.
Yes, and sometimes that is the correct answer. A senior Shopify freelancer costs less per hour than an agency retainer but carries three risks: single-person dependency (illness, holidays, churn), no SLA, and no named backup for critical incidents. A retainer costs more per hour but buys redundancy, tiered response time, and a named project manager who sees your queue without you chasing. Stores that run a single external engineer for more than a year usually convert to a retainer after a BFCM outage; the math compounds after the first P1 incident where nobody answered.
A 30-minute call to size the right block for your store. You leave knowing which retainer tier fits, how rollover and SLA will apply to your context, and what the first week of the Operating System would look like. Scoped quote in 48 hours.