All guides

Zestly and Shopify Flow

Shopify Flow is free on Shopify's paid plans. With Zestly installed, Flow shows 8 Zestly triggers and 5 Zestly actions in its editor (their names are in English there). No code, no API key: Flow and Zestly authenticate each other with the app's own secret.

Triggers

Each trigger carries the customer (Flow's customer reference: every customer field, tag and metafield is available in the workflow) and the event's numbers. Zestly sends a trigger only while an active workflow uses it, and once: if Shopify does not answer, the send is not repeated — a missed workflow is better than a reward given twice.

TriggerWhenFields besides the customer
Points earnedpoints from an order, a rule, a referral, a VIP tier's gift, a membership, an adjustment (yours, your app's or a Flow action's)Points, Balance, Pending, Source
Reward issueda reward redeemed with points or given (rule, VIP tier, referral, membership, a Flow action)Reward ID, Reward type, Value, Currency, Points spent, Code, Expires at, Source
VIP tier changeda move up, down, or into a tier's gracePrevious tier, New tier, Direction (up, down, grace, same), Cause
Next VIP tier nearthe next tier is within reachNext tier, Balance
Points expiring30 and 7 days before the balance expires for inactivityPoints, Expires at, Days left
Referral rewardedthe referrer was rewardedPoints (0 for a code), Referral ID
Membership started or reneweda paid membership began or renewedPlan, Paid through, Renewal
Membership lapseda paid membership ended without renewalPlan

Code is the discount code of the reward (to send it by SMS, for example); a gift card's code never leaves Zestly. Tiers and plans are their handles (oro, club), dates ISO 8601, values in the shop's currency. No name, email or phone.

Source says where the points or the reward came from. Points: order, rule, referral, vip, membership, admin (you), api (your app) or flow. A reward: points (redeemed), rule, vip, referral, membership or flow. `flow` means a Zestly action in a Flow workflow caused it — see «Avoiding loops» below.

If Shopify answers that a trigger was refused 3 times in a row for reasons that concern the whole store (not a single customer deleted meanwhile), «Da verificare» says so. If Shopify is busy (throttled), Zestly simply sends later.

Actions

Every action takes the customer (from the trigger) and answers balance and pending — the customer's points after it — for the workflow's next steps. A run Flow sends again (a timeout, a retry) never moves points twice: Zestly keys each action by the run (action_run_id). A customer who is not a member yet is enrolled, as a first order would.

ActionFieldsDoes
Give pointsPoints (1–100,000), Reason shown to the customer (correction, courtesy, complaint, migration, other; empty: courtesy), Counts toward the VIP tieran adjustment, as «Rettifica saldo» in the member's page; the change log says «Shopify Flow»
Take pointsPoints, Reason (empty: correction)a negative adjustment; never below zero
Complete a custom actionCustom action ID (on the action's page in Zestly › Rules)the action's reward, as the admin and the API award it
Reward a reviewReview ID, With a photo, With a video, Product IDthe points of the «Leave a review» rule (below)
Give a rewardReward ID (on the reward's page in Zestly › Rewards)the reward, free of points (not a variable amount)

An action Zestly cannot do answers with the reason, shown in Flow's run log, and is not retried: the program paused, an excluded or merged customer, an unknown custom action or reward, too few points to take (a customer who is not a member has none: they are not enrolled for it), a balance beyond the maximum, a workflow looping (below). A refused action never enrols the customer. A failure on Zestly's side is retried by Flow for up to 36 hours. While you build the workflow, the editor checks the values you typed (points, reason, IDs).

Avoiding loops

A workflow can start itself again: «Reward issued → Give a reward» gives a reward, which is a new «Reward issued», which gives another one… The same holds for «Points earned → Give points» or a repeatable custom action. Add a condition at the start of such a workflow:

As a safety net, Zestly counts each step of a workflow per customer. More than 10 times in a minute: Zestly asks Flow to wait, and Flow runs it again a little later — nothing is lost (a «For each» over a customer's orders just takes a few minutes). More than 30 times in an hour: Zestly refuses it with a message in Flow's run log («probably a loop»): nothing is given, and the loop stops there — within the hour, with at most 30 given. A workflow that really needs more than 30 runs of one step for one customer in an hour must be spread over more time. «VIP tier changed» cannot loop for ever (a tier is reached once), and says its Cause.

Reviews

The rule «Lascia una recensione» (Zestly › Rules › Leave a review) sets the points for a review, a bonus with a photo and a bonus with a video. Every honest review earns the same, positive or negative. There is no minimum rating, and there must be none in Flow either: consumer rules on reviews (the EU's Omnibus Directive and unfair commercial practices rules, the US FTC rule 16 CFR 465) forbid incentives tied to the review's opinion. Do not add Flow conditions on the rating or the sentiment; conditions on the review being published, approved or from a verified buyer are fine.

Built-in caps, both editable on the rule's page:

A review earns points once, whoever it is sent for (the Review ID; deleting and recreating the rule does not pay old reviews again). A deleted review does not take its points back by itself: use Take points or an adjustment.

Customers are told about review points only once you tick «Ho collegato Shopify Flow» on the rule's page: until then the store, the Loyalty Hub and the emails do not promise them, and the rule list says «Flow non collegato». Tick it once the workflow below is on.

In Flow: your review app's trigger → Reward a review, with the review's ID, the product's ID and, when the app gives them, photo and video. Which trigger (October 2026):

If the trigger gives no review ID, use something unique to the review, such as the product's ID and the review's creation date together — check the variable names in Flow's variable picker.

A customer not yet in the program is enrolled by «Reward a review» — unless your program excludes customer tags (staff, wholesale) and the customer has one: then nothing is given and they are not enrolled.