Enterprise Integration and Automation Hub: Webhooks, n8n, and Reliable Sync
How to connect ERP, CRM, SaaS, and marketplaces reliably. Idempotency, retries, reconciliation, webhooks, dead-letter queues, and where automation platforms fit.
The Real Cost of Systems That Do Not Talk
Let me be direct: most companies do not have a software problem, they have an integration problem. The ERP does not know what the shop sold. The CRM does not know what support resolved. The marketplace does not know the price changed. So people become the integration, copying data between screens, and every copy is a chance to get it wrong.
The fix is not another all-in-one platform that promises to replace everything. It is an integration layer that connects what you already run, reliably, so data flows between systems without a human in the middle. The hard part is not calling an API. The hard part is doing it reliably when the network drops, the other system is down, or the same event arrives twice.
Anyone can call an API once. Integration engineering is what happens when the call fails, the message duplicates, or the two systems disagree about what is true.
We build integration layers as part of our data engineering and custom software practices, and we run an event-driven integration spine inside our own Exfinity platform. This guide is the reliability engineering that separates a working integration from a fragile one. For the business case behind automating this kind of back-office plumbing, see real AI isn't a chatbot.
Who Cares About What
| Role | The real question | What good looks like |
|---|---|---|
| Operations lead | Does data flow without manual copying? | No human re-keying between systems |
| Integration engineer | What happens when a call fails? | Retries, idempotency, a dead-letter queue |
| CTO | Can we add a new system without a rewrite? | A hub pattern, not point-to-point spaghetti |
| CFO | What does the manual reconciliation cost? | A baseline, then the saving |
| Compliance | Is every transfer traceable? | An audit trail on every sync |
The Architecture: Hub, Not Spaghetti
The first decision is topology. Point-to-point integrations grow into an unmaintainable mess: connect five systems directly and you have up to twenty connections to maintain, each with its own retry logic and failure modes. A hub topology routes through a central layer, so each system connects once.
Point-to-point (avoid) Hub (prefer)
ERP ─── CRM ERP ──┐
│ ╳ │ │
Shop ── Support CRM ──┼──▶ Integration hub ──┬──▶ Shop
│ ╳ │ │ │
Market ... Market┘ └──▶ Support
The hub owns the reliability concerns once, instead of every integration reinventing them. This is the same reasoning behind our event-driven architecture guide, and it is why a well-designed integration layer ages better than a pile of scripts.
The Two Modes: Sync and Events
Integrations come in two shapes, and mixing them up causes most of the pain.
Synchronous calls happen in the request path. A user clicks, you call another system, you wait for the answer. Use this only when the caller genuinely needs the result now, and keep it fast, because you inherit the other system's latency and downtime.
Asynchronous events happen out of band. Something happened, you record it, and the integration processes it when it can. Use this for everything that does not need an immediate answer, which is most of it. It decouples you from the other system's availability.
| Mode | Use when | Risk |
|---|---|---|
| Synchronous | Caller needs the answer now | You inherit the callee's downtime |
| Asynchronous | Fire-and-handle-later | Complexity, needs a queue and retries |
Getting this split right is the single biggest reliability decision. Our API design for long-term systems guide covers how to model the contracts, and the async machinery is where the rest of this guide lives.
Idempotency: The Non-Negotiable
Here is the rule that beginners skip and seniors never do: every operation that changes state must be idempotent. Running it twice must have the same effect as running it once.
This is not optional, because at-least-once delivery is the norm. Networks retry, queues redeliver, users double-click. Without idempotency, a retried "create order" becomes two orders, and a redelivered "charge card" becomes two charges.
// Idempotent create: same key, same result, no duplicate
async function createOrder(payload, idempotencyKey) {
const existing = await store.get(idempotencyKey);
if (existing) return existing; // already done, return the same result
const order = await doCreate(payload);
await store.put(idempotencyKey, order); // record under the key
return order;
}
In Exfinity, checkout operations carry idempotency keys precisely so a retried booking cannot create a duplicate order. The moment your integration writes to another system, this is the first thing to build, not the last. Our concurrency and data integrity guide goes deeper on why.
Retries, Backoff, and the Dead-Letter Queue
Things fail. The question is what happens next. A good integration retries transient failures with exponential backoff, and after a bounded number of attempts, it moves the message to a dead-letter queue instead of dropping it or retrying forever.
Message ──▶ process ──fail──▶ retry (backoff) ──fail──▶ retry ──fail──▶ dead-letter queue
│ │
success human or job
▼ inspects, replays
done
The dead-letter queue is the difference between "we lost some orders and do not know which" and "here are the three messages that failed, with the reason, ready to replay." Exfinity runs dead-letter queues on its asynchronous processors, and a healthy system keeps them empty, so a non-empty queue is an alert, not a mystery. This visibility is the whole point. Our observability in modern systems guide and OpenTelemetry patterns guide cover how to see into these flows.
Webhooks: Receiving and Sending
Webhooks are how systems tell each other something happened without polling. They are also a common source of silent failure, because sending a webhook is fire-and-forget by default.
Sending them reliably means the same discipline: retry on failure, back off, dead-letter after a bound, and sign the payload so the receiver can verify it came from you. Receiving them reliably means verifying the signature, responding fast, and doing the real work asynchronously so a slow handler does not cause the sender to time out and retry.
| Direction | Must do |
|---|---|
| Sending | Sign payloads, retry with backoff, dead-letter, log delivery |
| Receiving | Verify signature, ack fast, process async, dedupe by event id |
There is also a security trap here. A webhook or callback URL can be pointed at your internal network to probe it, a class of attack called server-side request forgery. The defense is a fail-closed allowlist that validates the destination before you ever make the call. Exfinity validates outbound webhook targets against a unicast allowlist for exactly this reason. We cover this and related hardening in our cloud security hardening guide.
Reconciliation: When Systems Disagree
Even with perfect retries, two systems drift. A message gets lost, a manual edit happens on one side, a bug slips through. Reconciliation is the periodic job that compares the two sources of truth and fixes or flags the differences.
This is the safety net that catches what event processing missed. A nightly job that compares order counts, or product prices, or customer records between systems and reports the deltas turns silent drift into a visible, actionable list. Skip it and you find out about drift from an angry customer. Build it and you find out from a dashboard.
Daily reconcile:
System A records ──┐
├──▶ compare ──▶ deltas ──▶ auto-fix safe ones,
System B records ──┘ flag the rest for review
This is standard data engineering discipline, and it is the difference between an integration you trust and one you cross your fingers over.
Versioning Contracts: Change Without Breaking
Integrations break most often not from bugs but from change. One system updates its API or its event shape, and everything downstream that assumed the old shape falls over. A mature integration layer treats the contract between systems as a versioned artifact, not an assumption.
The practical discipline is small and pays off constantly. Version your event and API contracts explicitly, so a consumer knows which shape it is receiving. Add fields rather than repurposing existing ones, so old consumers keep working while new ones use the additions. Validate incoming payloads against the expected schema at the boundary, so a malformed or changed message is rejected loudly at the edge instead of corrupting data three steps later.
| Practice | Prevents |
|---|---|
| Versioned contracts | Silent breakage when a system changes |
| Additive changes only | Old consumers breaking on new fields |
| Schema validation at the edge | Bad data spreading through the pipeline |
This is the same long-term thinking as our API design guide, applied to the seams between systems. A contract you can evolve is a contract that survives, and it is the difference between an integration that ages gracefully and one that needs a rewrite every time a vendor ships an update.
Where Automation Platforms Fit
Not every integration needs custom code. Tools like n8n let you wire up flows visually: when this happens in system A, do that in system B. For straightforward, low-volume flows, this is faster to build and easier to change than bespoke code, and it puts simple automations in reach of an ops team.
The honest guidance on where the line sits:
| Use a visual automation platform | Build custom |
|---|---|
| Simple, low-volume flows | High-volume or latency-sensitive |
| Frequently changing logic | Complex idempotency and reconciliation |
| Ops-owned automations | Core revenue-path integrations |
The mistake is at both extremes: hand-coding a trivial two-step flow, or running your entire order pipeline through a visual tool that cannot give you the idempotency and observability guarantees a revenue path needs. Use the right tool per flow. Our consulting team helps draw that line, and our AI workflow design guide covers where AI agents fit into these flows.
What It Costs and When It Pays Back
Integration work pays back on volume of manual transfers. If someone spends hours a week copying data between systems, or if reconciliation errors cost you refunds and support time, the return is direct. The saving is the labor removed plus the errors prevented, and the errors are often the bigger number.
A focused integration between two systems reaches production in weeks. Sketch a rough range with our calculator, then get a real number through our quote flow. This is core work for our custom software and data engineering teams.
Common Ways This Goes Wrong
- Point-to-point everything. The connection count explodes and nothing is maintainable. Route through a hub.
- No idempotency. Retries create duplicate orders and double charges. Make every write idempotent.
- Dropping failed messages. Silent loss is the worst outcome. Dead-letter and make failures visible.
- Fire-and-forget webhooks. Unsigned, unretried webhooks fail silently. Sign, retry, dead-letter.
- No reconciliation. Systems drift and you learn from customers. Compare and flag on a schedule.
- Wrong tool for the flow. A visual tool on a revenue path, or custom code for a trivial flow. Match the tool to the stakes.
Who Builds This
Oronts is a founder-led software company in Munich. Refaat Al Ktifan, our founder and solution architect, leads a senior team across backend and data. We have built integration layers connecting ERP, commerce, and support systems, and we run an event-driven spine inside Exfinity with idempotency, dead-letter queues, and signed webhooks. We design the hub, build the reliability layer, and hand you integrations you can operate and trust. See our services and solutions pages.
Takeaways
- Most "software problems" are integration problems. Connect what you run, reliably.
- Route through a hub, not point-to-point, so reliability lives in one place.
- Make every state-changing operation idempotent, because delivery is at-least-once.
- Retry with backoff, dead-letter failures, and reconcile on a schedule to catch drift.
- Use visual automation platforms for simple flows and custom code for revenue paths.
A good integration is invisible. Data is just correct in every system, all the time, and nobody remembers the last time someone copied a number by hand. That invisibility is the reliability engineering underneath.
If your systems do not talk, or people are the integration, tell us what you run. Start at contact or get a scoped quote.
Topics covered
Related Guides
Event-Driven Architecture in Practice: What Actually Goes Wrong
Real event-driven architecture patterns from production. Event storms, bidirectional sync loops, dead letters, idempotency stores, and choosing between Kafka, RabbitMQ, BullMQ, and Symfony Messenger.
Read guideConcurrency and Data Integrity: The Patterns That Saved Our Production
Production concurrency patterns for enterprise systems. Field ownership, optimistic locking, cooperative leases, idempotency stores, version management, and transaction governance layers.
Read guideDesigning Systems for Failure (Because They Will Fail)
Failure response patterns for production systems. Circuit breakers, retry strategies, graceful degradation, dead letter handling, timeout budgets, and chaos engineering for small teams.
Read guideBuilding something like this?
We design and ship production systems like the one in this guide. Talk to the engineers who wrote it, no sales pitch.
Start a conversation