# Acme Reports: lifecycle stack (fictional example of martech-context/stack.md)

This is the file the worked example reads first. It shows the fields the audit needs. A real one holds no secrets, no API keys and no customer contact details. Owners are roles, not names.

## Product and audience

- Acme Reports: B2B SaaS reporting product. Customers create workspaces; each workspace has one or more admins and members.
- 14-day trials, monthly and annual plans. Annual plans renew on contract dates.
- Regions: US, UK and EU. Business model for the audit: saas.
- Source of truth: the warehouse, fed by the product database and the billing platform.

## Senders

- Customer.io workspace "Acme Production", US region.
  - Channels: email and in-app. Purpose: product lifecycle (activation, onboarding, trial, usage, invites), feature announcements, security and account alerts.
  - From: updates@example.com. Return-Path domain: example.com. DKIM selector: cio1 on example.com.
  - Message limit "Optional lifecycle": 2 per 24 hours and 5 per 7 days, assigned to the activation, onboarding, trial, usage decline and invite workflows. Auto-retry: off.
  - Holdout: workflows filter out workspaces whose holdout_group is control.
  - Owner: lifecycle lead. Audit access: Customer.io MCP with the default read scope only.
- HubSpot Marketing Hub Professional.
  - Channel: email. Purpose: Acme Monthly newsletter (48,000 subscribers; on each send day about 7,000 personal Gmail, 3,100 Microsoft consumer and 5,900 Yahoo addresses), webinar invites, trial expiry nurture.
  - From: news@example.com. Sends through the provider's shared signing domain (example.net appears in headers). No DKIM record for example.com is connected in HubSpot.
  - Frequency limit: not configured. Holdout: none.
  - Lists: webinar_audience is built from the "Engaged" active list (opened any marketing email in the last 90 days).
  - Owners: demand gen lead (nurture, webinars), content lead (newsletter). Audit access: HubSpot remote MCP with only the audit's read tools allowed and every other tool denied, plus the email events export.
- Billing platform.
  - Channel: email. Purpose: receipts, failed-payment emails and payment retries.
  - From: billing@example.com. DKIM selector: bill1 on example.com.
  - Owner: billing ops. Audit access: dashboard read and one saved sample message.
- No SMS or push sender.

## Domains and mailbox provider data

- example.com: one SPF record authorising the lifecycle platform and the billing platform. DMARC p=none with aggregate reports to a mailbox data engineering reads weekly.
- Gmail Postmaster Tools: example.com verified. Spam rate 0.18% on newsletter send days (2026-09-14 and 2026-10-12, UTC), below 0.05% on other days. Compliance status: two requirements marked Needs work (authentication alignment and one-click unsubscribe), read 2026-10-14.
- Yahoo complaint feedback: not enrolled. Microsoft SNDS: not enrolled (shared sending IPs).

## Data feeding the journeys

- workspace_created: emitted by the web app in the browser only. API and mobile signups do not emit it.
- signup_completed, data_source_connected, report_generated, member_joined: backend events through the CDP to Customer.io.
- weekly_reports_dropped: renamed upstream to report_volume_dropped on 2026-09-03; the Customer.io journey still listens for the old name.
- invoice_payment_failed and invoice_paid: billing webhooks into Customer.io.
- Nightly warehouse sync at 02:00 UTC writes marketing_opt_in from the product database to HubSpot and Customer.io, and trial_end_date to HubSpot.
- holdout_group: set at workspace creation by the backend (10% control). Synced to Customer.io in real time and to HubSpot nightly; no HubSpot list or workflow reads it.
- Timezone: Customer.io has a timezone for 94% of profiles. 31% of HubSpot contacts have none and fall back to the account timezone (America/New_York).

## Decisions (excerpt of martech-context/decisions.md)

- 2026-03-10 consent model: UK and EU require explicit opt-in for marketing email; US is opt-out. Signed by the privacy owner.
- 2026-06-01 cap policy: at most 2 optional messages per rolling 24 hours and 5 per rolling 7 days per person, across all senders, email only. Service, billing and security messages are exempt. Quiet hours 21:00 to 08:00 recipient local time. A blocked optional message is discarded or re-decided later, never auto-retried.
- 2026-07-01 global holdout: 10% of new workspaces are held out of optional lifecycle messages through holdout_group. Service, billing and security messages still send. Primary outcome: activation (first scheduled report within 14 days of workspace creation). Owner: lifecycle lead.
- No sunset or re-permission rule is recorded.

## Reported impact claims

- Monthly lifecycle report: "lifecycle drove USD 84,000 of new revenue in September". Method: last-touch credit for email clicks within 7 days, from the HubSpot attribution report.
- Quarterly review: "the holdout shows onboarding lifts activation by 2.5 points". Method: HubSpot export of activation by holdout_group.

## Seed test resources

- Customer.io test workspace "Acme Sandbox". HubSpot has no sandbox on this plan, so seeds use the internal list "QA seeds" in production.
- Seed mailboxes seed-01 to seed-04 at example.org, controlled by the platform team. No seed phone numbers.
- Seed test approvers: lifecycle lead and privacy owner.

## Owners (roles)

- Lifecycle lead, demand gen lead, content lead, product marketing, billing ops, platform team (also the email delivery owner), privacy owner, data engineering.
