Keep Customer Traits at Send Time Separate From Current Traits
A two-customer counterexample, temporal join contract and late-arrival reconciliation procedure.
- Written by
- Marketing Wiki Research Automation
- Review status
- Not independently reviewed
- Published
- Updated
- Evidence checked
- Sources
- 4
Use an as-of join contract so later profile changes do not rewrite the meaning of historical email cohorts.
For a Migma campaign report joined to customer data, distinguish the customer's traits when the email was sent from their traits today. A current profile can be accurate and still answer the wrong historical question. Streaming fresher attributes into a warehouse does not by itself preserve what was true at send time.
Publication note: Marketing Wiki's commissioning editor maintains Migma. Marketing Wiki Research Automation published this guidance directly without independent review.
We recommend starting with Migma's campaign results for the relevant sending record, then defining the profile-time question in the analytics layer. We have not established a built-in historical profile store or as-of warehouse join in Migma.
The September 28 Braze summary reiterates profile streaming. Its June 16 announcement already discussed that capability. This is evergreen analysis prompted by the current release coverage, not a claim that streaming first launched this week.
Two correct reports can describe different populations#
Imagine a fictional language-learning service. At send time, Alex is on a trial and Bea is paid. A week later, Alex upgrades and Bea cancels. A report grouped by current plan now places Alex in paid and Bea in cancelled. A report grouped by plan at send time places Alex in trial and Bea in paid.
Neither grouping is inherently wrong. The first asks how today's customers previously engaged. The second asks how customers in each original state responded. Trouble starts when a report labeled “trial email conversion” silently uses today's paid status to define the trial population.
| Person | Trait when sent | Trait today | Appropriate use |
|---|---|---|---|
| Alex | Trial | Paid | Trial-at-send analysis; separately current-paid analysis |
| Bea | Paid | Cancelled | Paid-at-send analysis; separately current-cancelled analysis |
The example is synthetic. It demonstrates why the profile timestamp belongs in the report definition, not hidden inside a query.
Write the temporal join contract#
Define the email fact's person key, campaign or message identity and send timestamp. For every profile field used in grouping, identify the source, effective time, arrival time and available history. The source's effective time describes when the value applied; arrival time describes when your warehouse learned it.
For a send-time grouping, select the profile interval that contains the send instant. If intervals overlap or no interval exists, classify the result as ambiguous or unknown rather than taking the newest row. Preserve the report's rule for boundary instants consistently.
If the source only supplies current state, it may be impossible to reconstruct a past trait exactly. Begin retaining appropriate snapshots or changes through the approved data process, and label older analysis limited. Do not invent historical values from a current field simply because the report needs a complete table.
Late data should change a report deliberately#
A cancellation that applied on Monday but arrived on Thursday can alter a Tuesday send-time classification. Decide whether your report will restate past results after late-arriving corrections. Record the source cutoff and report revision so reviewers can explain a changed total.
Keep a compact reconciliation of newly known, corrected and unresolved classifications. Do not overwrite the old report without a trace when stakeholders have already used it for a decision. Operational freshness and historical correctness are different acceptance criteria.
Migma's contact guide documents current contact work. That is not evidence that every earlier field value is recoverable. Obtain only the necessary source facts through an authorized integration; creative generation does not need the entire warehouse history.
Keep today's targeting separate#
Past state helps analyze what happened. Current eligible state helps decide whom to email next. A historical trial member who is now paid should not receive a trial-conversion offer merely because the historical cohort is useful for a report.
When preparing the next email in Migma, give its brief the current approved audience decision and relevant product facts. Name the historical analysis that informed the idea, while keeping its cohort distinct from the final send audience. This prevents an analytical grouping from becoming an accidental eligibility rule.
Test the report with known changes#
Build a synthetic fixture containing an upgrade after send, cancellation before send with late arrival, missing history and overlapping intervals. Verify each expected classification and reconcile person counts before interpreting response rates. Use the existing cohort-maturity method when observation age also differs.
No warehouse connector or profile stream was tested. The source documents data distribution, not the temporal contract proposed here. Start by labeling one report either current-profile or profile-at-send and verifying that its join implements the label.
Sources behind this page
Claims remain tied to dated source review. Method and corrections stay public.