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.

This account is a person, not a company

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.

How a value becomes a score

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).

3 signalscombined weight 62≈62% of score
Recency — days since last orderorder_placed

Days since the customer's most recent order.

Lower is bettergood ≤ 14 dayswarn ≥ 45 daysweight 24
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_placed

Order count in the last 90 days.

Higher is bettergood ≥ 4 orderswarn ≤ 1 orderweight 20
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_placed

Total order value in the last 90 days.

Higher is bettergood ≥ 500warn ≤ 50weight 18
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.

3 signalscombined weight 26≈26% of score
Cart abandonment rate (30d)cart_abandoned ÷ cart_created

Abandoned carts ÷ carts created, as a %.

Lower is bettergood ≤ 30%warn ≥ 75%weight 10
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_viewed

Orders ÷ product views, as a %.

Higher is bettergood ≥ 5%warn ≤ 1%weight 8
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_placed

Returns ÷ orders, as a %.

Lower is bettergood ≤ 5%warn ≥ 25%weight 8
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.

2 signalscombined weight 12≈12% of score
Referrals (180d)referral

Referral signals in the last 180 days.

Higher is bettergood ≥ 1warn 0weight 6
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 event

Days since any event was recorded.

Lower is bettergood ≤ 14 dayswarn ≥ 45 daysweight 6
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.

SignalWhen to sendPayload
order_placedOrder completed{"value": 49.90} — amount for Monetary
cart_createdCart started
cart_abandonedCart dropped
product_viewedProduct page view
order_returnedReturn / refund

Common raw names (order.completed, checkout.completed, cart.abandoned, order.refunded, …) are pre-mapped, so most stores resolve out of the box.

Next