Shopify Flow
Curobi adds seven triggers to Shopify Flow, Shopify’s own automation app. A trigger is the starting point of a workflow, so you can turn a subscription moment into anything Flow can do:
- Subscription cancelled → tag the customer
churned→ add a row to a Google Sheet. - Subscription payment failed → if the customer’s lifetime spend is over $500 → send an internal email to their account manager.
- Subscription started → post to a Slack channel.
Available on every Curobi plan, including Free. There’s nothing to connect or switch on in Curobi: open Apps → Flow in your Shopify admin and the triggers are there.
Why Flow and not a direct integration: Flow already connects to many of the apps a store runs, so one set of Curobi triggers works with every one of them, including apps Curobi will never build a direct integration for.
The seven triggers
In Flow, the triggers are listed with Curobi’s name when you pick a workflow’s trigger.
| Trigger | Fires when | Extra fields |
|---|---|---|
| Subscription started | A customer starts a subscription. Fires once per subscription | Order (the order the subscription was bought on) |
| Subscription renewed | A recurring charge succeeds | Order (the renewal order) |
| Subscription payment failed | A recurring charge fails. Fires on the first failure in a billing cycle, not on every retry | Error code |
| Subscription payment recovered | A charge that had failed is later paid | Order (the recovered charge’s order) |
| Subscription paused | A subscription is paused, by anyone | Previous status |
| Subscription cancelled | A subscription is cancelled | Previous status, Cancellation reason |
| Subscription reactivated | A paused or failed subscription becomes active again | Previous status |
Payment failed fires once per billing cycle. Curobi retries a failed charge automatically, and each retry is part of the same failure. If every retry fired the trigger, an “alert the account manager” workflow would email them four times about one card.
Renewed and payment recovered never both fire for one charge. A charge that ends a failed-payment recovery fires Subscription payment recovered, not Subscription renewed, so a workflow that counts renewals doesn’t count a recovery as one.
Paused fires whoever paused it: the customer in their portal, you in the admin, or Curobi when failed-payment retries run out.
The fields every trigger carries
| Field | What it holds |
|---|---|
| Customer | The full Shopify customer, so you can use their tags or lifetime spend in a condition |
| Subscription contract ID | The Shopify subscription contract, for example gid://shopify/SubscriptionContract/123 |
| Product | The subscribed product’s title |
| Frequency | How often it renews, for example Every month |
| Subscription amount | The amount per charge, before shipping and tax |
| Currency code | For example USD |
Plus, on the triggers listed above:
| Field | On | What it holds |
|---|---|---|
| Order | Started, renewed, payment recovered | The full Shopify order |
| Previous status | Paused, cancelled, reactivated | The status before the change, for example ACTIVE |
| Cancellation reason | Cancelled | The reason the customer gave in the cancellation survey |
| Error code | Payment failed | Shopify’s reason for the failure, for example INSUFFICIENT_FUNDS |
Customer and Order are the whole Shopify record, not a copy of a few fields. Curobi passes Flow the customer’s and order’s IDs, and Flow looks them up in your store. That’s why you can branch on anything Shopify knows about the customer, and why no customer data leaves Shopify to make it work.
A field Curobi doesn’t know is sent empty, never left out. Flow rejects a trigger that’s missing a field, and a rejected trigger means your workflow silently doesn’t run. So when there’s nothing to send, Curobi sends empty text instead. Build your conditions to expect it:
- Cancellation reason is empty when you or your team cancelled the subscription, or when the customer skipped the question.
- Error code is empty when Shopify didn’t give one.
- Product, Frequency and Currency code are empty if Curobi doesn’t have them.
The fields won’t change. New fields may be added, but existing ones are never renamed or removed, so a workflow you build today keeps working.
In the Flow editor, choose fields from the variable picker rather than typing them: Flow names them in
its own format (for example {{cancellationReason}}), and the picker always has the right name.
When a trigger doesn’t fire
- Subscription started doesn’t fire for imported subscriptions. A subscription brought in with the CSV importer has no order it was bought on, and Flow won’t accept the trigger without one. The same applies, rarely, to a renewal that Shopify reports without an order.
- Curobi only sends events once you have a workflow turned on. Flow tells Curobi when you turn a workflow that uses a Curobi trigger on or off. Events that happened before your first workflow was on aren’t replayed.
- Flow says to try again later when you turn a workflow on. Flow checks with Curobi before enabling a workflow that uses a Curobi trigger, and refuses if Curobi doesn’t answer in time. Try again; it’s better than a workflow that looks on and never runs.
Recipes
These are good first workflows. Build each in Flow with Create workflow, then pick the Curobi
trigger. Starting every tag with curobi- keeps them clear of tags you already use, such as a
newsletter subscriber tag.
Tag customers when they start a subscription
Trigger Subscription started → Add customer tags: curobi-subscriber.
Tag customers who cancel their last subscription
A customer with two subscriptions who cancels one hasn’t left, so this one needs a condition.
- Trigger Subscription cancelled.
- Add a Condition on the customer’s subscription contracts: None of them has Status equal to ACTIVE or Status equal to PAUSED. A paused subscriber hasn’t left either.
- On the True branch, Remove customer tags
curobi-subscriber, then Add customer tagscurobi-churned-subscriber. - Optionally add Send internal email with the customer’s name, the Product and the Cancellation reason.
Flag failed payments, and clear the flag on recovery
- Trigger Subscription payment failed → Add customer tags:
curobi-payment-failed. Optionally Send internal email with the amount and Error code. Because the trigger fires once per billing cycle, the email won’t repeat for every retry. - A second workflow: trigger Subscription payment recovered → Remove customer tags:
curobi-payment-failed.
If two of a customer’s subscriptions fail at once and only one recovers, the second workflow removes the tag anyway. For most stores that’s rare enough not to matter.
What Flow can’t do with Curobi
- Change a subscription. Curobi adds triggers to Flow, not actions: a workflow can react to a subscription event, but it can’t pause, skip or edit a subscription. To change subscriptions from your own tools, use the Admin API on Pro.
- React to every event. There’s no trigger for a skipped order, an upcoming charge reminder, a gift or a card update. For upcoming charges and card updates, Klaviyo receives them.
Related
- Integrations
- Klaviyo
- Outbound webhooks, for sending events to your own systems