Tutorials
3 min read
A practical integration checklist
The list I run through before an integration goes live, drawn from the failure modes that actually show up in production.
Checklists have a reputation problem. They are associated with compliance, not judgment. In practice, a short checklist is what stops a competent person from forgetting a boring detail at eleven at night.
This is the list I have built up for integrations, especially the ones that move money or customer data between systems that were designed separately.
Before you design anything
Most integration problems are decided before the first line of code is written. The questions worth answering early are about ownership and expectations:
- Which system is the source of truth for each field?
- Who is allowed to change a value, and who is notified when it changes?
- What is the realistic volume, and what is the peak?
- What is the acceptable delay between an event and its downstream effect?
- What should happen if the integration is unavailable for an hour? For a day?
If two systems both believe they own the same field, the integration will eventually disagree with itself. Better to find that out during design.
The contract
The interface contract is where most of the practical risk lives. I keep a short table of questions for every integration.
| Concern | Question to answer |
|---|---|
| Authentication | How does the credential work, and when does it expire? |
| Idempotency | What happens if the same request arrives twice? |
| Time | Which time zone, which format, and who converts? |
| Encoding | Is UTF-8 guaranteed for contents and file names? |
| Errors | Is the error response documented, or only the success case? |
| Rate limits | What does the client do on a 429? |
| Pagination | Is the ordering stable between pages? |
| Volume | What is the largest file or payload that can arrive? |
The table is not exhaustive. It is a prompt to stop assuming.
Before go-live
The tests below are the ones that have caught real problems. They are not replacements for a proper test suite; they are the awkward cases that suites tend to skip.
- Send a malformed request on purpose. Confirm the error is useful, and that it does not leak sensitive details.
- Replay a successful write. Confirm the receiving system does not create a duplicate.
- Run with an expired credential. Confirm the failure is clear and recoverable.
- Test the daylight-saving boundary. A request made at 01:30 on the transition day should not land on the wrong day.
- Send the largest realistic file. Not the sample. The one that is ten times bigger than the specification implies.
- Trace one request end to end. Confirm both sides log the same correlation id.
- Write the rollback before you need it. Know how to stop the flow, and what happens to the data already in flight.
A correlation id is worth more than a dashboard during the first incident. It should be generated by the caller, logged on both sides, and included in every support ticket.
curl -X POST https://api.example.com/v1/invoices \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: 01J9Z6W4K2" \
-H "X-Correlation-Id: impl-2026-07-12-0007" \
-H "Content-Type: application/json" \
-d @invoice.jsonAfter go-live
The first day is not the end of the project. A short window of deliberate attention catches the failures that only appear under real data:
- Watch the error rate, not just the success rate.
- Confirm that retries are not quietly creating duplicates.
- Check the credential rotation date and put it somewhere people will see it.
- Ask the operations team what they would need if this broke at 2am.
That last question is usually the most revealing one.
The checklist is not the point
The checklist is a way of making assumptions visible. The actual skill is knowing which assumption matters most for this integration, and testing that one first.
A checklist that is followed blindly is no better than no checklist at all. One that is short enough to be used, and specific enough to be uncomfortable, is worth keeping.
Written by
Mohannad Bakkar
Technology professional, systems thinker, and hands-on builder working across software, integrations, and technical delivery.
Previous article
Running a local model on modest hardwareNext article
Integrations fail at the edgesRelated articles
All articlesIntegrations fail at the edges
The happy path is the easy part. Most integration problems live in timestamps, retries, identity, and assumptions about who owns the data.
Designing offline sync for Basket
A grocery store basement is a bad place to depend on a network. Here is how the offline queue for Basket is taking shape, and where the hard decisions are.
What a home lab taught me about DNS
When the resolver goes down, everything goes down with it. The outage was self-inflicted, and the lesson stuck.