Signal
Two signals in one week
Leila's wishlisted jacket restocks on Tuesday. On Thursday her points balance enters the 14-day expiry window.
The engine
One profile. One decision at a time.
Every module writes to the same customer record, and the retention engine decides what happens next.
Recover
Turn saved items and sold-out stock into orders.
Retain
Keep customers with subscriptions, flows, segments and proof.
Built on Shopify's native primitives. No theme hacks, no ScriptTags.
By outcome
Same engine, same price. Each solution shows the loop pointed at one outcome.
Loyalty & referrals
Subscriptions & pre-order
Dated, sourced comparisons. Free migration from any of these during private beta.
The engine Step 04 of the loop
Ayra Opportunities is the layer of the Shopify retention engine that turns signals into things worth acting on. A rule watches the customer profile for a pattern, a VIP's wishlisted item back in stock, a subscriber who skipped twice, a first-time buyer twenty days past delivery with no review, and opens an opportunity with a type, the customer, the evidence, a priority from P0 to P4 and an expiry. The decision layer then picks one next best action per customer.
Every retention chance, typed and prioritised, with evidence and an expiry.
Open opportunities
| Customer | Type | Evidence | Prio | Expires |
|---|---|---|---|---|
| Hira | VIP_RESTOCK | Wishlisted + restocked | P1 | 72h |
| Daniel | SUB_SKIP_X2 | Skipped 2 cycles | P2 | 5d |
| Mei | FIRST_REVIEW | Delivered 20d, no review | P3 | 10d |
| Omar | REFERRAL_PUSH | NPS 9, 3 orders | P4 | 30d |
01 The merchant problem
A trigger is a rule that sends. An opportunity is a rule that notices, and then lets something decide between everything it noticed about one customer.
A VIP restock and a routine points reminder carry the same weight in a queue. Whichever fires first, sends first.
A win-back flow started in March is still sending in June to a customer who came back in April.
The message goes out, but nobody can say which facts about the customer qualified them for it.
Once a trigger matches, the send happens, even when the best outcome for that customer this week is silence.
02 How Ayra solves it
Each opportunity has a type such as VIP_RESTOCK, SUB_SKIP_X2, FIRST_REVIEW, WINBACK or SECOND_ORDER, the signals that qualified it, and the profile facts used.
Scored from the customer's value, intent and the time left, so a VIP restock expiring in 72 hours outranks a referral nudge with a month to run.
Every opportunity expires. A customer who acts on their own closes it, and nothing stale keeps sending.
Open opportunities resolve to one action, or to NO_ACTION, with Journey Guard applied. The rest are merged, scheduled or dropped, and the reason is logged.
When the resulting order lands, it is credited once to the opportunity and the module that triggered it.
03 Inside
The explicit rules the engine ships with. Each is readable and editable, and more are added over time.
| Type | Opens when | Default priority | Typical action |
|---|---|---|---|
| VIP_RESTOCK | A VIP or high-intent customer's wishlisted variant restocks | P1 | Restock alert with a points bonus, before the general announcement |
| WINBACK | A customer passes a multiple of their own gap between orders | P1–P2 | What they wanted first, then credit, then one discount |
| SUB_SKIP_X2 | A subscriber skips two consecutive cycles | P1 | Save Engine: pause, swap or date change |
| CHURN_RISK | Skips, a low rating, a failed payment or a ticket inside a window | P1 | Fix first, hold promotions |
| SECOND_ORDER | A first order is delivered and no second order follows | P2 | Delivery-timed post-purchase steps |
| POINTS_EXPIRY | A balance enters the expiry reminder window | P3 | One reminder, with the items they viewed |
| FIRST_REVIEW | Delivered, no review and no open ticket after a set number of days | P3 | Review request on the preferred channel |
| REFERRAL_PUSH | A positive review or a repeat order from a customer who has not referred | P4 | Referral nudge, scheduled behind higher priorities |
In the loop The engine watches for patterns worth acting on: a VIP's wishlisted item back in stock, a subscriber who skipped twice, a first-time buyer 20 days post-delivery with no review. Each becomes an Opportunity with a type, a customer, evidence and an expiry. How it works
04 The workflow
Leila, Gold · 7 orders. Five stages, one decision, every reason recorded.
Leila
Gold · 7 orders
Signal
Leila's wishlisted jacket restocks on Tuesday. On Thursday her points balance enters the 14-day expiry window.
Customer
7 orders, $930 lifetime value, intent high, last send nine days ago, no open tickets, email preferred.
Opportunity
VIP_RESTOCK opens at P1 with a 72-hour expiry. POINTS_EXPIRY opens at P3 with 14 days. Both carry their evidence.
Action
The next best action is the restock alert. The expiring points are attached as the incentive, so the P3 opportunity is satisfied by the same send. One email goes out.
Outcome
Leila orders the jacket and spends the points. Both opportunities close as converted, and the order is credited once to Back in Stock and Loyalty.
05 Use cases
Ayra decides
The order signal closes the opportunity. No message is sent, and the order is not attributed to winback.
Ayra decides
The opportunity expires with the hold as its reason. The timeline shows what was not sent and why.
Ayra decides
One is actioned, one is merged into it, one is scheduled. Each has a logged reason.
Fed by these modules
Back in Stock
Restocks and waitlist signals open VIP_RESTOCK. The alert is the action.
Subscriptions
Skips and cancel attempts open SUB_SKIP_X2 and CHURN_RISK. Save Engine is the action.
Loyalty
Expiring balances open POINTS_EXPIRY. A reminder or a bonus is the action.
Reviews
Deliveries without a review open FIRST_REVIEW. The request is the action.
For developers
Opportunity opened, decided, actioned, expired and converted are typed events. Use them as Shopify Flow triggers, subscribe over webhooks, or read a customer's open opportunities and their evidence through the REST API.
Solutions built on Opportunities
One loop that decides per customer instead of a stack of triggers.
Detect lapsed customers from their own rhythm and bring them back once.
Turn deliveries, wishlists and balances into second and tenth orders.
06 FAQ
A trigger sends when it matches. An opportunity records that a customer qualifies, with evidence, priority and expiry, and leaves the decision to the next-best-action step, which may pick a different opportunity or nothing at all.
Yes. Opportunity types, eligibility and scoring are explicit rules you can read and edit, and every decision has a visible reason in the timeline.
One is actioned and the others are merged into it, scheduled or dropped, inside the customer's frequency cap. The reason is logged for each.
Yes. If the best action would break a cap, land on an open complaint or stack a discount, the engine records NO_ACTION with the rule.
Prediction is layered on top later, for churn, repeat purchase and send time. The rules, the guards and the timeline stay the same.
07 The rest of the engine
One profile per customer, written by every module and by Shopify.
Every event from Shopify and every module, typed, on one profile.
Restock alerts prioritised by who's actually likely to buy.
Private beta
Private beta merchants get the opportunity rules on their own data, readable and editable, with every decision logged.