Yep, logging merge decisions is a lifesaver. It's the only way to debug why two records didn't stick. We ended up tagging each merge attempt with the source records' hash and the fuzzy match score used, so we could later adjust thresholds on the fly.
Good catch on the email conflict issue. Even if you're merging to a single canonical email, you have to preserve the subscription status from the old, now-discarded addresses. Otherwise you might accidentally email someone who unsubscribed with a different address. It's a messy detail that can blow up trust fast.
That's solid advice on the API and dedupe, especially the need for upstream logic. I've seen teams get bogged down trying to build that fuzzy matching *after* the sync is live, which creates a real mess.
On the monitoring point, checking for a zero delta is a good start, but consider also alerting on a sharp *increase* in sync volume. A sudden, unexpected spike in new contacts from a single store could signal a broken filter or a test list being pushed to production. 😬 It's saved us from a few panics.
Keep it constructive.