Skip to content

Systems integration

Laravel Integration Engineering

Connecting a Laravel application to the systems a business already runs on - ERPs, payment providers, e-invoicing platforms and banks - and surviving the day the other side is down.

Very few applications are alone. There is an accounting system that owns the invoice numbers, a payment provider that decides when money is real, a warehouse that has opinions about stock, and increasingly a tax authority that requires documents in a structured form.

Integration is where most of the genuinely hard engineering in a business application lives, and it is almost always underestimated - because the code is straightforward and everything around it is not.

What we connect

Accounting and ERP. SAP, Logo, Netsuite, Xero, Sage and whatever a business has been running since before anybody currently employed there arrived. The recurring problem is not the protocol - it is that both systems believe they own the same record, and nobody has decided which one wins.

Payment providers. Cards, local methods, direct debit mandates, marketplace splits. Each has its own model of what a payment is, and the differences reach the order table rather than stopping at the API client - Stripe is the worked example, and the rest differ in the details rather than the shape.

E-invoicing platforms. Increasingly compulsory and increasingly different per country - ZATCA, XRechnung, Peppol, and whichever accredited provider sits in the middle. An invoice becomes an asynchronous document with a state machine attached.

Banks and files. Statement imports, payment files, reconciliation. The formats are old, badly documented and unforgiving, and the work is matching rather than parsing.

Everything else. Shipping carriers, SMS, identity providers, CRMs, government registries.

The parts that decide whether it works

A boundary you own. Your application talks to your interface; one implementation talks to their API. This costs almost nothing to build and it is what makes replacing a provider a week rather than a quarter - which matters more than it sounds, because providers get acquired, deprecate versions and change pricing.

Idempotency, because everything arrives twice. Webhooks are redelivered. Retries fire after a request that actually succeeded. A network timeout tells you nothing about whether the other side processed it. Every write that crosses the boundary needs a key that makes the second attempt a no-op, and that key belongs in the schema rather than in a developer's intentions.

A decision about failure, per integration. When their system is down: does the user's action fail, queue, or proceed degraded? Charging a card is not sending a marketing email, and treating them the same way is how an outage at a vendor becomes an outage at your company.

Rate limits respected deliberately. Backoff, a queue that spreads work, and a ceiling you set rather than discover. Being throttled because you sent a year of backfill in four minutes is a self-inflicted incident.

A log of what was exchanged. Every request and response, retained for long enough to settle an argument. When the other party says they never received it, this is the difference between a five-minute answer and a fortnight.

Reconciliation is the real work

Two systems that hold the same facts will disagree. Not might - will, because messages are lost, corrections are entered on one side, and somebody edits a record by hand at some point.

An integration that assumes agreement discovers the drift when a customer complains. An integration built properly checks: a scheduled job that compares both sides, a report of differences, and a defined resolution for each kind. It is unglamorous and it is the difference between a connection you trust and one you have to spot-check forever.

How an engagement runs

Send the API documentation of whatever you need to talk to, and credentials for a sandbox if one exists. Most of the sizing happens by reading what the other side actually guarantees instead of what its marketing page says.

The scope that comes back lists each integration, its failure modes, and what reconciliation will have to do about them. It carries a price and it is what the contract points at. If one of the integrations turns out to be a research project rather than a build, that is a separate line in the scope instead of a surprise in month two.

Then the work, in your repository, with reconciliation built at the same time as the happy path.

What you receive

The integration as reviewable pull requests, the interface that isolates the vendor, the queue and retry behaviour with its failure decisions written down, the reconciliation job and its report, and a document describing what is exchanged and what happens when it is not.

Where the work touches invoicing or tax reporting in a specific country, the constraints for that market are part of the scope rather than a discovery - Germany, Saudi Arabia, the UAE, the UK and the Netherlands each have pages describing what changes there.

Scope and terms

Engagement model
Fixed scope, agreed in writing before work starts. Not a day rate against an open backlog.
Price and timeline
Both are set per project, once the scope is. Quoted together, before anything is built.
What we need from you
One person who can approve decisions, and access to your repository and issue tracker.
Not included
Anything outside the agreed scope. It becomes its own scope rather than a variation order.
Third-party costs
Hosting, licences, API fees and SaaS subscriptions are contracted and paid by you.
Invoicing
Codefacture Yazılım A.Ş., Türkiye. EUR, USD or GBP by bank transfer, with no Turkish VAT on exported services.

Frequently asked questions

The other system has no API. Is that a dead end?
Rarely. A great deal of working integration is files - a nightly export over SFTP, a fixed-width format documented in a PDF from 2011, a database view somebody exposes for you. It is less elegant and it is frequently more reliable than an API nobody maintains. What matters is that the exchange is explicit and monitored.
How do you handle an integration that goes down?
By deciding in advance what the application should do, per integration, and writing it down. Queue and retry, fail the user's action, or continue degraded - all three are correct somewhere, and the wrong outcome is a system that picks one by accident because nobody was asked.
Do you work with the other vendor?
We do where it helps, and we ask for it early. Most integration schedules are decided by how long the other side takes to answer a question, not by how long the code takes to write - so the first task is usually finding out who that person is.
Can you take over an integration somebody else built?
Often, and it starts with finding out what it actually does rather than what it was meant to do. Integrations accumulate undocumented behaviour faster than anything else in an application, because each fix is made under time pressure against a system nobody controls.
Call us+1 848 272 7583WhatsApp+90 850 308 5436Emailinfo@codefacture.comContact page