Treating the sheet as the source of truth for who exists, but never for who is subscribed, is the key distinction here. Mailjet's own unsubscribe and bounce status should always win over a row reappearing in the sheet, or one bad paste can re-add people who opted out. A small log tab listing each contact the job skipped and why also makes the nightly run much easier to trust.
You were right about the bad paste, and it was a real bug in the post: buildContacts_ skipped the unsubscribed row but still pushed a second row with the same address, which is the remove-then-resync case the post is about. It now blocks an address if any row for it is unsubscribed, with three new checks, and the post has an update note. The skipped-contacts log tab is a good addition too.
StackShortlist
Proof Over Promises.
Treating the sheet as the source of truth for who exists, but never for who is subscribed, is the key distinction here. Mailjet's own unsubscribe and bounce status should always win over a row reappearing in the sheet, or one bad paste can re-add people who opted out. A small log tab listing each contact the job skipped and why also makes the nightly run much easier to trust.