Shopify Subscription Fulfillment

Shopify Subscription Fulfillment

Subscription fulfillment that reads your Recharge, Stay AI, Skio, or Awtomic contract status. Pauses, skips, and swaps update inventory holds before billing.

from $1.05
Pick + pack per order
5 days
Sign to first parcel ships
4 PM PT
Same-shift cutoff (Vancouver HQ)
Custom
Quote on everything else

What subscription fulfillment covers

Every major Shopify subscription app, one inventory model.

The subscription app landscape on Shopify consolidated significantly through 2023-2025. Recharge migrated to Shopify Checkout. Stay AI and Skio launched on Subscription Contracts from day one. Awtomic specialized in build-a-box. Shopify shipped its native Subscriptions app. The common thread across all five: every one of them writes to the Shopify Subscription Contracts API.

That matters because the fulfillment-side integration math is identical regardless of which subscription app sits on top. We read the same webhooks (subscription_contracts/activate, /pause, /update, /fail, /cancel) and call the same Subscription Contracts queries to rebuild the per-cycle allocation pool. Switching subscription apps does not require switching 3PLs, and running multiple apps on the same store (a Recharge legacy subscriber base and a Skio new-customer flow, for instance) does not require parallel integrations.

What we add on top: pause-aware inventory holds, dunning-friendly retry logic, first-box kitting, anniversary boxes, and churn-recovery box workflows. Each one runs against the same Subscription Contracts API surface, which means every one of them works against every supported subscription app.

01

Recharge

Most installed Shopify subscription app

The largest Shopify subscription platform by merchant count. Recharge sits on top of the Shopify Subscription Contracts API for new installs (the platform migrated off its own checkout into Shopify Checkout through 2023-2024). We read the same Subscription Contracts webhooks Recharge writes to, which means pause, skip, swap, and cancel events propagate to our allocation pool with no Recharge-specific integration shim.

02

Stay AI

Subscription Contracts API native

Newer entrant focused on subscription analytics and retention experiments. Stay AI lives on Subscription Contracts and adds churn-prediction scoring on top, which feeds into churn-recovery box workflows. We route Stay AI cancelled contracts to the recovery flow with a tagged inventory bucket so the retention team can offer a recovery box as part of the cancel experience.

03

Skio

Subscription Contracts API native

Skio runs on Subscription Contracts with a focus on passwordless management and SMS-first communication. The integration math is identical to Recharge and Stay AI for inventory allocation. Skio brands typically run smaller box counts with higher AOV and benefit most from the first-box custom kitting and anniversary box workflows.

04

Awtomic

Build-a-box subscription specialist

Awtomic focuses on build-a-box and bundle subscriptions, where each subscriber picks the SKU mix per cycle. The cart-attribute model carries the per-cycle SKU selection through to our pick list, so a "this month: SKU-A, SKU-B, SKU-C" subscriber gets a kit built against that month's selection, not last month's.

05

Shopify-native Subscriptions

Built into Shopify, no separate app

Shopify launched a native Subscriptions app in 2023 that runs on Subscription Contracts. The integration math is again identical. For brands evaluating subscription apps from scratch, the native option is the lowest-friction path: no separate app subscription fee, no checkout extension shim, and the same Contracts API surface our integration reads from.

The 5 things we built natively for subscriptions

Contract-status-aware everything.

Five subscription-specific features that solve real operational problems on subscription brands. Each one runs against the Shopify Subscription Contracts API webhook surface, which means it works identically across Recharge, Stay AI, Skio, Awtomic, and Shopify-native.

01

Pause and skip-month aware inventory holds

Paused contracts release allocated inventory promptly. Skip-month contracts excluded from the upcoming pick list.

Subscription brands routinely overcommit inventory because the forecast pulls from total active contracts, not the contracts that will actually bill this cycle. Pause, skip, swap, and dunning failure events shift the forecast meaningfully on a typical box. We subscribe to subscription_contracts/pause, /update, /fail, and /cancel webhooks and rebuild the per-cycle commit list ahead of the billing date. The result is an inventory commit that reflects what will actually bill, not what was active two weeks ago. Paused contracts release allocated stock back to the sellable pool promptly after the pause event.

Anchor stat

Pre-billing

Allocation rebuild window for per-cycle accuracy

02

Dunning-friendly retry logic

Configurable inventory hold when a billing attempt fails, so the subscription platform can complete its retry sequence without losing the picked box.

When a billing attempt fails (insufficient funds, expired card, fraud lock), Recharge, Stay AI, Skio, and Shopify-native all run retry sequences over several days. The default 3PL response is to release the picked inventory back to the sellable pool the moment the billing failure event fires, which means the eventual successful retry kicks off a brand-new pick cycle and a brand-new fulfillment delay. We hold the allocated inventory through the configured retry window so the retry succeeds against the already-picked box. The resulting dunning-recovery ship time is meaningfully faster than the release-and-repick path.

Anchor stat

Configurable

Inventory hold window during dunning retry

03

First-box custom kitting

The first box for a new subscriber typically differs from the renewal SKU set. We run first-box kitting as a separate workflow step against your approved spec.

A new subscriber's first box usually carries a brand intro card, a welcome insert, sample SKUs that introduce the broader catalog, and branded unboxing materials that do not ship on the renewal cycle. We run first-box kitting as a separate workflow step against a brand-approved kit spec. The trigger is the subscription_contracts/activate webhook for a new contract (not a renewal), and the pick list routes through the kitting station before the parcel pack-out. Same per-box fee as a standard kit, no first-box premium.

Anchor stat

Custom

Per-box kitting fee, first-box included

04

Anniversary boxes

Contract anniversary milestones (6, 12, 24 month) trigger an anniversary box workflow pulling from a tagged inventory bucket.

Subscription retention math says the 6-month and 12-month milestones are the highest-leverage moments to inject a brand-funded gift or upgrade. We track contract age via the Subscription Contracts API (created_at field, plus aggregated billing-cycle count) and trigger an anniversary box workflow at the configured milestones. The anniversary SKU set, the insert card, and the packout spec are configured per brand. The anniversary box ships in place of the standard renewal box for that cycle, so the subscriber sees an unexpected upgrade, not an addition to their bill.

Anchor stat

Configurable

Anniversary milestones (typical: 6, 12, 24 month)

05

Churn-recovery box workflow

Cancelled contracts route to a recovery flow shipping a tagged box from a separate SKU lane that does not draw from the active-subscriber pool.

When a contract cancels, the retention team often has one more chance to win the subscriber back via a recovery offer (typically a curated try-again kit, a discount-paired hero SKU, or a samples-of-everything-you-missed box). We route subscription_contracts/cancel events through a recovery flow that pulls from a tagged inventory bucket separate from the active-subscriber allocation pool. The recovery box ships at the subscriber's discretion (opt-in from the cancel-flow email), and the inventory bucket reconciles separately so a successful recovery campaign does not erode service-level for the active subscriber base.

Anchor stat

Prompt

Recovery-box ship time from opt-in

Real operational detail

The Subscription Contracts API surface we operate on.

The Shopify Subscription Contracts API exposes a SubscriptionContract object with status (ACTIVE, PAUSED, CANCELLED, EXPIRED, FAILED), a next-billing-date field, a billing-policy interval, a delivery-policy interval, and the line items with the per-cycle SKU and quantity. The status field is the lever every subscription operational feature pivots on.

The webhooks we subscribe to:

  • subscription_contracts/activate. New contract created or paused contract resumed. Triggers first-box kit workflow on a brand-new contract or standard renewal on a resumed one.
  • subscription_contracts/pause. Contract paused. Releases any allocated inventory promptly. Contract sits out of the allocation pool until resumed.
  • subscription_contracts/update. Contract metadata changed. Skip-month, SKU swap, quantity change, delivery address change, next-billing-date shift. The 72-hour pre-billing rebuild re-reads every active contract's state from this event.
  • subscription_contracts/fail. Billing attempt failed. Triggers the 3-business-day inventory hold for the dunning retry window.
  • subscription_contracts/cancel. Contract cancelled by subscriber or churn-event. Routes to churn-recovery workflow if the brand has the recovery box enabled.

The 72-hour pre-billing allocation rebuild is the operational heart of the system. Three days before each unique billing date in the upcoming horizon, we run a Bulk Operations query against the Subscription Contracts API filtered to that billing date, parse the result file (every active contract's SKU and quantity for that cycle), and rebuild the inventory commit pool for the date. Contracts in PAUSED, CANCELLED, or FAILED status do not appear in the result. Skip-month contracts (status ACTIVE with a skip-cycle metadata field set) get filtered out in our processing step. The remaining contracts make up the actual allocation pool for the cycle.

For Bulk Operations specifically: the Subscription Contracts query at a typical mid-volume brand returns 5,000 to 50,000 contract records per billing date. Running that as 5,000 to 50,000 single GraphQL queries hits the rate limit before halfway through. Bulk Operations runs the query asynchronously, drops a JSONL result on Shopify's CDN, and finishes in 8 to 30 minutes depending on the contract count. That is the only viable pattern for the rebuild at subscription brand scale.

6-month subscriber lifecycle

How Vertex routes inventory through every contract state.

Follow a single subscriber through 6 months: first box, renewal, skip, pause, resume with dunning fail, and anniversary. Click each month to see the webhook, the inventory action, and the contract status at that step. Every state change runs against the Subscription Contracts API.

Month 1 Status: ACTIVE

First box ships

New subscription contract created. First-box workflow fires: kit station builds the welcome box with brand intro card and sample SKUs. Standard per-box kit fee applies. The contract enters the regular billing cycle on the second month.

Webhook

subscription_contracts/activate

Inventory action

Allocate from active pool + route to first-box kit station

Pricing

One kitting fee. Every box type.

A single per-box kitting fee covers first-box custom kitting, standard renewals, anniversary boxes, and churn-recovery boxes. No premium for the first box, no premium for the anniversary box, no separate kitting line per workflow.

Box kitting

Custom

Per box, all box types. First-box, renewal, anniversary, recovery.

Pick fee (per SKU)

from $1.05

Per SKU pulled into the kit. Same rate as DTC.

Storage

Custom

Per cubic foot, per month, on subscription SKUs.

Subscription integration setup

$0

Subscription Contracts API webhooks, allocation rebuild, included.

Full rate card lives at /pricing. Subscription volume runs on the same card with one explicit kitting line.

Where we run this

Multi-DC subscription fulfillment with the kit station co-located.

Subscription brands ship out of our US east-coast and west-coast facilities with the kit station co-located on the pick floor. That co-location matters: a kit assembly that has to travel between buildings adds a half-day to the per-cycle pick time and creates a quality control gap (you cannot inspect the kit until it arrives at the pack-out station). We run kit assembly directly off the pick wall with the QC step embedded.

For brands shipping into Canada at meaningful volume, our Canadian sister facility in Mississauga runs the same subscription stack: same kit station model, same Subscription Contracts API integration, same allocation rebuild model. CUSMA-compliant bulk transfers move subscription inventory across the border on a regular cadence, which means a duty-paid kit on either side of the border without per-parcel customs filings.

For brands running a US-based subscription with international subscribers (UK, EU, AU), we ship cross-border parcel with full customs documentation generated from Shopify Markets metafields. The kit assembly is identical; the parcel routing changes by destination.

Ready to migrate subscription volume?

Talk to our subscription ops team

Subscription Contracts API native integration. Pre-billing allocation rebuild. Configurable dunning hold window. First-box custom kitting and anniversary boxes on a single per-box rate. Churn-recovery workflows. Works with Recharge, Stay AI, Skio, Awtomic, and Shopify-native Subscriptions.

Talk to our 3PL team

Custom quote in 24 hours.

Tell us what you ship and where your customers are. We respond from a human address inside one business day. No mailing list.

We reply from a human address. No drip sequence, no mailing list.