Deals waiting on an integration you have not built
Your sales lead has three agencies who like the demo and one question: does it work with our CRM? One runs Reapit, one runs Alto, and one is on a smaller system you have never heard of. You built the Reapit connection first because your launch customer used it, and it took a developer most of a quarter. Alto is half done. The third is not on the plan at all.
Meanwhile your existing customers are asking for fixes to the Reapit connection, because their fields do not match the ones your launch customer used. Every integration request, new or old, goes to the same two developers, and the product roadmap slides back a little each month.
Why each CRM feels like starting again
The usual cause is not the CRMs themselves. It is that the first integration was built directly into the product. Your code reads a Reapit property, Reapit's idea of a negotiator and Reapit's status values, and the rest of the product grew around those shapes.
When the second CRM arrives, its statuses do not line up, its applicants are structured differently, and it identifies branches in its own way. The only option is another set of special cases inside core code, and each special case makes the next integration harder.
| Concept | Why it differs between CRMs |
|---|---|
| Property status | Sold STC, under offer and let agreed are named and ordered differently |
| Applicant | Some CRMs hold buying criteria on the contact, others on a separate record |
| Branch and negotiator | Different identifiers and different rules for shared listings |
| Change notifications | Some push webhooks, some need polling, some offer neither for every object |
| Custom fields | Agencies add their own, which your product may need to read |
The cost of every integration going through core code
Sales cycles lengthen because the honest answer to the CRM question is often not yet. Agencies on less common systems are turned away, even when they are a good fit. Developers who understand the integrations become a bottleneck, and a bug fix for one agency's field mapping can break another agency's sync because they share the same code path.
There is also a support cost. When data looks wrong in your product, nobody can quickly tell whether the problem is in the CRM, in the mapping or in your own logic.
A connector layer, and what goes into it
What we build separates your product from the systems it talks to.
- We define your own internal model for the things your product cares about: properties, listings, applicants, vendors, landlords, branches, negotiators and their statuses, with your product's vocabulary rather than one CRM's.
- Each CRM gets an adapter that translates between its API and that model. The adapter owns authentication, paging, rate limits, polling or webhooks, and status mapping.
- Mappings that vary by agency, such as custom fields or unusual status names, live in configuration per agency rather than in code.
- Every sync writes a log of what came in, what it mapped to and what it could not map, so support can see the source of a wrong value.
- We add contract tests for each adapter against recorded API responses, so a change to one adapter cannot quietly break another.
- We move your existing integration behind the layer first, carefully and with both paths running side by side, before adding new ones.
After that, a new CRM is a bounded piece of work: one adapter, its tests and its configuration. It can also be built by someone who does not know the rest of your product in depth.
How the week feels afterwards
Sales can give a straight answer to the CRM question, including a realistic view of what an adapter for a less common system involves. A support person looking at a strange status opens the sync log and sees that the agency renamed a status in their CRM, which is a configuration change, not a code change. Developers work on the product again, and integration work becomes a queue that can be planned rather than an interruption.
Signs the backlog is a design problem
- Your core code checks which CRM an agency uses in more than a handful of places.
- A fix for one agency's sync has broken another agency's.
- Sales avoid prospects on less common CRMs because integration work is unpredictable.
- Only one or two people can explain how a CRM field reaches your screens.
- Custom field requests from agencies require a release.