Skip to content

Connecting systems

Integrations thatkeep workingafter launch

Who it’s for
Product teams, Agencies, Operations teams
To start, send
Each system’s name and plan
Pricing
Quoted for each project

We connect your application to CRMs, payment providers, online stores and internal systems, and plan for the day the other side fails or changes.

  1. Interface (not central to this service)
  2. Logic (not central to this service)
  3. Data (not central to this service)
  4. Integrations (used by this service)
  5. Deployment (not central to this service)

Is this for you?

Getting two systems to talk is usually quick. Keeping them in step is the hard part. A payment provider sends the same notification twice and a customer is charged twice. A CRM is down for an hour and new leads go missing. A field means one thing in the shop and another in the warehouse system.

We read both sides’ documentation properly, try anything unclear in test accounts, and plan for what happens when a step fails. Then we make sure someone finds out when it does, instead of hearing about it from a customer.

Who it’s for

  • Product teams

    Your application needs to exchange data with a payment provider, CRM, accounting tool or partner API.

  • Agencies

    A client’s website has to connect to their stock, booking or membership system, and that isn’t work your team usually does.

  • Operations teams

    Staff copy data from one system to another by hand. It’s slow, and mistakes creep in.

Usually, one of these has just happened

  • Someone exports data from one system every morning and types it into another.
  • An integration fails now and then, and nobody notices until a customer complains.
  • A provider is retiring the version of its API you rely on.
  • You’re adding a new platform and it has to work alongside the old ones.

What you get

  1. A written plan, agreed first

    What data moves in which direction, how often, what triggers it, and how each field in one system matches a field in the other.

  2. The integration itself

    Code that signs in to each system, stays within their usage limits and checks everything it receives, running in an account you control.

  3. Safe handling of notifications

    Incoming notifications (webhooks) are checked, recorded and processed once, so a duplicate or late message can’t change the data twice.

  4. Monitoring and alerts

    A log of what was sent and received, an alert when failures start piling up, and a list of anything that needs a person to look at it.

  5. Instructions for when things go wrong

    How to change passwords and keys, re-run failed updates, and what to check when the other system is down.

What happens to every incoming event

This is the sequence we use when another system sends us notifications. Each step knows what to do if it fails, so a problem stays contained instead of quietly losing data.

  1. 1

    Receive

    A public endpoint accepts the request.

    If it failsProvider retries delivery on its schedule.

  2. 2

    Verify

    Signature and timestamp checked against the raw body.

    If it failsRejected and logged; repeated failures alert.

  3. 3

    Record

    Event stored with its provider ID before anything else.

    If it failsEndpoint returns an error so the provider retries.

  4. 4

    Acknowledge

    2xx returned within the provider’s timeout.

    If it failsNothing is lost: the event is already recorded.

  5. 5

    Deduplicate

    Events already processed are skipped.

    If it failsUnique constraint prevents double processing.

  6. 6

    Process

    Mapped and applied to the target system.

    If it failsRetried with increasing delays.

  7. 7

    Review list

    Events that exhaust retries are held for a person.

    If it failsAlert sent; event can be replayed after a fix.

  8. 8

    Reconcile

    A scheduled comparison corrects any drift.

    If it failsDifferences reported for review.

Illustrative code

A webhook endpoint, annotated

A simplified example written for this page, not code from a client project. It shows the choices we’d normally make.

Illustrative code.ts
// app/api/webhooks/inventory/route.ts
export async function POST(req: Request) {
  const raw = await req.text()                              1
  const event = verifySignature(raw, req.headers, SECRET)   2
  if (!event) return new Response(null, { status: 401 })

  const inserted = await db.webhookEvents.insertIfAbsent({  3
    id: event.id,
    type: event.type,
    receivedAt: new Date(),
  })
  if (inserted) await queue.send("inventory.apply", event.id)  4

  return new Response(null, { status: 202 })                5
}
  1. 1Read the raw body first. Re-encoded JSON wouldn’t match the signature.
  2. 2Signature and timestamp checked; stale or forged requests are rejected.
  3. 3The provider’s event ID is stored once, so a duplicate does nothing.
  4. 4Processing happens off the request, from a queue with retries and a review list.
  5. 5The provider gets a fast acknowledgement and has no reason to resend.

Before we start

What we’ll need from you

Each system’s name and plan
What an API can do, and how often you can call it, often depends on the plan you pay for.
Their API documentation
Or a contact at the provider if the documentation has gaps.
Test accounts
Testing against live data is risky, and sometimes not allowed.
Access keys, shared securely
Through a password manager, and limited to what the integration needs.
Some example records
Real examples show up mismatches that a specification misses.

Decisions we’ll help you make

Webhooks, polling or both?

Webhooks, where the other system tells you when something changes, are faster and cheaper if it sends them reliably. Polling, where you ask it every few minutes, is simpler and sometimes the only option. Where the data has to be right, we usually add a scheduled check that compares both systems.

Build it, or use an integration platform?

Tools like Zapier or Make work well for simple, common connections. Custom code is better when the data needs a lot of translating, there’s a lot of it, or errors need careful handling. If the simpler option will do, we’ll say so.

Which system is the source of truth?

Each piece of data needs one system in charge of it. If two systems can both change the same thing, they’ll eventually disagree, and deciding the rule at the start is far cheaper than sorting out the mess later.

Real-time or batched?

Instant updates are more complicated and more easily upset by outages. Plenty of processes work perfectly well with an update every few minutes, or once a night.

How the work runs

  1. 1

    Read the documentation

    For both systems, including their limits and what they promise about notifications.

  2. 2

    Test what’s unclear

    Small experiments in test accounts wherever the documentation is vague.

  3. 3

    Agree the plan

    Which field goes where, how it’s converted, and which system is in charge.

  4. 4

    Build for failure

    Retries that back off, duplicate checks, and a holding list for anything that keeps failing.

  5. 5

    Run side by side

    Where we can, alongside the current process, comparing results before switching over.

  6. 6

    Hand over

    Alerts set up, instructions written, and the keys in your accounts.

Usually included

  • Connections between your application and other services’ APIs
  • Receiving and processing webhooks
  • Matching, converting and moving data between systems
  • Monitoring, alerts and scheduled checks

Not included unless agreed

  • Changes inside another company’s platform that only they can make
  • Negotiating API access or pricing with providers
  • Integrations that need hardware on site

Every integration relies on someone else’s system, including its documentation, uptime, usage limits, prices and how often it changes. We can work around those limits but can’t remove them, and we’ll tell you about any that put the project at risk.

The full process, from first message to handover, is on How we work.

Related work

A regional logistics group, via its digital agency

Bringing regional purchase approvals into one portal

A purchasing portal for a logistics group across Singapore and Malaysia: one place to request, approve and track every purchase, connected to the finance system.

Layers
Interface, Logic, Data, Integrations, Deployment
Stack
Next.js, TypeScript, Node.js
Read the case study

How the costis worked out

The cost depends heavily on the other systems, and that’s also where the unknowns are. So we often suggest a short fixed-price first step to read the documentation and test the APIs, then estimate the build.

After a first call, we send a written quote that says what’s included and what isn’t.

What affects the cost

  1. How many systems and connections are involved
  2. How good each API’s documentation and test accounts are
  3. How much the data needs translating between systems
  4. Whether data moves one way or both ways
  5. How many records there are, and the providers’ usage limits
  6. How much monitoring and checking you need

Questions

Can you integrate with a system that has no public API?

Sometimes. There may be a partner API, an export feature, or a database we’re allowed to read from. Reading data off its web pages is a fragile last resort, and we’ll tell you if that’s the only way.

What happens when the other system changes its API?

Providers usually announce changes in advance, and monitoring catches the ones they don’t. Updating the integration is maintenance work, which we can cover under a maintenance arrangement.

Where does the integration run?

In your own hosting, usually as serverless functions alongside your application or as a small service in your cloud account.

How do you handle credentials?

They’re stored as secrets in your hosting platform, never in the code, and limited to what the integration actually needs.

Need two systems to talk to each other?Discuss a project →Tell us which systems are involved, what should move between them, and how it’s done today. We’ll come back with the questions that decide the approach.