CRM Development & Integrations
CRM integration and custom development for Salesforce, HubSpot and Odoo. ERP, billing, e-commerce, telephony and data platforms connected with monitoring, daily reconciliation and a named owner built in — so you can always tell the data arrived.
Two-way sync, retry policy, dead-letter queue and an owner who gets paged. Written into the design, not discovered in production.
Where integrations break
Most integration projects are judged on whether the data arrives. They should be judged on what happens on the day it does not.
A token expires, a field is renamed, an API changes a limit. Records stop arriving. Nothing errors on screen, so the first signal is a report that looks slightly wrong three weeks later.
The opposite failure, and just as expensive. Retries hammer a dead endpoint, the channel fills with noise, and within a week people mute the alerts that were supposed to protect them.
Six systems, eleven direct connections, nobody able to say which one owns a changed phone number. Every new tool adds two more links, and the whole thing becomes unauditable.
The integration was built by a partner who left, documented in a spreadsheet, and monitored by nobody. When it breaks, the first 48 hours are spent working out who built it.
A failed sync should be a queued record with an error attached, not missing data. That is a design decision, not an operational hope: idempotent writes, a retry policy with backoff, a dead-letter queue you can inspect, a reconciliation job that compares counts daily, and a named person who gets paged.
What we build
Configuration first, code only where configuration genuinely runs out. Most integrations should be configuration, because configuration is what your team can still change in a year.
ERP, billing, e-commerce, telephony, support and data platforms connected to the CRM. Direction decided per object rather than per system, so you are never syncing a field in both directions and wondering which one wins.
Result: one customer record that finance, sales and support all accept.
Custom objects, custom-coded actions, Apex and Lightning components on Salesforce, custom modules on Odoo, custom-coded workflow steps on HubSpot. Built only where a standard object genuinely cannot carry the shape of the business.
Result: the system fits the process instead of the process bending to a picklist.
Approvals, routing, enrichment, deduplication at the point of entry, scheduled reconciliation, and the data cleaning that has to happen before any of it is trustworthy. Automation that is documented is automation that can be changed.
Result: fewer manual steps, and a record of what ran and when.
Monitoring, alerting, API version upgrades, retry tuning and a quarterly look at whether each connection still earns its place. An integration nobody maintains degrades on the platform's release schedule, not yours.
Result: it is still working in two years, and someone knows why.
The artefact
Before anything is built, you get a document that names every system, every direction, every field that moves and every failure mode. It is the thing you review, the thing you own, and the thing the next engineer will read.
Every row carries the same four facts in the delivered map: direction, frequency, failure behaviour and owner. A connection without those four is a diagram, not a design.
The honest question
Three options, three price points, and the cheapest one is right more often than vendors of the other two would like. We will tell you which applies before quoting.
| Approach | Right when | Watch out for |
|---|---|---|
| Native connector | Both systems are mainstream, the fields map one to one, and volume is modest. | Field changes on either side break it quietly. Test upgrades before they land. |
| Middleware or iPaaS | Several systems, several directions, and someone needs to see the errors without reading code. | Per-task pricing grows faster than usage. Model volume before you commit. |
| Custom code | The data model genuinely does not fit, volumes are high, or there is no connector for either side. | Whoever builds it has to be reachable in two years. Demand source access and documentation. |
There is no licence markup in our advice, and the recommendation is not funded by a partner programme.
How it runs
Integration work is mostly design. The code is the short part, which is why the map comes first and the build comes third.
Every system, who owns it, what it holds, and which direction data ought to move. Including the spreadsheet someone maintains because the old integration never worked.
Objects and fields per connection, direction, frequency, transformation rules, conflict resolution and failure behaviour. Reviewed and owned by you before build.
Configuration where it suffices, middleware where several systems are involved, code where the model genuinely does not fit. Built against a sandbox copy of both ends.
Failure injected on purpose: expired tokens, malformed records, endpoint timeouts. If the retry and dead-letter behaviour has never been exercised, it is not known to work.
Alerting that reaches a named person, a daily reconciliation count, an error queue someone can read, and an owner recorded in the map. Then hand over or maintain.
Proof
Three engagements where the useful work was connecting the system, not replacing it.
Limited integration with local banking platforms meant only around 60% of recurring donations processed. The fix was automated reconciliation against the bank, on the platform already in place.
Read case studyEnquiry volumes outgrew the process. Intake moved into one queue so every channel landed on a single record, with SLAs visible to the people who had to meet them.
Read case studyKYC onboarding moved out of email and spreadsheets into a single flow, where the compliance state is a field rather than a folder of attachments.
Read case studyWe will tell you which connections are worth building and which one is going to be the difficult one.
Across the platforms
Same discipline on all three: configuration where it suffices, code where it does not, and failure handling written in either way.
Apex, APIs, Platform Events
Apex, Lightning Web Components, Platform Events, Flow and the standard APIs. Middleware where several systems are involved, and a dead-letter queue where anything can fail.
Custom code and workflow actions
Operations Hub custom code, custom-coded workflow actions and the CRM APIs. The right answer when sync volume outgrows a native connector or the mapping is not one to one.
Python modules and the ORM
Python modules written against the ORM, scheduled actions and the external API, so the connection lives inside Odoo rather than in a script beside it that nobody owns.
FAQ
Before you connect anything
We will tell you which connections are worth building, which should be configuration, and which one is going to be the difficult one. That answer costs nothing and it is usually the shortest path to a scoped project.