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.
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.
# 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.
| Parameter | Type | Default |
|---|---|---|
| crm.winback.delay_hours | number | 24 |
| crm.winback.channel | string | |
| crm.winback.template | string | reminder_a |
| crm.winback.discount_pct | number | 10 |
| Surface | Kind | Role |
|---|---|---|
| Email / CRM | render | |
| Push notifications | mobile | render |
| Messaging orchestrator | backend | decision |
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.
| Variant | delay_hours | channel | discount |
|---|---|---|---|
| control | 24 | 10 | |
| fast-nudge | 4 | push | 0 |
| slow-value | 72 | 15 |
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.
| Definition | Source |
|---|---|
| Entity | user · userId |
| Outcome | warehouse · analytics.orders |
| Window | 30 days from assignment |
| Type | ratio · per assigned user |
| Certified by | Data 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.
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.
What you get back
Not "which subject line won" — which send strategy made money.
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.
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.
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.