Software
API integration services
Integrations are where estimates go wrong, because the demo works on the first call and the project lives in the failure cases. Here is what the work actually contains and how to scope it honestly.
By Umar HayatChief Technology Officer, Algo Vortex
Key takeaways
The happy path is a day
Auth, retries, rate limits, partial failures, and reconciliation are the project. Estimate those, not the first successful call.
Assume every write can repeat
Idempotency keys are not optional. Without them a retry creates a duplicate order, payment, or shipment.
Never trust a webhook alone
Webhooks get lost, duplicated, and delivered out of order. Always have a reconciliation job that catches what the webhook missed.
Own your data model
Map the vendor's shape into your own. A schema that mirrors whichever API you integrated first becomes a problem at the second one.
Why do integration estimates slip so reliably?
Because getting a successful response from an API takes an afternoon, and everyone estimates from that. The documentation is read, a token is obtained, a call returns data, and it feels basically done. The remaining work is invisible until you meet it.
The actual work is in the states nobody demonstrated. What happens when the call times out but the vendor did process it. What happens when you hit a rate limit halfway through a batch. What happens when the vendor returns a two hundred status with an error inside the body, which is more common than it should be. What happens when a field the documentation describes as always present is absent for one customer.
Then there is the mismatch between the vendor's model and yours. Their customer object has fields yours does not and lacks fields yours requires. Their status values do not map cleanly onto your states. Their identifiers are not the ones your users know. Resolving that is design work, not plumbing.
A useful rule when estimating: whatever the happy path takes, the production-ready integration takes five to eight times longer. That multiplier sounds absurd until you have shipped a few, and then it stops sounding high.
What does the work actually consist of?
Authentication and credential lifecycle. OAuth flows with refresh handling, API key rotation, and whatever bespoke scheme older vendors use. Tokens expire at inconvenient times and the handling has to be automatic, because a manual refresh is an outage waiting for a weekend.
Rate limits, treated as a design constraint rather than an error. Learn the limit, respect it proactively with a queue or a token bucket, and back off exponentially with jitter when you are throttled anyway. Discovering rate limits in production during a busy period is a common and avoidable incident.
Retries with idempotency, which is the single most important thing on this list. Any write that can be retried must carry an idempotency key so the vendor can recognise a repeat. Without it, a timeout on a payment call becomes two payments, and finding out which happened requires a reconciliation you have not built yet.
Error taxonomy. Sort failures into transient, meaning retry; permanent, meaning stop and surface it; and ambiguous, meaning check the state before doing anything. Ambiguous is the dangerous category and it is where the interesting bugs live.
And observability. Log every request and response with a correlation identifier, keep them long enough to investigate a dispute, and redact anything sensitive on the way in. When a customer says an order never reached the warehouse, you want to answer from data rather than from memory.
Concern
Auth lifecycle
What it needs
Automatic refresh, key rotation
Cost of skipping it
Weekend outage
Concern
Rate limits
What it needs
Proactive queue, backoff with jitter
Cost of skipping it
Failures during peak load
Concern
Idempotency
What it needs
Keys on every write
Cost of skipping it
Duplicate payments and orders
Concern
Error taxonomy
What it needs
Transient, permanent, ambiguous
Cost of skipping it
Retrying things that should stop
Concern
Reconciliation
What it needs
Scheduled comparison job
Cost of skipping it
Silent drift nobody notices
Concern
Observability
What it needs
Correlated request logs
Cost of skipping it
Disputes settled by guessing
| Concern | What it needs | Cost of skipping it |
|---|---|---|
| Auth lifecycle | Automatic refresh, key rotation | Weekend outage |
| Rate limits | Proactive queue, backoff with jitter | Failures during peak load |
| Idempotency | Keys on every write | Duplicate payments and orders |
| Error taxonomy | Transient, permanent, ambiguous | Retrying things that should stop |
| Reconciliation | Scheduled comparison job | Silent drift nobody notices |
| Observability | Correlated request logs | Disputes settled by guessing |
How should webhooks be handled?
Verify the signature before doing anything else, and reject anything unsigned. An unauthenticated webhook endpoint is an open write path into your system, and it is a surprisingly common oversight.
Acknowledge fast and process asynchronously. Return a success status immediately and put the payload on a queue. Vendors treat a slow response as a failure and retry, so doing real work inside the request handler produces duplicate processing under load, which is exactly when you least want it.
Assume duplicates and out-of-order delivery, because both happen routinely. Deduplicate on the event identifier and use the vendor's timestamp or version rather than arrival order to decide whether an event is stale. An old status arriving after a new one should not overwrite it.
And build the reconciliation job regardless. Webhooks get lost, for reasons ranging from your own deploy window to the vendor's outage. A scheduled job that compares your state against theirs and repairs differences is the difference between a system that drifts silently and one that corrects itself. This is the single most valuable thing most integrations are missing.
Do you need an integration layer?
For one or two integrations, no. Put them in your application with clean boundaries and move on. Building infrastructure for a problem you have twice is premature.
Past about four integrations, or when several systems need the same data, a dedicated layer starts earning its place. What it gives you is one place where retries, rate limiting, credential storage, and logging are implemented once rather than repeated with subtle differences in each integration. The subtle differences are the problem it actually solves.
Whether that layer is an integration platform product or a small service you own depends on volume and how unusual your transformations are. Platform products handle standard connections quickly and become awkward when the mapping needs real logic. A service you own is more work up front and does not have a ceiling.
Either way, define your own canonical model in the middle. Every vendor maps into your shape, never the reverse. A schema shaped like whichever API arrived first is a decision you will pay for at the second and third one.
How do you assess an API before committing?
Read the error documentation rather than the getting-started guide. Every vendor makes the first call easy. A vendor who documents their error codes, rate limits, retry semantics, and idempotency support has thought about production use. One whose documentation ends after authentication has not.
Check whether there is a sandbox that behaves like production, including its failures. A sandbox that only returns success is worse than no sandbox, because it produces confidence you have not earned.
Look for a public status page with history. Not because outages are disqualifying, everyone has them, but because a vendor who publishes incident history is a vendor who expects to be held to it.
And test the failure cases yourself during evaluation. Send a malformed request, exceed the rate limit deliberately, and revoke a token mid-session. How the API behaves when things go wrong tells you more about the integration cost than any amount of documentation.
How do you scope an integration honestly?
Count the operations, not the vendors. Three read endpoints and one write is a small piece of work. One vendor with twelve operations, two of which move money, is not. An estimate that says one week per integration regardless of what the integration does is not an estimate.
Weight the writes heavily. Reads that fail can be retried without consequence. Writes that fail ambiguously require idempotency, reconciliation, and a defined recovery path, and that is where most of the engineering time goes.
Add explicit time for the vendor's specific weirdness, because there always is some. Undocumented required fields, inconsistent date formats, a status value that appears in practice but not in the specification. Nobody can predict which one it will be, and it is a mistake to plan as though there will not be one.
And insist that reconciliation is in scope from the start rather than added later. It is the thing that gets cut under time pressure and the thing whose absence causes the incident six months on. Custom software development cost covers how integrations shape overall project bands.
Next step
Got a stack that does not talk to itself?
Send the systems, the direction data needs to flow, and which operations move money. We will scope it with the failure cases included, not just the happy path.
Talk to Algo VortexRelated in this cluster
- Custom software developmentCustom software is the right call when a vendor tool forces awkward workarounds, or when your workflow is the product. This guide covers when to build, what an engagement includes, and how it differs from a template or a SaaS seat.
- Legacy system modernizationFull rewrites fail often enough that they should be the last option, not the first. The systems that get modernised successfully are the ones replaced one piece at a time while the old one keeps running.
- How to build custom softwareStart with the job, the users, and a first slice you can demo. Then data model, integrations, and a release in an environment you control. A platform for every department is how first builds die in committee.
- Custom software development costCustom software in 2026 lands in bands, not a single quote. The build, hosting, and the people who keep it all show up. Here is how those numbers typically break for a first production version.
Related capabilities
Related case studies
Live products where this kind of work showed up in the build.

Twilio + OpenAI inbox automation
RelayHub started from a blunt observation: phone and chat should not live in separate tools. Sales and support kept losing the thread when a caller switched to SMS or a chat widget. The brief was one shared inbox. Twilio traffic and digital messages land together. AI clears the routine work so people only jump in when judgment matters. Teams also needed to steer the assistant without shipping a new build every time the script changed. Admin-controlled prompts per contact group were in the brief from day one. File digests mattered too. Long PDFs and call notes piled up unread. The product needed a path from upload to a short summary the whole group could scan before the next shift. Nobody on the project believed every reply should be fully automated. Refund fights, tone-sensitive replies, and messy exceptions still need a human. RelayHub uses OpenAI to draft, summarize, and clear the easy queue so senior staff spend time on work that actually needs them.

RouteMind: fleet dispatch that cuts empty miles
AI fleet advisor + live load board
RouteMind exists so shippers and carriers can see loads, capacity, and routes in one place. Dispatch should cost less time and fewer wasted miles. The product pairs a live load board with an AI Fleet Advisor. Planners match freight to available trucks and compare paths with real map data instead of gut feel. Empty miles and stale boards were the business pain. When capacity is a guess, trucks deadhead and fuel burns for no revenue. Status, distance, and advisor guidance had to show up in the tools dispatchers already live in. Another spreadsheet export at the end of the shift was not going to cut it. Dispatchers needed advice that respected current capacity, not a generic logistics chatbot. The Fleet Advisor had to read live loads and vehicle state, then suggest moves a planner could accept or reject in the same UI. RouteMind was never meant to replace judgment. It was meant to cut the time spent assembling the picture before judgment starts.
Questions
More on all insights, custom software, or contact Algo Vortex.
