Audience-sync (saastarter-parity Phase 3). The newsletter signup stores a subscriber (the MARKETING module's
Newsletter entity) AND mirrors it to the email provider's AUDIENCE/list (saastarter POSTs to Resend
/audiences/{id}/contacts, src/app/api/newsletter/route.ts:35-41). This is that mirror as a swappable binding:
a duck-typed AudienceProvider (consoleAudience for dev; a Workers-safe resendAudience over the REST API, no SDK)
a syncNewsletter reconciler that drives the audience from the Newsletter rows (subscribed → upsert,
unsubscribed → remove). Content the app SENDS to a provider — never a hosted list.
Audience-sync (saastarter-parity Phase 3). The newsletter signup stores a subscriber (the MARKETING module's
Newsletterentity) AND mirrors it to the email provider's AUDIENCE/list (saastarter POSTs to Resend/audiences/{id}/contacts, src/app/api/newsletter/route.ts:35-41). This is that mirror as a swappable binding: a duck-typedAudienceProvider(consoleAudience for dev; a Workers-safe resendAudience over the REST API, no SDK)syncNewsletterreconciler that drives the audience from theNewsletterrows (subscribed → upsert, unsubscribed → remove). Content the app SENDS to a provider — never a hosted list.