Memo: Subscriber-store-to-Person handoff timing
Date: 2026-04-28 From: Growth To: Platform Status: Open. Surface area between Growth's subscriber store and Platform's Person mint that is currently ad hoc.
Why
Email-only signups live in Growth's subscriber store until a phone arrives, at which point the standard intake.captured and intake.matched flow takes over. The "until a phone arrives" condition is doing real work in that sentence, and the trigger for the form_submission that crosses the Person-mint threshold is currently implicit:
- A subscriber re-engages on the marketing site and submits a phone-bearing form. Easy. Standard intake flow.
- A subscriber receives an email re-engagement campaign and replies with a phone. Today this is manual on Growth's side.
- A subscriber's phone is acquired through a partner placement Growth runs. Today this is also manual.
- A subscriber is matched to an existing Person by some signal other than phone (e.g., a household-level lookup). No path for this today.
Without an explicit rule we get either subscribers that should be Persons sitting in the subscriber store indefinitely, or accidental dual-tracking where the same human exists as both a subscriber row and a Person record without a join.
What
Two things to nail down:
The trigger condition for promotion. Phone arriving via a form is the obvious one and is already handled. The non-form paths (manual capture, partner upload, derived match) are the open ones. Recommendation: any path that yields a phone tagged with consent context should produce a synthetic form_submission so the existing intake flow runs. The synthetic submission carries the source channel and consent metadata; Platform mints from the submission as if it were any other.
The deduplication rule when a subscriber-derived submission produces a phone that already exists on a Person. Two subscriber rows for the same human (one from a partner, one from a direct signup) should not produce two Persons. Platform's identity-match logic resolves this on the intake.captured consumer side; Growth's question is whether the subscriber row should be retired or kept for attribution purposes once the match resolves.
Asks
Confirm Platform is comfortable with synthetic form_submissions as the unified path. The shape would match a regular form submission with an explicit source: subscriber_promotion and a reference back to the subscriber row.
Confirm the resolution-time behavior: when intake.matched returns a Person that already exists, Growth retires the subscriber row (mark it matched, freeze further outbound) but keeps it for attribution. Confirm or propose an alternative.
References
- ADR-0005 (event envelope;
intake.capturedis the cross-domain entry point) coordination/domains/growth.mdcoordination/domains/platform.md