Add three lightweight provenance fields (what they are and why)
Keep it small. Add three custom properties on contacts (and companies if you need them):
- import_batch_id — single-line text. Put a small batch identifier or timestamp here so every import or sync can be traced to a single operation.
- original_source — dropdown or single-line text with controlled values (forms, website, zapier, xero, manual). This tells you which connector or channel created the record.
- last_verified_by — HubSpot owner or single-line text. Record the person or system that last checked the data.
These three are enough to answer the common operational questions: when did this arrive, where from, and who last verified it. They’re low effort to add and avoid cluttering your CRM with lots of ad hoc properties.
Populate them: imports, forms and API integrations
- Imports: add a column to your CSV named import_batch_id and fill it with a timestamp or batch token (eg. 2026-06-16-mailchimp-01). Map the CSV columns to the matching HubSpot properties during the import and choose "update existing records using email" when you need to fix a bad batch.
- Forms: add original_source as a hidden field on external forms (set a controlled value per form). For manual form entries, set last_verified_by as the form processor’s name or owner. Hidden fields are the easiest way to stamp provenance without changing user journeys.
- API / middleware: have your integration include import_batch_id and original_source on every create or update call. If a connector can’t set the owner, include last_verified_by as a name or service tag so you can see whether a human or an automated job last touched the record.
Troubleshoot, quarantine and clean up in an afternoon
- Quick lists and automations to isolate suspect data:
- Active list: import_batch_id is any of "[recent batch tokens]" to see recent records from a given import.
- Active list: original_source is "zapier" AND postcode is empty (or another obvious mismatch) to find connector mis-maps.
- Workflow: when import_batch_id equals X, set a temporary property or add to a static "quarantine" list and pause downstream workflows.
- Find recent bad imports (recipe): create an active list filtered by Created date in the last 7 days AND import_batch_id is known recent token. Export that list, scan suspicious columns, then correct and re-import using email as the unique identifier to overwrite the bad values.
- Spot which connector mis-mapped a field (recipe): build a short active list where original_source equals the connector name and the suspect field contains values that don’t match expectations (eg. letters in a numeric field). If many records from one source show the same pattern, that connector is likely the cause.
- Roll back or quarantine affected records (recipe): add affected contacts to a static "quarantine" list, pause related workflows, export a CSV backup, fix the CSV, then re-import with the same import_batch_id or a new corrected batch id and choose the update option. If you need an immediate stop-gap, set a temporary flag (eg. data_quarantine = true) via a workflow to keep them out of sales/marketing flows.
- Simple retention and cleanup policy you can run monthly:
- Keep import_batch_id and original_source for 90 days; this covers most troubleshooting windows.
- Review quarantined records after 14 days and either fix and reintroduce, or mark for archive/delete after manual sign-off.
- After 90 days, clear or archive old batch IDs to reduce property noise (keep a small log or spreadsheet of important historical batches if you need long-term traceability).
If you’d prefer a short afternoon session to set this up and add the lists/workflows, Optira can help implement the three fields and the few automations above as a practical, low-risk task.