Creative & Media: Photo Agency, 27 Years of History
Twenty-seven years of agency history sat in a legacy Salesforce org held together by one shared login, and the business needed to move onto a supported edition without losing a record of how it had worked.
- Size
- 5 users, 8 objects, 238,945 records
- Timeline
- 7 weeks, plus 30-day support
- Layers touched
- 4
What the Business Looked Like
A photo agency with twenty-seven years of operating history ran on a legacy Salesforce edition that was no longer sold. Access ran through a single shared login, roughly 150 reports had accumulated across the years, and around 77,000 legacy notes carried the institutional memory of the business. The move to a current edition had to happen, and the edition they were moving to was substantially more limited than the one they were leaving, with a hard ceiling of 25 custom fields per object and Contact already sitting near 20.
What Broke and What It Cost
An external ID field used as migration plumbing was required on create screens, so the team could not save new opportunities. 7,432 calendar events were invisible because import ownership landed on an admin login, 51,555 tasks carried the import date instead of real activity dates, and the Contact Roles picklist held Salesforce stock defaults instead of the 85 values the agency actually uses.
Misconfigured required fields blocked the create screen, so work that was happening was not being recorded anywhere. A blank team calendar and import-stamped activity dates meant nobody could reconstruct what had happened when, and any careless remediation risked destroying the only record of a 27-year business. Internally there was already a voice arguing to revert to the legacy system, which made every unresolved fire an argument for going backwards.
What Was Built, in Dependency Order
A documented and client-approved migration plan, a permanent full export locked as the recovery baseline, an import sequence with validation gates written into a build document, then a stabilization sprint that root-caused an encoding failure and a stale source export instead of patching symptoms
- 01Data-model audit, record counts, and field mapping
- 02Written migration plan approved before any data moved
- 03Import execution against a build document with validation gates
- 04Forensic stabilization, reconciliation, and client-side handoff
What Changed
Five users on a supported edition at exactly five licenses with nothing over-purchased, calendars visible from every login, opportunities saveable, and every reconciliation closed against a named count.
Ownership was reassigned off the admin login across roughly 128,573 records, ordered by object against the daily API cap. 51,555 activity dates were restored from source with an honest technical note about which timestamps cannot be backdated. 1,363 accounts were restructured in a single load after the field-options document was approved, moving geography out of the type field into a dedicated location field. The team runs it with an edition-limitations document, a self-serve picklist article, recorded walkthroughs, and passkeys enrolled for all five users with org-level MFA live.
"The client reported 73 missing records. The diff found roughly 1,100, because the real problem was not the 73, it was the two-week-old export the migration had been built from."
Client names are withheld. Industry, size, timeline, and metrics are drawn from engagement records.