Skip to content

CAP-MKT-MKT-004Explain and apply recipient exclusions

Markdown

CAP-MKT-MKT-004

Explain and apply recipient exclusions

Markdown
  • DocumentDraft
  • Product intentProposed
  • ImplementationPartially observed

KindCapabilityProduct areaMarketingModuleMarketing campaigns, communications and resolutionRevision2

Read atservices-marketing d071a159react-console baf6dae3

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
Each resolved recipient is deliverable or carries one exclusion reason.Additional audience and list exclusions remove selected groups.
Surfaces
consoleapi
Preconditions
Evaluation has identified people and their available contact facts.
Postconditions
Excluded recipients retain the earliest applicable reason.
Intent sources
services-marketing:docs/milestones/MKT-M2.md#4. **Options**: one e-mail per person listing all their records (default) or one per record; send once per shared address (off);services-marketing:docs/milestones/MKT-M2.md#6. **Preview**: "Matching records 241 → People 233 → Deliverable 216" with a table of who is left out and why (bounced orservices-marketing:docs/milestones/MKT-M2.md#- Consent: "CRM owns it" (2026-10-20): until CRM's consent ledger exists, the gate honours CRM's global `email_opt_out`;services-marketing:docs/milestones/MKT-M1.md#D-M2services-marketing:docs/milestones/MKT-M2.md#5. A deceased contact is excluded with its reason; a user with the override permission includes it after confirming; the auditservices-marketing:docs/milestones/MKT-M2.md#8. A bounced address and a contact with `email_opt_out` are excluded with their reasons.

Controls

18 controls apply, from the corpus control catalogue.

TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-AZ-006 TC-CRY-001 TC-DAT-002 TC-IAM-001 TC-LOG-004 TC-LOG-005 TC-PI-001 TC-PRV-001 TC-PRV-002 TC-PRV-004 TC-TEN-001 TC-TEN-002 TC-TEN-003 TC-TEN-004

Permissions

KeyChecked atScope
marketing.audiences.manageapitenant
marketing.audiences.viewapitenant

Business Rules

11 rules, 10 to be proved before approval. A rule's product intent is derived from its origin: 0 confirmed by a product decision, the rest inheriting this capability's proposed.

IdRuleKindEnforced atProvenance
01must prove
Proposed
Eligibility records the first failing check in this order: missing contact, inactive, deceased, missing selected address, suppression, subscription-type opt-out, global opt-out, additional exclusion, repeat restriction, frequency limit and environment restriction.
no proof recorded yet
policyservicetest
02must prove
Proposed
Inactive and deceased contacts are excluded unless their corresponding inclusion option is enabled.
origin: services-marketing:docs/milestones/MKT-M2.md#5. A deceased contact is excluded with its reason; a user with the override permission includes it after confirming; the audit
no proof recorded yet
policyservicetest
03must prove
Proposed
Active workspace suppressions exclude matching addresses regardless of case or whitespace; released suppressions do not apply, and status inclusion cannot bypass suppression.
no proof recorded yet
policyservicetest
services-marketing:modules/marketing/tests/integration/services/audience-evaluation.integration.spec.ts#answers an address with an active suppression, whatever its case or spacing
04must prove
Proposed
CRM's global e-mail opt-out excludes a contact from marketing; subscription-type opt-outs await the later subscription capability.
origin: services-marketing:docs/milestones/MKT-M2.md#- Consent: "CRM owns it" (2026-10-20): until CRM's consent ledger exists, the gate honours CRM's global `email_opt_out`;
no proof recorded yet
policyservicetest
services-marketing:modules/marketing/tests/unit/evaluate-audience.spec.ts#leaves out a contact who opted out of e-mail, as globally unsubscribed
05must prove
Proposed
A contact absent from readable contact facts, including an alias with a missing survivor, receives the missing-contact exclusion.
no proof recorded yet
policyservicetest
services-marketing:modules/resolution/tests/unit/resolve-recipients.spec.ts#excludes with `contact_missing` an alias whose survivor does not exist
06must prove
Proposed
Additional exclusions remove people reached by selected lists or audiences, with a maximum of fifty references of each kind.
no proof recorded yet
policyapi, servicetest
services-marketing:modules/marketing/tests/unit/evaluate-audience.spec.ts#leaves out the members of the excluded list and the people of the excluded audience, with their reason
07must prove
Proposed
Exclusion references must exist in the workspace, repeated references are consolidated, and an audience cannot exclude itself.
no proof recorded yet
validationservicetest
services-marketing:modules/marketing/tests/integration/services/audiences.integration.spec.ts#refuses an excluded audience that does not exist, with the code unknown_exclusion
08must prove
Proposed
An excluded audience supplies resolved people without applying its own gate or exclusions; exceeding 100,000 contributing records fails the enclosing evaluation.
no proof recorded yet
policyserviceobserved
09must prove
Proposed
Contacts classified as duplicates remain eligible for the gate, after merged identities resolve to survivors.
no proof recorded yet
policyservicetest
services-marketing:modules/resolution/tests/unit/eligibility-gate.spec.ts#passes a contact whose status is `duplicate` (chapter 04 says nothing about it)
10must prove
Proposed
An unfamiliar contact status fails evaluation rather than selecting or silently excluding that contact.
no proof recorded yet
validationserviceobserved
11
Proposed
Subscription-type, repeat, frequency and environment checks currently receive empty inputs and therefore exclude no recipients.
policyserviceobserved

Scenarios

IdGivenWhenThenProvenance
01Eight board contacts include a deceased person, an inactive person, an opted-out person, a suppressed address and a missing primary address.Staff preview the board audience.The five affected contacts receive their distinct exclusion reasons and contribute to the grouped totals.test
02The audience subtracts the Do not contact list.Staff request evaluation.Listed contacts receive the additional-exclusion reason and other eligible contacts remain.test

Edge Cases

IdGivenWhenThenProvenance
03A contact is inactive and has no selected address.Eligibility checks the contact.The inactive-status exclusion is retained because it precedes address availability.test
services-marketing:modules/resolution/tests/unit/eligibility-gate.spec.ts#reports the status before the address when the contact is inactive and has no address

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.