Use case · CRM · Lifecycle

Send the right message at the right hour

Timing, content, channel, and how much to personalize — measured on whether people came back and bought, not on whether they opened the email.

messaging orchestrator = medium riskunsubscribe rate is a blocking guardrail

The problem

Open rate is the metric you have. Revenue is the metric you want.

Your CRM tool will happily A/B two subject lines and declare a winner on open rate within a day. But nobody's quarterly goal is opens. The question is whether the send changed behaviour — a repeat purchase three weeks later, a renewal, a churn that did not happen.

That outcome lives in your warehouse, not in the messaging tool. So the honest analysis becomes a manual export, a spreadsheet, and an argument, which means it happens for the big campaigns and never for the routine ones.

Meanwhile the highest-leverage variable is not the copy at all. It is the delay — a cron guess someone made two years ago that nobody has revisited, because changing it means editing a campaign nobody wants to touch.

campaigns/winback.yaml
# before — guesses, frozen in a tool
trigger: cart_abandoned
wait: 24h        # why 24? nobody knows
channel: email
subject: "Still thinking it over?"
discount: 10

# reported on: open rate, click rate
# never reported on: repeat purchase,
# margin, unsubscribes 30 days later

What you put under control

Timing, content, channel and depth of discount — all values, all measurable.

Parameters
ParameterTypeDefault
crm.winback.delay_hoursnumber24
crm.winback.channelstringemail
crm.winback.templatestringreminder_a
crm.winback.discount_pctnumber10
Surfaces that consume them
SurfaceKindRole
Email / CRMemailrender
Push notificationsmobilerender
Messaging orchestratorbackenddecision

Those bindings are what compute the risk class — medium: backend surface · decision binding. Messaging reaches people outside the product, so it is never treated as cosmetic.

Variants are parameter value sets
Variantdelay_hourschanneldiscount
control24email10
fast-nudge4push0
slow-value72email15

Note what fast-nudge tests: that a timely reminder with no discount beats a slower one that gives away margin. That is a strategy question, and it is one change.

The cost of getting this wrong is permanent

A bad layout loses a session. A bad send loses the channel — an unsubscribe does not come back. That is why frequency and unsubscribe rate are blocking, not advisory.

Measured on the outcome, weeks later

The result lives in your warehouse. So that is where the metric is computed.

Repeat purchase at 30 days, renewal, refund, lifetime margin — none of these are events an SDK can see. They are rows in the warehouse that is already your system of record, arriving long after the message was sent.

Traffical joins the assignment to those rows and computes the same statistics it computes for in-product events. So a lifecycle change is evaluated on the thing you actually care about, with intervals and guardrails, and no export step.

  • Long windows are normal — a 30-day outcome is a metric definition, not a special project.
  • Batch outcomes count — refunds and chargebacks land days later and still attribute correctly.
  • One definition — "repeat purchase" means the same thing here as in the board deck.
Metric / repeat_purchase_30d certified
DefinitionSource
Entityuser · userId
Outcomewarehouse · analytics.orders
Window30 days from assignment
Typeratio · per assigned user
Certified byData team · May 2026

Works with the warehouse you have

Postgres, BigQuery, Snowflake, Databricks or ClickHouse. Traffical runs the query; the data never leaves your account.

How it runs

Prove the shape with an experiment, then let the system keep tuning it.

Experiment, then adaptive optimization
Thompson sampling over the winning shape.

Lifecycle messaging is the best possible fit for adaptive optimization: there are many plausible timings, the traffic is continuous, and the cost of exploring a slightly worse send is low. Once the experiment establishes that timing matters more than discount, a bandit keeps allocating toward the better arms.

Allocation shifts on a medium-risk change arrive as proposals, not silent moves — so the system can keep learning while a person still sees what changed and why.

Phases adaptive
Setup
Canary
Experiment
Adaptive
Complete
Guardrails on every phase
unsubscribe_rate
must not increase > 0.2%
blocking
spam_complaint_rate
must not increase > 0.05%
blocking
messages_per_user_7d
frequency cap must hold
blocking
margin_per_order
must not decrease > 2%
warning

What you get back

Not "which subject line won" — which send strategy made money.

winback-timing-and-content / measurement adaptive · week 3
Timing beat discounting
A 4-hour push with no discount outperformed a 72-hour email at 15% off — on repeat purchase and on margin. Unsubscribes unchanged.
primary metric
+5.2%
repeat_purchase_30d · from the warehouse
margin per order
+2.1%
no discount to fund
guardrails
4 / 4
passing, unsubscribes flat
fast-nudge leading
4h · push · no discount — allocation now 62%
+5.2%
control baseline
24h · email · 10% off — allocation now 23%
baseline
slow-value losing
72h · email · 15% off — allocation reduced to 15%
−1.8%
unsubscribe_rate guardrail
push did not cost list health at this frequency
passing

This is the finding a CRM tool structurally cannot produce: the winning variant is worse on open rate and better on revenue. Push notifications get opened less than email and converted more, because they arrived while the intent was still live.

It also settles a recurring argument with a number. "Give a bigger discount to win them back" turned out to cost margin without buying purchases — and the record of that is retained for the next time it comes up.

Retained after this change

Timing dominates discount for cart abandonment: 4h push, no discount, beat 72h email at 15% off on repeat purchase and margin. Deeper discounts did not move purchases.

Searchable by parameter, surface, or metric

Keep reading

The mechanics behind this page.

Stop optimizing for opens

Parameterize one delay. Measure it on the outcome that appears in your warehouse three weeks later.