Connect Your Tools

Your tools don't talk. That costs you a Monday, every week.

The phone system knows who called. The website knows who visited. The CRM knows who bought. Nothing knows all three at once, so somebody exports three files and stitches them together by hand — and by the time the spreadsheet is finished, it is already out of date.

  • Half an hour on a free stack walkthrough
  • A plan in writing — yours either way
  • Nothing gets replaced; up to 26 months of history loads on the way in

Below: the actual machinery, for the curious and the technical.

The machinery — 01

What the raw data actually looks like.

This is a sample of what each kind of tool hands us. Five systems describing overlapping facts, none of them agreeing on a name, a unit or a format.

call tracking{"caller":"+14155550142", "duration":214, "source":"gmb"}
search & seo{"query":"pump repair", "clicks":38, "position":3.4}
web analytics{"session":"s_9f21", "engaged_s":96, "medium":"organic"}
crm{"deal":"d_4471", "value":4820, "stage":"quote"}
email{"campaign":"c_212", "opens":1840, "replies":37}

Watch a record get normalized.

Every SaaS platform describes the same event a different way. A phone number is phone_number here, contactPhone there, dim_phone somewhere else — three formats, three field names, three ideas of what a duration means.

APIfl0w resolves that argument once, centrally, and keeps resolving it forever. Values land in a canonical record with full upstream lineage on every field. Fields we can't map are dropped loudly, never guessed at — you can read exactly what we discarded and why.

Many shapes in. One schema out.

call-tracking event
phone_number"(415) 555-0142"
call_duration_s214
utm_soup"gclid|fbclid|…"
dropped: unmapped
crm deal
contactPhone"+1 415 555 0142"
dealValue4820.00
analytics session
dim_phone"4155550142"
sessionDuration96
canonical record
phone
duration
engaged_s
value
source[]

This runs 3,300 times an hour across our fabric.

The machinery — 02

Connect. Normalize. Unify. Deliver.

Four stages, running continuously. Nothing here is a one-time migration — it is a service with a heartbeat.

STATION 01

CONNECT

We hold the credentials, poll the endpoints or receive the webhooks, honour every upstream rate limit, and backfill history on the way in. Retries use exponential backoff with jitter and a dead-letter queue you can inspect.

STATION 02

NORMALIZE

Each source field is mapped to a canonical field with an explicit type, unit and format. Phone numbers become E.164. Durations become seconds. Currency becomes minor units with an ISO code. Nothing is inferred silently.

STATION 03

UNIFY

Canonical records are deduplicated and merged on deterministic keys. Every field on a merged record carries lineage: which connector supplied it, at which sync, at which upstream timestamp.

STATION 04

DELIVER

One dashboard for the humans, one versioned REST API for the systems, and signed webhooks for anything that needs to react. Same records, same schema, three doors.

The machinery — 03

Operated, not shipped.

A connector is a thing somebody has to run. Here is what running it actually means.

Operated, not shipped

We run it after we build it

A connector is not a deliverable. Auth expires, endpoints deprecate, rate limits change without notice. Every connector we build stays on our monitors with our pager attached to it.

Median build: 2 weeks

New systems join the flow

Bring us a platform with a documented API and a credential we can scope down. Median time from stack walkthrough to first backfilled record in the hub is two weeks.

Category-first

Vendor swaps stop being projects

Because records are canonical, replacing the CRM behind type=deal changes a connector config. Your dashboards, exports and API consumers never notice.

Half an hour, and you will know what this takes.

Bring the list of tools you run and the report nobody wants to build again. You leave with a written plan either way.