Home / Case Studies / Data Unification

One customer, many accounts, no manual imports.

How custom middleware replaced manual CSV work with a nightly automated sync between core systems and a CRM.

The problem

The client held detailed customer records across several core operational systems. Each system used its own identifiers. A single customer could be tied to multiple accounts, share accounts with other customers through joint or authorized-signer relationships, and belong to one or more household groupings. The marketing and service teams used a CRM for campaigns, segmentation, and reporting, but the data had to be loaded by hand. That meant CSV exports from each core system, manual reconciliation, manual deduplication, and manual uploads into the CRM on a rotation that nobody wanted to own. Every load introduced errors. Every campaign built on that data inherited the errors. Every exception cost someone hours of cleanup.

The client wanted the manual work to disappear. They needed a nightly, automated, auditable sync that handled the multi-party relationships correctly, respected data privacy rules, and gave the team clear reports on what ran, what synced, and what failed.

The work

Alloy12's founder led the engagement. The work started with a data model in the CRM that could actually represent the client's reality, which was the hard part. The CRM's default contact model assumed one person, one record, one account. The client's reality was many people, many accounts, many households, with many-to-many relationships everywhere and role information on each relationship (primary, joint, authorized, etc.).

The delivered solution used custom objects in the CRM for persons, accounts, and households, with association labels and properties that captured the role of each relationship. A set of Node.js middleware scripts ran on a scheduled basis. Each script pulled from a specific source table in the client's core systems, resolved keys, checked for existing associations in the CRM to prevent duplicates, and created or updated the missing links via the CRM's batch API. Rate limiting, exponential backoff, and structured logging were built in from the start, so the load could run through the CRM's API limits without manual intervention.

Pre-run validation caught column and schema issues before a load started. In-run guards flagged records with missing keys, captured API errors, and retried transient failures. Post-run reconciliation produced a count of records linked, records skipped with explanations, and any records that errored. Runbooks documented how to run, rollback, and reprocess. Secrets and access tokens were stored in encrypted vaults, sensitive identifiers were masked in logs, and exports were encrypted at rest.

A separate middleware project handled CSV-based loads from the core systems into a different marketing automation tool, with grouping and representative-row logic for accounts that had multiple entries per customer. The same patterns applied: file watcher, automated processing on file arrival, batch sync, and structured logging.

What changed

Manual CSV imports stopped. The nightly sync ran without human involvement. The marketing and service teams got accurate, current data every morning with clear visibility into what synced and what needed attention. The data quality that campaigns depended on became a system property instead of a person's responsibility. The team recovered the hours they used to spend on CSV work and moved them to actual campaign and customer strategy.

Stack

The work combined custom Node.js ETL middleware, a PostgreSQL staging layer where applicable, a CRM platform with custom object modeling, HubSpot v4 Associations API for relationship management, file watchers for CSV-triggered pipelines, p-limit for rate-safe concurrency, and structured JSON and CSV reporting for auditability.

Why this matters for your business

Every enterprise has this problem in some form. Core systems hold the truth. The CRM is where the work happens. Keeping them in sync usually gets solved with a quarterly spreadsheet ritual that breaks at the worst possible moment. Alloy12 builds the plumbing that makes the sync boring. If your team spends meaningful time on manual data work to keep your CRM usable, that work can be gone in a few weeks.

Still loading your CRM from spreadsheets?

That is a solved problem. Alloy12 has built this pipeline at enterprise scale. Let us talk about yours.

Let's talk