Eight mail rows become seven unique rows. APP-999 has no application entity, so six matched events remain. The latest event changes three of four roles.
LOCAL XLSX / STATUS PROVENANCE
Which email actually moved the role?
Join application rows to dated mail updates by ID, remove repeats, quarantine unknown roles, and keep the exact subject and comment behind every status.
application_id · company · role · current_status · applied_atreceived_at · application_id · status · subject · commentNo workbook loaded.
SheetJS is ready. No reconciliation has run.
TWO SHEETS / ONE CURRENT STATUS
A status is only as good as its trail.
The application row keeps the prior value. Only a later, matched, explicit mail status can change it; duplicates and orphan IDs stay outside the ledger.
APPLICATION MAIL RECONCILER / CANONICAL RESULT
3 STATUS CHANGES, FULL PROVENANCE
WHY THE JOIN MATTERS
Entities stay put. Events move them.
Interview and Rejected at the same APP-101 timestamp cannot be ordered by recency. The tool blocks instead of choosing a convenient status.
Status must be explicit in the sheet. The tool does not infer from prose, open a mailbox, access LinkedIn, call ChatGPT, or schedule a daily refresh.