E-commerce (RFM) template
The E-commerce / D2C template — an RFM churn model scored entirely from order and cart events, with no new engine math.
Pick E-commerce / D2C retail when you create a project (or apply the template from Settings → Templates) and your dashboard starts from an RFM model: Recency, Frequency, Monetary — the classic, evidence-backed way to spot a lapsing consumer, plus a few funnel-quality and loyalty signals. It scores entirely from order and cart events; there is no new scoring math, just new data.
E-commerce accounts are consumers — set kind: "person" and
valueBasis: "ltv" when you upsert accounts, so value-at-risk reads
"LTV at risk". See Enrich account data.
Each component computes a raw value, then maps it to a 0–100 score: at its
good threshold it scores 100, at warn
it scores 30, linear between. Inverse signals (recency,
abandonment, returns, silence) fall as the number rises. Overall health is the
weight-proportional average, banded Healthy ≥ 80 · Watch ≥ 60 · Risky ≥ 40 ·
Cold < 40.
RFM core
The heart of the model. Recency (how long since the last order) is the single strongest lapsed-buyer signal; Frequency (repeat rate) is the backbone of lifetime value; Monetary (spend) separates your high-value core from casual buyers. Read them together — a high-monetary customer whose recency is slipping is your prime, highest-ROI win-back target.
Evidence: RFM is the canonical, no-ML framework for retail churn — customers with high recency (long since last order), low frequency, or low monetary face the greatest risk, and "once-valuable, now-lapsed" is the prime win-back segment (ewardslab, TechTarget). Retention economics compound: a 5% lift can raise profit 25–95% (Reichheld/Bain, HBR).
Recency — days since last orderorder_placedDays since the customer's most recent order.
Lower is bettergood ≤ 14 dayswarn ≥ 45 daysweight 24
order_placedDays since the customer's most recent order.
- How we collect it
- Send an `order_placed` event on every completed purchase (or map your `order.completed` / `checkout.completed` event to it).
- How to read it
- Raw value is days since the last order. Fresh buyers (≤ 14d) score 100; a 45-day gap scores 30; linear between.
- How to analyze it
- Recency is the single strongest lapsed-buyer predictor in RFM: the longer since the last order, the higher the churn risk — regardless of how good the customer once was.
- What to do
- Trigger a win-back flow as recency crosses your repeat-purchase cycle: a reminder, a replenishment nudge, or a targeted offer before the gap hardens.
- Tune it
- Set `good`/`warn` to your category's natural repurchase cadence — grocery is days, furniture is months. This is the highest-weighted RFM signal; keep it dominant. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Frequency — orders (90d)order_placedOrder count in the last 90 days.
Higher is bettergood ≥ 4 orderswarn ≤ 1 orderweight 20
order_placedOrder count in the last 90 days.
- How we collect it
- Same `order_placed` event — counted over a 90-day window.
- How to read it
- Raw value is the order count. 4+ orders score 100; a single order scores 30. One-time buyers sit at the floor by design.
- How to analyze it
- Repeat rate is the backbone of e-commerce LTV. A rising frequency is the clearest sign a customer has adopted a habit rather than made a one-off purchase.
- What to do
- Move one-and-done buyers into a second-purchase program; reward the 3rd/4th order to cement the habit where the curve flattens.
- Tune it
- Widen the window for seasonal or high-consideration categories so a normal cadence isn't misread as decline. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Monetary — spend (90d)order_placedTotal order value in the last 90 days.
Higher is bettergood ≥ 500warn ≤ 50weight 18
order_placedTotal order value in the last 90 days.
- How we collect it
- Put the order amount on the event payload as `value` — e.g. `{ "value": 49.90 }`. The `sum_payload` op totals it.
- How to read it
- Raw value is summed spend. It maps onto your `good`/`warn` band; a customer spending ≥ 500 in 90 days scores 100.
- How to analyze it
- Monetary value separates your high-LTV core from casual buyers. A high-monetary customer going quiet is your prime, highest-ROI win-back segment.
- What to do
- Segment high-monetary + slipping-recency accounts for concierge or VIP retention — they're worth a human touch, not just an email.
- Tune it
- Set the band from your AOV × expected orders. Currency-normalize upstream if you sell in several currencies. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Funnel quality
Where intent leaks. Rising cart abandonment is early intent-loss; low purchase conversion is browsing without buying; a high return rate erodes margin and predicts dissatisfaction. These are the fixable, operational signals behind a softening RFM score.
Evidence: cart abandonment is near-universal and highly sensitive to checkout friction and shipping cost; return behaviour is a strong, category- specific dissatisfaction signal. Anchor thresholds to your own baselines rather than absolute numbers.
Cart abandonment rate (30d)cart_abandoned ÷ cart_createdAbandoned carts ÷ carts created, as a %.
Lower is bettergood ≤ 30%warn ≥ 75%weight 10
cart_abandoned ÷ cart_createdAbandoned carts ÷ carts created, as a %.
- How we collect it
- Send `cart_created` when a cart is started and `cart_abandoned` when it's dropped. The `ratio` op divides the two.
- How to read it
- Raw value is a percentage. ≤ 30% abandonment scores 100; ≥ 75% scores 30. Skips cleanly when no carts were created.
- How to analyze it
- Rising abandonment is early intent-loss — the customer wanted to buy but friction, price, or shipping stopped them.
- What to do
- Fix the top drop-off (shipping cost, forced signup, slow checkout) and layer an abandonment email/SMS sequence.
- Tune it
- Baseline against your own median rate; abandonment is high everywhere, so an absolute 70% may be normal for your store. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Purchase conversion (30d)order_placed ÷ product_viewedOrders ÷ product views, as a %.
Higher is bettergood ≥ 5%warn ≤ 1%weight 8
order_placed ÷ product_viewedOrders ÷ product views, as a %.
- How we collect it
- Send `product_viewed` on PDP views and `order_placed` on purchase. The `ratio` op divides orders by views.
- How to read it
- Raw value is view-to-order conversion. ≥ 5% scores 100; ≤ 1% scores 30. Low conversion = browsing without buying.
- How to analyze it
- A customer who browses a lot but rarely buys is signalling unmet intent — wrong price, wrong assortment, or eroding trust.
- What to do
- Re-target high-browse / low-convert customers with the exact items they viewed; check price and stock on those SKUs.
- Tune it
- Conversion benchmarks vary widely by category; anchor `good`/`warn` to your own funnel, not an industry average. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Return rate (90d)order_returned ÷ order_placedReturns ÷ orders, as a %.
Lower is bettergood ≤ 5%warn ≥ 25%weight 8
order_returned ÷ order_placedReturns ÷ orders, as a %.
- How we collect it
- Send `order_returned` (or map `order.refunded`) on each return. The `ratio` op divides returns by orders.
- How to read it
- Raw value is the return rate. ≤ 5% scores 100; ≥ 25% scores 30. High returns erode margin and predict dissatisfaction.
- How to analyze it
- Chronic returners are expensive and often unhappy; a spike in returns for a segment usually points at sizing, quality, or expectation gaps.
- What to do
- Improve product content and sizing guidance for high-return SKUs; flag serial returners for review before they churn or cost margin.
- Tune it
- Fashion tolerates far higher returns than electronics — set the band to your category's norm. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Growth & silence
Loyalty and drift. Referrals are the strongest word-of-mouth signal — referrers churn far less — while account silence catches disengagement (stopped browsing, opening, clicking) even before purchases stop.
Evidence: advocacy correlates strongly with retention, and inactivity is a leading indicator that precedes the lapse itself — silence often moves before recency does.
Referrals (180d)referralReferral signals in the last 180 days.
Higher is bettergood ≥ 1warn 0weight 6
referralReferral signals in the last 180 days.
- How we collect it
- Send a `referral` event when a customer refers someone (or map your referral-program webhook).
- How to read it
- Raw value is the referral count. Any referral scores 100; none scores the floor — referrals are sparse by nature.
- How to analyze it
- Referral is the strongest loyalty and word-of-mouth signal: customers who refer are advocates and churn far less.
- What to do
- Nurture referrers with early access and rewards; prompt happy, high-frequency buyers to refer at their peak-satisfaction moment.
- Tune it
- Keep the weight modest so accounts aren't penalised merely for not referring; lengthen the window if your referral cycle is slow. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Account silenceany eventDays since any event was recorded.
Lower is bettergood ≤ 14 dayswarn ≥ 45 daysweight 6
any eventDays since any event was recorded.
- How we collect it
- Computed from every event on the account — no dedicated event needed.
- How to read it
- Raw value is days since the last activity of any kind. Recent activity scores 100; a long silence scores 30.
- How to analyze it
- Even before purchases stop, a consumer who stops browsing, opening, or clicking is drifting. Silence catches disengagement earlier than recency alone.
- What to do
- Re-engage with fresh content or an offer before silence hardens into a lapse; pair with recency for the full picture.
- Tune it
- Tighten the window for high-cadence stores; loosen it for occasional-purchase categories where silence is normal between buys. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Sending the data
All eight components read five canonical signals. Send them via the SDK or the HTTP API; map your existing event names in Settings → Event map.
| Signal | When to send | Payload |
|---|---|---|
order_placed | Order completed | {"value": 49.90} — amount for Monetary |
cart_created | Cart started | — |
cart_abandoned | Cart dropped | — |
product_viewed | Product page view | — |
order_returned | Return / refund | — |
Common raw names (order.completed, checkout.completed, cart.abandoned,
order.refunded, …) are pre-mapped, so most stores resolve out of the box.
Next
- Enrich account data — set
kind,valueBasis, and attributes. - Build a custom dashboard — retune weights and thresholds.