2026-05-22-rejection-stats
Tell rejected records apart from API errors in sync stats
Sync runs used to fold rejected records into the API error count, so a run with a few hundred profiles the destination refused to accept looked like a run with a few hundred broken API calls. Rejections are now their own counter alongside writes and errors. The writing step in a finished run reads "✓ 800 profiles written, 12 rejected, 3 errors" instead of one combined number, and the in-progress text now says "X of Y profiles processed" so the percentage reflects everything the sync has handled, not just the writes.
New rejected_profiles counter on every sync run, separate from api_error_count
Completed runs surface a per-category breakdown in the timeline instead of a single "written" total
Rejections grouped by error code in the run stats, so 50 rejections from one cause and 2 from another show as two entries
Identify records the destination dropped because the identity field was empty
When a profile reaches export without a value for the identity field you mapped, the sync now flags it with a dedicated "missing_identity" error code instead of the generic rejected_record bucket. The per-record message names the field that came up empty, like "Identity field 'email' was empty on source profile", and the run detail page surfaces the group with the action-required label and a link to your field mappings so you can pick a more reliable identifier.
Specific error code separates identity-field gaps from other rejections in the API Errors tab
Guidance text points straight at field mappings as the fix, not a generic "check your sync settings"
Live activity feed rows for failed and rejected results now display the error message inline when the record has no primary key to show