The Challenge
Cobrapparel was managing sales and fulfilment activity in a large Trello order-monitoring board. Customer, company, product and date details were embedded in card titles; quantities and prices appeared across descriptions and comments; newer comments often superseded earlier information; and sales history, fulfilment stages, attachments and audit context were mixed together. Company and contact naming was inconsistent, while a standard Trello export did not necessarily contain the complete comment history. A basic CSV import would have lost relationships and context while creating a serious duplicate and data-quality risk.
What I Did
I built a repeatable Python extraction, transformation and loading system that retained the Trello source key at every stage. Immutable raw snapshots fed a normalised SQLite staging layer, where parsing, duplicate checks and confidence rules produced review workbooks before anything could be approved for HubSpot. Records were then loaded in dependency order as Deals, Companies, Contacts, fulfilment Tickets, Notes, attachment representations and associations. A persistent ID ledger made the process resumable and prevented reruns from blindly creating duplicates.
The Result
The production migration recreated all 4,353 Trello cards as HubSpot Deals alongside 3,100 Companies, 266 Contacts, 3,782 fulfilment Tickets, 20,181 Notes, 3,144 represented attachment assets and 52,742 associations. Final validation found 4,353 of 4,353 expected Deals, completed 80,616 Deal-property checks with zero remaining mismatches, confirmed all 3,782 Ticket stages and found zero missing expected associations. The ledger closed with zero unresolved active rows and no expected association missing endpoint or object-type metadata.