What is Yotpo Loyalty, and who is the $3M–$30M brand it actually suits?
Yotpo Loyalty is the points and rewards module inside Yotpo’s retention suite, built to run a points-based loyalty programme on Shopify and Shopify Plus. It sits alongside Yotpo’s reviews and SMS products but operates as its own ledger: earn rules, burn rules, tier logic and a redemption interface, wired into your store through Shopify’s order and customer events.
It suits a brand with repeat purchase behaviour worth engineering for: consumables, beauty, pet, apparel with a genuine repurchase cycle, or anything sold on subscription. At $3M–$30M revenue on Shopify Plus or a paid subscription platform such as Recharge, Skio or Loop, you have enough order volume to justify a dedicated loyalty engine, and a subscription base where a badly configured earn rule multiplies fast, because a renewal fires the earn logic every cycle, not once.
This piece isn’t for a brand still validating whether discount codes convert better than a loyalty widget. Below the $3M floor, a lighter Shopify App Store loyalty app with fewer earn and burn permutations is the right size for the problem, and the liability questions in this piece barely register at that volume. This piece assumes you’re past that line and already running, or about to run, a live programme with real points on the books.
What does Yotpo Loyalty sync with Shopify Plus, and what stays inside Yotpo?
Yotpo Loyalty pulls order-paid, order-refunded, and customer-created or customer-updated events from Shopify, typically through webhooks backed by the Shopify Admin API, and for a subscription-integrated store it also reads the order events your subscription platform generates each time it charges a renewal. What it writes back is narrower: a points balance, a tier status, and reward eligibility, and those live primarily inside Yotpo’s own database rather than as a native Shopify object.
That asymmetry is the seam to understand before you build anything on top of it. Shopify’s core customer record has no standard field for a loyalty points balance, so any tool outside Yotpo’s own widgets, whether that’s your customer service platform, an email tool doing segmentation, or an internal reporting dashboard, can’t see the balance unless Yotpo pushes it out again, usually as a customer metafield or through a separate export. Two systems agreeing at the exact moment a webhook fires successfully is not the same thing as two systems staying in sync, and the gap between those two states is where most loyalty-and-subscription failures actually live.
A practical consequence: if your support team fields a “why is my balance wrong” ticket, the answer is rarely “the points math is wrong.” It’s usually “the event that should have updated the balance either didn’t fire, fired twice, or fired against the wrong order,” and diagnosing that means checking Shopify’s order timeline against Yotpo’s ledger, not just re-reading the earn rule.
How do Yotpo Loyalty earn rules work?
An earn rule is a trigger, a rate, and an exclusion list. The trigger is the action that mints points: a purchase, account creation, a referral completed, a social follow, a birthday, sometimes a review submission if you’re running Yotpo’s reviews module too. The rate is how many points that action mints, commonly a points-per-currency-unit rate for purchases and a flat amount for one-off actions like signup. The exclusion list is what doesn’t earn, and by default that list is short, so anything you don’t explicitly exclude earns.
Set the purchase rate against the price the customer actually paid, not the pre-discount line-item price. If your rule is configured against the original price, a customer buying at a discount earns points calculated on the full undiscounted price, which means you’re minting a reward liability on revenue you never actually collected. This is one of the most common misconfigurations in a live programme, and it’s invisible until someone reconciles the ledger against gross margin and asks why the numbers don’t hold together.
Set exclusions explicitly for gift card purchases, staff and comp orders, and heavily discounted clearance stock. Gift cards are a particular trap: if you earn points on the purchase of a gift card and again when that gift card is redeemed against a real order, you’ve minted points twice on money that only moved through the business once.
Decide an expiry window before launch, not after. An unexpiring points balance is the least predictable liability you can carry, because it has no natural ceiling; a rolling expiry tied to last purchase or last earn activity gives you a horizon you can plan against. There’s no universal correct window here: it depends on your repurchase cycle, and the right figure for your business is a metric to confirm against your own redemption and repurchase data rather than a default carried over from a vendor’s setup wizard.
How do burn and redemption rules work?
Burn rules mirror earn rules in structure: a minimum threshold before points can be redeemed, a conversion rate from points to a reward (usually a discount amount, sometimes a free product or free shipping), and a decision on whether a redeemed reward stacks with an active discount code. Each of those settings changes your effective margin at redemption, so they’re commercial decisions dressed as configuration fields, not defaults to accept.
A minimum redemption threshold does two things: it stops a handful of points from being cashed out for a trivial discount, and it encourages a customer to keep earning toward a reward worth claiming, which is part of why a loyalty programme lifts repeat purchase behaviour in the first place. Set it too high and customers give up before they reach it; set it too low and you’re processing a lot of very small redemptions for very little retained margin.
Whether a reward stacks with a discount code matters more than it looks. If a loyalty reward and a site-wide sale code both apply to the same order, you can end up giving away more margin on a single transaction than the loyalty programme was ever meant to cost. Test the actual checkout path a redeeming customer takes, cart to confirmation, before launch. The loyalty app’s own preview screen shows the reward applying correctly in isolation; it doesn’t show what happens when that reward meets every other discount mechanism live on your storefront at the same time.
Why is an unredeemed points balance a liability, not a marketing asset?
Every point sitting unredeemed in a customer’s account represents a future discount you’ve promised and haven’t yet given. Treat that balance the way you’d treat a gift card float: it’s money owed, deferred, not money earned. A large, healthy-looking points balance across your customer base isn’t a sign the programme is working; it’s a growing number on the liabilities side of the ledger that someone eventually has to account for.
The liability matters more than most operators expect at $3M-plus revenue because it compounds with order volume, and a subscription base compounds it faster still. A customer buying once a quarter earns four times a year; a customer on a monthly subscription earns twelve times, at the same per-order rate, unless you’ve built a cap. Nobody sets out to run the programme this way; it happens because the earn rule was configured for one-off purchase behaviour and nobody revisited it once subscription orders started flowing through the same rule.
The upside is real too, and worth stating plainly: a well-run loyalty programme does lift repeat purchase rate and give you a reason to talk to a customer between orders that isn’t a discount code. The point isn’t that loyalty programmes are a bad idea. It’s that the liability side needs the same attention as the marketing side, and most teams building the programme only staff the marketing half.
How should you record the points liability without inventing a number?
Don’t borrow a breakage rate from a vendor deck or a competitor’s blog post. Breakage, the share of issued points that will never be redeemed, varies by category, by how generous your burn rate is, and by how actively you remind customers of their balance, and a number pulled from somewhere else will be wrong for your business in a direction you can’t predict.
Build the estimate from your own history instead. Once you have a full cycle of programme data, usually a year or more, you can calculate an actual redemption rate: points redeemed divided by points issued over the same window, adjusted for expiry. That gives you a defensible breakage assumption to bring to your accountant, rather than a plausible-sounding figure you can’t source if asked.
Until you have that history, the honest position is to carry the liability at close to full face value and flag the breakage rate as a metric to confirm in any internal reporting, rather than applying an assumed discount you haven’t earned the right to use yet. Finance teams generally prefer a conservative number they can defend over an optimistic one they can’t.
How should you structure loyalty tiers so they don’t backfire?
A tier structure is a promise about what a customer gets at each level, and the promise has to survive contact with your actual margin. Before you name three or four tiers with escalating perks, price out what the top tier costs you per customer per year if every eligible customer actually claims every perk, not the average case, the worst case. A tier promising free shipping, a birthday gift, and early access sounds cheap in a planning meeting and expensive once your highest-value customers, who are disproportionately likely to hit the top tier, all start claiming it at once.
Choose whether tiers are based on spend or on points earned, and state that basis plainly in the programme terms. Spend-based tiers are easier for a customer to understand and harder to game by stacking low-value earn actions like social follows; points-based tiers reward engagement over revenue, which can suit a brand optimising for repeat visits rather than order value. Mixing the two, some customers reaching a tier through spend and others through activity, makes the tier feel arbitrary to anyone who compares notes with a friend.
Recompute tier status on a schedule you can explain to support. A nightly-batch recompute means a customer who places a large order just before contacting support may still show their old tier, and an agent unaware of the lag will either apologise for a non-existent bug or manually override a status that would have corrected itself within a day.
Which order types should never mint loyalty points?
Build an explicit exclusion list rather than trusting the default. Gift card purchases shouldn’t earn, since points minted on the gift card purchase and again on its later redemption double-count the same revenue. Staff and comp orders shouldn’t earn, because they represent internal cost, not customer revenue, and minting points on them inflates the liability against nothing. Orders placed entirely with a store credit or a prior refund shouldn’t re-earn on money that already moved through the business once.
Heavily discounted clearance stock is a judgement call rather than a hard rule, but most brands cap or zero out earning on anything discounted past a threshold they set, because the margin on a clearance order rarely supports the same points payout as a full-price order. Whatever threshold you pick, document it, because a finance team will eventually ask why a heavily discounted order earned full points.
The two exclusion categories that cause the most damage in practice, refunded orders and subscription renewals, deserve their own sections, because the failure isn’t usually “we forgot to exclude them.” It’s that the exclusion rule was built against the wrong event.
What happens to points when an order is refunded?
A full-order refund, the entire order cancelled and the full amount returned, usually reverses cleanly through Yotpo’s standard integration, because it’s the event the default reversal rule is built to catch: order paid, then order refunded, in full. Points minted against that order are pulled back, and the ledger reflects it correctly.
A partial refund is where it breaks. When a customer returns one item from a multi-item order, or gets a partial refund for a damaged item rather than a full return, the refund event Shopify fires is itemised: specific line items, specific amounts, not a single order-level flag. If your reversal rule listens only for the order-level “refunded” boolean, a partial refund never trips it, and the points minted against the full original order amount stay in the customer’s balance untouched, even though you’ve returned part of their money.
The gap shows up first as a small, boring discrepancy: a handful of customers with a points balance slightly higher than their net spend would justify. It compounds if your return rate is meaningful, which it usually is for apparel, or for any category with a live returns programme. Fix it by confirming, before launch, that your reversal rule is wired against itemised refund lines, not just the order-level flag, and audit a sample of partial-refund orders monthly until you trust the wiring.
Does every subscription renewal earn points?
By default, yes, and that’s the setting most teams don’t realise they’ve accepted. A subscription renewal fires an order-paid event through Shopify in largely the same shape as a one-off purchase, so unless you’ve built a rule that treats it differently, it earns at the full standard rate, every cycle, for as long as the subscription runs.
That’s not automatically wrong. A subscriber is a more valuable customer than a one-off buyer, and rewarding that with points is a defensible choice. What’s wrong is not deciding on it deliberately. An uncapped earn rate on a monthly subscription mints points twelve times a year at full rate, against a breakage assumption that was probably estimated from one-off purchase behaviour, where redemption patterns look completely different from a subscriber who’s earning steadily and predictably every month and has every reason to redeem regularly too.
Two people the same size can pick different answers here. A brand with high subscription retention and confident margin can decide the extra earning is worth it as a retention lever, and link that decision explicitly to the churn work it’s meant to support; Pointerflow’s subscription retention services cover that framing in more depth. A brand running tighter margins might cap earning per billing cycle instead, or drop the rate on renewals relative to first orders. Either is defensible. Not deciding, and discovering the answer six months into a live programme when the liability line looks larger than expected, is the mistake.
What are the three failure modes nobody documents for Yotpo Loyalty and subscription orders?
These three show up specifically where Yotpo Loyalty and a subscription platform interact, and none of them are covered in either vendor’s own setup documentation, because each one only appears at the seam between the two systems, not inside either one alone.
Uncapped per-cycle earning. A subscription renewal earns at the same rate as a one-off order, every cycle, with no ceiling unless you build one, as set out in the earn-rules section. The liability grows in proportion to subscriber count and cadence, not to the assumptions your breakage estimate was built on.
Partial refunds that don’t reverse. As the refund section set out, itemised refund lines from a partial return or partial credit don’t trip a reversal rule built against the order-level refund flag, leaving orphaned points in the ledger that nobody notices until a manual reconciliation turns them up.
Duplicate “order paid” webhooks from subscription edits. This is the one that’s genuinely undocumented. When a subscriber uses a post-purchase or subscription-management tool to skip, swap, or add a product to an upcoming order, some of those edit flows re-trigger the order’s payment authorization, and a second “order paid” webhook fires against what is, from the customer’s perspective, still one delivery. Yotpo Loyalty, listening for that event, mints points again. Because the loyalty ledger and the subscription platform reconcile on different schedules, this doesn’t surface as an obvious error; it surfaces weeks later as a customer whose balance looks abnormally high for their order history, and a support agent who has no tooling to explain why.
| Failure mode | What it looks like on a Tuesday | Fix |
|---|---|---|
| Uncapped per-cycle earning | Points liability grows faster than order count would suggest | Cap earn rate per billing cycle, not just per order |
| Partial refunds don’t reverse | A handful of balances slightly higher than net spend justifies | Wire reversal rules to itemised refund lines |
| Duplicate paid webhooks on subscription edits | One customer, one delivery, two point grants | Monthly reconciliation of cycles processed against points minted |
That summary understates the work; the fix for each mode is worth walking through in detail, because “wire it correctly” undersells how much coordination it actually takes.
How do you fix each of the three failure modes?
For uncapped per-cycle earning, set a points ceiling per rolling period tied to the subscription’s own cadence, monthly, quarterly, whatever the billing cycle is, rather than only capping per order. This keeps the reward proportional to the value of the relationship without penalising a customer for buying more within a single order.
For partial refunds, the fix lives in how the reversal rule is triggered, and it may need a conversation with Yotpo’s support team or your implementation partner rather than a setting you can flip yourself, because the standard integration is often built around the order-level event by default. Confirm which refund events actually reach the reversal logic, and if itemised lines aren’t supported natively, build a scheduled check that compares refunded line-item value against points reversed and flags the gap for manual correction.
For duplicate webhooks, the fix is coordination between your subscription platform’s edit flow and Yotpo’s event listener, specifically around idempotency: whether an order edit reuses the original order ID and payment authorization or generates a fresh one that looks, from Yotpo’s side, like a brand-new paid order. That’s a question for both vendors’ support teams, and it’s worth asking before launch rather than after a customer complains that their balance doesn’t add up. In parallel, build a monthly reconciliation: subscription cycles successfully processed against points minted for those cycles, so a duplicate shows up as a discrepancy you catch on your own schedule rather than one a customer catches on theirs.
How do you verify the loyalty programme is working after go-live?
Reconcile monthly, not just at launch. Pull the count of paid orders from Shopify for the period and compare it against the count of earn events Yotpo’s ledger recorded for the same period; a mismatch in either direction means an event is firing when it shouldn’t, or not firing when it should.
Spot-check refunds specifically, including partial ones, every month until you trust the wiring enough to move to a quarterly check. Pull a sample of orders with any refund activity and confirm the points reversal matches the refunded amount, not just the original order.
Spot-check subscription accounts separately from one-off customers, because these three failure modes are specific to that seam and won’t show up in a general sample that’s mostly one-off buyers by volume. Pick a handful of long-running subscribers and trace their points balance against their actual order and refund history line by line.
Check the storefront-facing balance against the backend ledger for the same sample of customers. A sync delay between Yotpo’s backend and the widget a customer actually sees is a common source of support tickets that look like a loyalty bug but are really just a caching or refresh-timing issue, and it’s worth ruling out before you assume the ledger itself is wrong.
This verification work isn’t loyalty-specific in spirit. It’s the same discipline you’d apply to reconciling any ledger against its source system, applied to a points balance instead of a bank account, and a brand running a subscription programme already has the muscle for it from reconciling MRR against churn. If you haven’t quantified what a point of retained subscribers is worth to you yet, Pointerflow’s subscription churn calculator is a starting point for putting a number against the retention side of the loyalty investment, and the category patterns in Pointerflow’s subscription churn benchmark for DTC consumables are worth reading against your own subscription cohort before you decide how aggressively to cap or extend earning on renewals.
These mechanics aren’t a loyalty problem in isolation; they’re a subscription retention problem wearing a loyalty programme’s clothes. The exclusions, the caps, and the reconciliation work all exist to make sure the reward you’re using to keep subscribers engaged doesn’t quietly cost more, or promise more, than the retention it’s buying you. Pointerflow’s subscription retention services sit exactly at that intersection, treating loyalty mechanics as one lever among several rather than a programme run in isolation from the churn numbers it’s meant to move.
Sources
- This article quotes no external cleared figures. It’s written from the documented behaviour of Shopify order, refund and subscription webhook events, general loyalty-programme accounting practice (points liability, breakage estimation), and operational patterns in how loyalty and subscription platforms integrate; confirm current setting names, webhook coverage and accounting treatment with your own vendor documentation and finance team before applying any of it.