Documentation
Subflow is a subscriptions app for Shopify. It is built on Shopify's native Subscriptions API, so contracts, payment methods and charges live in your Shopify admin rather than inside a third-party system. This page describes what the app does on each surface it touches.
The merchant dashboard
Subflow opens from Apps in your Shopify admin. The dashboard leads with four numbers:
- Active subscriptions — the number that counts toward your plan's limit.
- Monthly recurring revenue — every cadence normalised to 30 days. Totals are summed per currency; if you sell in more than one, the largest is shown and the others are listed after it rather than folded in.
- Renewing in 7 days — charges already scheduled.
- Failed payments — links straight to the page where you can act on them.
Below that is your subscription list: customer, products, frequency, next billing date, recurring total and status, 50 to a page. Browsing shows active, paused and failed subscriptions. Searching by customer name or email searches everything, cancelled subscriptions included.
A reconciliation notice appears when the daily check finds something the engine should have handled: contracts that were due but never charged, contracts that were paid but whose date never moved, charges stuck for over a day, and subscriptions that have run out of automatic retries.
Before your first subscriber, the dashboard shows a setup checklist: create a plan, add the product-page block, optionally add the customer-account block, then place a test subscription. Shopify only vaults payment methods on an eligible gateway — Shopify Payments, PayPal Express or Authorize.net — so if your store is not eligible and you have no subscribers yet, the dashboard says so rather than letting you set everything up and find out at your first customer.
Each subscription also has a detail page showing its products, its billing history (cycle, outcome, resulting order, decline reason) and an activity log recording every change and whether the customer, the merchant or the system made it. Subflow registers a subscription link extension, so a subscription contract in your Shopify admin links through to that page.
Subscription plans
A plan is a name, one or more delivery frequencies, and the products it applies to. You create it on the Plans page.
- A frequency is a whole number of days, weeks, months or years, from 1 to 365. A plan can carry up to 10 of them and cover up to 250 products.
- Discounts are a percentage off, from 0 to 99. There is no fixed-amount discount.
- Billing interval and delivery interval are always the same: one charge, one delivery. Prepaid plans — pay for three months up front, receive three — are deliberately not supported.
- If a longer cadence carries a deeper discount than a shorter one, the screen warns you: the customer buying less would be rewarded more. It warns, it does not block.
- If a product is already covered by another live plan, you are told when you pick it, because shoppers would otherwise see two competing subscription offers on one product page.
Creating a plan creates a selling plan group in Shopify, stamped as Subflow's. Archiving one deletes that group: shoppers can no longer start the plan, and existing subscriptions keep their contracts and keep billing. Archiving cannot be undone.
You can also work from the product itself. On a product or variant in the Shopify admin, the Subflow purchase-options action creates or edits a subscription purchase option without leaving that page — up to 31 delivery frequencies, each with a percentage discount from 0 to 100.
On your product page
Subflow ships a theme app extension block called Subscribe & Save. You place it in the theme editor, under Add block → Apps, next to your buy buttons.
- It renders a one-time purchase option plus each subscription frequency the plan offers, with the price for that option and, when it is discounted, the original price struck through.
- Prices and availability are per variant. The block re-renders when the shopper changes variant, and keeps the product form's selling plan in sync so the cart receives the option that is actually selected.
- It only renders selling plan groups Subflow created, and only recurring ones. Plans belonging to another subscriptions app, or to a pre-order or try-before-you-buy app, are left to your theme's own picker rather than shown under Subflow's heading.
- It can show a link to the customer portal for shoppers who already subscribe.
- If no plan covers the product, shoppers see nothing. In the theme editor you see a note explaining why, visible only to you.
The customer portal
The portal is served on your own storefront at /apps/subflow through Shopify's app proxy. It exists on every store the app is installed on and needs no placement. A visitor who is not logged in gets a login link back to it.
Each subscription is a card showing its products with images and quantities, the recurring total and cadence, the next delivery date in your store's timezone, and a status. From it a customer can:
- Skip the next delivery — the date moves forward one interval.
- Move it to a new date — any date from tomorrow up to a year ahead.
- Change how often it arrives — only the cadences you priced for the products on that subscription, each labelled with its discount. Changing the cadence re-prices the lines using the discount you set for it, from each product's own plan.
- Pause and resume.
- Cancel, after confirming.
- Ask for a card-update email — Shopify sends its own secure link, and no card details reach Subflow. Pressing it again within 15 minutes does not send a second email.
While a charge for the current cycle is still open, the actions that would move past it are refused and nothing changes: the customer is told a payment is being processed and asked to try again once it finishes. Moving the date then could still let that charge go through, so the app refuses rather than risk it. A subscription waiting on a bank authentication prompt says so, and is not retried while it is pending.
Every action is checked against the logged-in customer's own subscriptions, and a double submit or a refresh cannot apply the same action twice. Changes apply to future deliveries; anything already on its way is unaffected.
Customer accounts and the thank-you page
Subflow also ships blocks for Shopify's own customer-facing surfaces. Shopify renders each of them only once you place it, which is Shopify's behaviour for every app. The portal above always works, so your customers are never left without a way in.
- A subscriptions page in customer accounts. It carries the same actions as the portal: skip, pause, resume, cancel, move the next billing date, change the frequency, and email a payment-update link. When an action is refused — a payment being processed, a date out of range, a cadence you do not offer — it comes back as a short message on the page.
- Order pages in customer accounts. On an order that contains a subscription, a section and an action-menu button link the customer to their subscriptions.
- A thank-you page block. After checkout, on orders that contain a subscription, it tells the customer they can skip, reschedule, pause or cancel and links them to the portal. On an order without a subscription it renders nothing.
Recurring billing
Shopify does not advance a subscription's next billing date. Subflow does, on a successful charge. A scheduled job runs once a day per store and, in order:
- re-reads from Shopify any contract whose billing date has been in the past for more than two days, in case a webhook never arrived;
- skips whole cycles that were missed during a long outage or an uninstall, rather than charging one per day for deliveries that were never made;
- charges every contract whose next billing date has arrived;
- runs the retries that are due;
- turns a bank authentication prompt the customer abandoned for three days into an ordinary failure, so it enters the retry ladder and appears on your failed-payments page. Shopify is asked for the attempt's real state first — a prompt that is still live is left alone.
Charges are idempotent. Each billing cycle is protected by a database uniqueness constraint and by an idempotency key sent to Shopify, so a retry, a duplicated webhook, or two overlapping runs cannot produce a second charge. When a charge succeeds, the next billing date moves forward one interval. A new subscriber is emailed a confirmation with a link to the portal; a subscriber you migrated from another app is not, because their subscription is not new to them.
When a payment fails
A declined charge is retried automatically three times — 2 days after the failure, then 4 days later, then 7 days later, so the last attempt lands about two weeks after the failure — one original charge and three retries. Each failure emails the customer a link to update their payment method, and alerts you with the decline reason. After the last retry fails, the subscription is marked Failed and no further automatic charge is made; it stays on your failed-payments page until you or the customer act.
A subscription the customer has already cancelled receives no dunning email. If a delivery is moved past a cycle that is still unpaid, the automatic ladder for that cycle stops, and the cycle stays on your failed-payments page with its manual retry.
The failed-payments page
This page lists every declined charge, and every charge waiting on bank authentication, on a subscription that can still be recovered — 100 to a page. Each row shows the customer, the products, the decline reason, how many attempts have been made out of four, and when the next automatic retry runs. Subscriptions that are cancelled, expired or left behind by an uninstall are not listed, because no payment action on them could be valid.
Two actions sit on each row:
- Email card update — sends the customer Shopify's secure payment-update email.
- Retry now — charges that cycle again, including after the automatic retries are exhausted. It refuses and says why when the cycle has already been paid, when a charge is already in flight, or when the customer is moving that delivery at the same moment.
A row waiting on 3-D Secure cannot be retried: sending the same charge again would not start a new attempt. It is labelled as awaiting the customer instead.
Moving from another subscriptions app
A subscription contract belongs to the app that created it, so no app can take another's contracts over. Subflow re-creates each subscription against the payment method the customer already has saved on your store. Nobody is asked for their card again, and card details never reach Subflow. Because that is a bulk write against real subscribers' billing, the wizard shows you every row before, during and after the run.
- Choose the app you are leaving. Recharge, the Shopify Subscriptions app, Appstle, Seal, Bold, or a generic CSV whose columns you map yourself. Each option tells you which export to produce; the Appstle, Seal and Bold presets are starting guesses, because those apps do not publish their export format.
- Upload the export (up to 10 MB) and check the column mapping. The importer understands the customer email, variant ID, price, quantity, billing interval and count, next billing date, status in the old app, currency, the old subscription ID, and the delivery address. Every field can be pointed at one of your own columns.
- Run the preview. This is a dry run: nothing is created in Shopify. It looks up each row's customer and the card they already have saved, rolls a billing date that has already passed forward to the next cycle, and labels every row — ready to import, no matching customer, no vaulted card, several cards to choose between, prepaid, possible duplicate, invalid, or skipped because of its status in the old app. You can read it row by row, include a skipped row, or fix things in Shopify and re-check.
- Work through the checklist. Nothing Subflow does stops billing in your old app, so importing while it is still running means both apps charge the same customers. The import button stays disabled until you confirm you have paused or cancelled billing there. The checklist also notes that imported subscriptions arrive with $0.00 delivery — the importer does not read a shipping price from your file — so recurring shipping has to be added afterwards.
- Import. Rows are created ten at a time with visible progress. Failed rows can be downloaded as a CSV and retried. When it finishes, the job stays as a permanent record.
Prepaid subscriptions are refused rather than imported. Shopify has no prepaid equivalent that can be re-created without charging the customer again, so those rows are flagged and left for you to run down on the old app.
If the import is interrupted after a row was sent to Shopify but before Shopify answered, that row is marked Check in Shopify and deliberately left out of the bulk retry. Importing it again blindly would charge that customer twice a cycle, so you look, then tell the row what you found.
An import is capped by your plan limit like everything else: if the rows would take you past it, the import stops and says so.
Plans, limits and the grace window
Subflow is priced on active subscribers, at a flat monthly price. There is no revenue share on any plan, including Free — we never take a percentage of your subscription sales.
- Free — $0 per month, up to 50 active subscriptions.
- Starter — $19 per month, up to 500 active subscriptions.
- Growth — $49 per month, up to 2,000 active subscriptions.
- Pro — $149 per month, unlimited active subscriptions.
Paid plans include a 14-day free trial, once per store. If you change plan mid-trial, the days you have left carry over. Charges appear on your Shopify bill and you can change or cancel at any time.
When you reach your limit, Subflow stops your store taking on more subscribers: the products are detached from the selling plan group, so the subscribe option stops appearing on your storefront. The group, its plans, its discounts and its schedule are untouched, so upgrading re-attaches exactly what was there, automatically. Your existing subscribers are unaffected — they stay active and keep being billed.
Downgrading below the number of subscribers you already have is the one case that needs a decision. New sign-ups stop immediately and a 30-day grace window opens. The date is shown in the app and sent to you by email. If you are still above the limit when it ends, the subscriptions beyond the limit are paused — newest first, so the customers you have had longest are the last to go — and never cancelled. Upgrading again resumes exactly those, automatically. Subflow never cancels one of your subscriptions.
Privacy and data handling
The full policy is at /privacy. In short:
- What is stored: your shop domain and access token, the shop owner's name and email, one record per subscription (Shopify contract ID, status, cadence, next billing date, recurring total, products, and the subscriber's Shopify customer ID, name and email), the outcome of each charge, a log of changes such as skips and cancellations, and a record of the emails the app sent. A migration also stores the file you uploaded and one row per subscriber.
- What is never stored: card numbers and bank details. Every charge is executed by Shopify against the payment method the customer already gave your store. Subflow asks Shopify to create the charge and records the result.
- How long: email bodies are cleared after 30 days and the send record after 90; subscription history is kept for 12 months; a finished migration is deleted after 12 months, along with its rows; subscriptions and billing records are kept while the app is installed, because they are the record of what was charged.
- Isolation: every query is scoped to the shop it belongs to, and the customer portal additionally verifies that a subscription belongs to the logged-in customer before showing or changing anything.
Subflow implements Shopify's mandatory privacy webhooks. Shopify triggers all three automatically, so you never have to contact us to have one carried out:
- A customer data request compiles everything the app holds about that customer — subscriptions, charges, history, the mail sent to them, and any migration rows — and emails it to you, the shop owner, because you are the data controller and must deliver it to them.
- A customer redaction request erases that customer's personal data. Their name, email address and customer ID are removed from the subscription record, and the removal is written to that subscription's own history. Mail addressed to them is deleted and mail about them is scrubbed, and migration rows are scrubbed in place and taken out of an unfinished import so nobody is subscribed after asking to be erased. If the erasure leaves a live subscription the app can no longer write to a customer about, you are told while it can still be identified — cancelling it is your decision, not ours.
- A shop redaction request arrives 48 hours after uninstall and deletes everything the app holds for your store, migration files and rows included.
Uninstalling stops billing immediately and parks your subscriptions, so reinstalling does not retroactively charge customers for the time the app was gone.
Anything else
If something here does not answer your question, email support@subflow.store and we will answer within one business day.