- Shipped
- November 13, 2026 at 9:39 AM UTC
- Author
- Kamo
- Commit
- dbf6877
Campaign and drip emails can carry doc chips. The editor stores them as one comment block **************** JSON>-->) where the "Shared docs" cards belong. At send time CampaignDocLinks asks DocsService to issue each recipient their OWN links (source CAMPAIGN, sourceRef = the recipient row's token, as the campaign's creator, disclosure acknowledged) and puts the email-safe DocLinkCards in place of the block, after the tracking pass so doc links are never wrapped in a click redirect. DocsService not answering puts the recipient back in line uncharged; a refusal fails that recipient with the reason in plain words (never a suppression). An attempt that never reached the host revokes the links it minted. Saving a campaign or drip step whose block names a doc the saver can't share is refused (422 DOC_LINKS_REFUSED / 503 DOC_LINKS_UNAVAILABLE). GET **************** per recipient and per doc views, joined recipients -> doc_share_links on the token (batched nested loop on ix_campaign_recipient_campaign + ix_dsl_source_ref, checked by EXPLAIN). DocSharesClient: issue(..., source, ...) overload; a 404 that names a code is a refusal (no such doc for this member), a bare 404 stays "unavailable".
