Ideas Engineered for Tomorrow
We Engineer Services & Solutions for Your Business Needs
Consulting Services Hire Book Consulting

ERP Integration Services in India

We run ERP integration out of India for the CTOs, founders and engineering managers who lead teams headquartered in the US, UK, Canada, Australia and New Zealand and need SAP, Oracle, NetSuite or Dynamics 365 to exchange data reliably with the rest of their estate. We build the integration layer, the reconciliation that proves it worked, and the error handling that finance can live with. We are integration engineers, not an ERP implementation practice, and the difference matters.

Why Is Integrating an ERP Harder Than Any Other Integration?

Every integration project has the same surface story. Two systems, one needs data from the other, write some code in between. ERP work looks like that on the estimate and behaves like something else entirely once you start.

The first difference is that the ERP is not a database with an API in front of it. When you post an invoice, the system derives tax, checks credit limits, validates the account assignment, hits the currency table, updates open item balances, writes to the general ledger, and creates entries in half a dozen tables that must agree with each other for the rest of the company's life. That is not a row insert. It is a business transaction with rules that a controller signed off on, and the interface you are calling exists to run those rules rather than to store your payload.

The second difference is the consequence of getting it wrong. If a marketing integration double-writes a contact, someone deletes one. If a finance integration double-posts a supplier invoice, you have paid twice, the payment run has already gone to the bank, and the correction is a documented reversal that an auditor will read next year. There is no delete in an ERP worth using. Everything you do wrong stays visible, which is exactly why the systems are built the way they are.

The third difference is organisational. The API you want to call belongs to a team that does not report to you, in a system whose change process is measured in weeks, running on an environment that finance has booked for close testing. In most other integration work the two ends are both yours. Here, one end is a shared corporate asset with its own governance, its own release calendar and its own idea of what an emergency is.

The fourth is time. ERP interfaces are built around a financial calendar, not a request-response loop. Periods open and close. Batches run in windows. A document created at one minute to midnight on the last day of a quarter belongs to that quarter even if it arrives four minutes later. Ignore the calendar and your integration will work fine for three weeks a month and cause a fight in the fourth.

None of this makes the work impossible. It makes it a different discipline from wiring two SaaS products together with webhooks, and the teams that get burned are usually the ones who priced it as the second thing.

What an ERP Integration Engagement Actually Covers

Scope changes with the ERP, the number of interfaces and how much of the estate is already integrated. The shape below is what we build, what we hand over, and where the boundary sits between our work and your ERP team's.

An interface register before any code

We list every flow that needs to exist, in both directions, with the business event that triggers it, the volume per day and per peak, the latency the business actually needs rather than the one they ask for, and the consequence of it failing for an hour. That last column is what decides architecture. A nightly item master sync that can miss a night is a different build from a stock reservation that cannot.

Field level mapping signed off by a human who owns the data

Every field, its source, its target, its transformation, its default when absent, and what happens when it fails validation. This document is the deliverable people skip and then regret. It is also where the master data ownership argument gets settled, because you cannot write the mapping without deciding who wins when both systems have a value.

The integration layer itself

Connectors, transformation, routing, queueing and retry, built either into your existing platform if you have one or as a service in your cloud if you do not. We write it in a language your team already runs. Where you already own SAP Integration Suite, Oracle Integration Cloud, MuleSoft, Boomi or Azure Integration Services, we build inside it rather than adding a parallel stack you then have to staff.

Error handling with an owner attached

Every failure lands in a queue that a named person or role monitors, with enough context to act on without opening the ERP. An error that only exists as a status code in a monitoring transaction nobody opens is not handled, it is deferred. We build the alerting around the failures that matter and deliberately do not alert on the ones that self-heal.

Reconciliation as a first class deliverable

Counts and value totals per run, per interface, with a report finance can read. If the two systems disagree, the integration should be the thing that tells you, not the auditor.

A cutover and backfill plan

Historic data migration, the sequence in which masters must land before transactions, the dual-running period, and the rollback position if the first close after go-live goes badly. Backfill is usually a bigger job than the ongoing interface and gets estimated as an afterthought.

Runbook and handover

How to reprocess a failed message, how to tell a transient failure from a data problem, what to do during close week, and which ERP objects the integration depends on. Definition of done for every interface is the same: it runs in your environment, on your schedule, reviewed by your engineers, with a reconciliation report that balances and a runbook someone who was not on the project can follow.

What we do not do, stated plainly

We do not configure your ERP. We do not design your chart of accounts, run a module rollout, do functional consulting or take over an implementation, and we do not describe ourselves as a certified SAP or Oracle practice. Those are separate skills held by separate people, usually your internal team or your implementation partner. Our work starts at the interface and ends at the interface. Saying this early avoids the far worse conversation in month three where two suppliers both assumed the other owned the posting logic.

Master Data and the Fight Over the Single Source of Truth

Most failed ERP integrations are not technical failures. They are unresolved arguments about who owns a record, discovered late and encoded by accident.

The argument nobody has out loud

Sales believes the CRM owns the customer, because that is where the relationship starts. Finance believes the ERP owns the customer, because that is where the credit limit, the tax registration and the payment terms live. Operations believes the warehouse system owns the item, because that is where the physical thing is. Everyone is right about their own field and wrong about the record. If you build the integration before someone decides, you will end up with a bidirectional sync where the last writer wins, and the last writer is whichever job happened to run second.

Ownership is per field, not per record

The workable answer is almost always split. The CRM owns the trading name, the contacts and the sales territory. The ERP owns the payment terms, the credit limit, the tax classification and the account group. Each field has exactly one authoring system and the other side is read only for it, enforced in the integration rather than in a policy document. When a user does change a read only field in the wrong system, the integration overwrites it on the next run and the user learns. That sounds harsh and is much kinder than silent divergence.

Identity, and who mints the key

The ERP has its own number ranges and will assign its own internal identifier whether you like it or not. Your other systems have theirs. The mapping between them is a real artifact that has to be stored, backed up and reconciled, not derived on the fly from a name match. We keep an explicit cross reference table with the external system, the external key, the ERP key and the date it was established, and we make the external key visible in the ERP record so a human troubleshooting at 2am can find it without a database query.

Duplicates already exist and will keep arriving

By the time you integrate, both systems already contain the same customer under two spellings, one with a trailing full stop and one without. Deciding the survivorship rules is a business exercise: which system wins per field, what confidence threshold justifies an automatic merge, and which cases go to a human queue. Automatic merging above a low confidence threshold is how you end up posting an invoice to the wrong legal entity, which is a bad day for everyone.

Chart of accounts and the mapping that outlives the project

Anything posting to the general ledger needs a mapping from your source system's concept to an account, a cost centre, a profit centre and often a project or a segment combination. That mapping is business logic, it changes when finance restructures, and it must not be buried in code. We hold it as configuration that finance can review, with a change history, because the request to add a new cost centre will arrive on a Friday during close and you do not want it to require a release.

Hierarchies and the things that do not map cleanly

Company codes, legal entities, subsidiaries, business units, plants, storage locations, warehouses, sales organisations. Source systems usually have a flatter model than the ERP, so one field on your side has to explode into three on theirs, using rules that come out of a conversation with finance rather than out of the data. Intercompany flows are the sharpest version of this, because the same physical movement becomes two postings in two entities that must reconcile to zero.

Why Do ERP Vendors Still Ship Batch, IDoc and BAPI Instead of REST?

Engineers arriving from a web background find the interface styles baffling. File drops. Idoc types with numbers on the end. Function modules that need an explicit commit call. It is not incompetence, and the reasons are not purely historical. There are reasons, and understanding them changes which interface you pick.

Posting is not writing

A REST resource model assumes a thing you can create, read, update and delete. An ERP posting has no delete, has restricted update, and creates several documents at once. Modelling that as a resource is possible but lossy, which is why the vendor-supplied REST endpoints are frequently thin wrappers over the older function calls and return their validation results in the payload rather than in the HTTP status. You can get a 200 back containing a rejection. Any client that only checks the status code will happily report success on a document that never posted.

Volume and the nightly window

Loading two hundred thousand price records through a per-record REST call is slow, expensive in API quota, and hard to make transactional. The file and batch interfaces exist because they are the right tool for that shape of work. Most ERPs will import a structured file, validate it in bulk, and give you a rejection file back. It feels dated. It also finishes in twenty minutes rather than six hours and gives you a single artifact to reconcile against.

Asynchronous by design, for good reason

An IDoc is a document that gets queued, processed and given a status. That indirection is what lets the receiving system be down for two hours without the sender caring, lets a failed message be corrected and reprocessed rather than resent, and lets you see the exact payload that was received months later. Replace it with a synchronous call and you have to rebuild all of that yourself, usually worse.

Where REST genuinely is the right answer

Real time lookups. Low volume, user-triggered actions. Anything where a person is waiting for a response. Availability checks, credit checks, order status queries and single document creation from a customer-facing app are all better over a modern API. The mistake is not choosing REST, it is choosing REST for the nightly load because it is the interface style the team already knows.

The practical rule we use

Synchronous for anything a human is waiting on, asynchronous and queued for anything a machine is waiting on, and file or bulk for anything counted in tens of thousands. Then design for the fact that a single business process usually needs two of these at once. An order might come in over REST, get confirmed synchronously, and have its financial posting go out in the nightly batch. That is a normal architecture, not a compromise.

SAP Integration: S/4HANA, OData, BAPI, IDoc and Integration Suite

SAP has the widest set of integration options and the steepest learning curve. Which one is right depends on whether you are on S/4HANA or an older Business Suite release, whether it is on premise or cloud, and what the flow actually is.

OData and the SAP Gateway route

S/4HANA exposes a large catalogue of OData services, both V2 and V4, published through SAP Gateway and documented in SAP's public API hub. This is the pleasant option: an HTTP endpoint, a metadata document, filtering and paging. The caveats are that the standard service may not expose the field you need, extending it means ABAP work by someone with a developer key, and OData is a poor fit for high volume posting. For read access and moderate transactional work it is where we start.

RFC and BAPIs, and the commit nobody documents

BAPIs are RFC-enabled function modules with a deliberately stable interface, and there is one for almost every business object. Two things surprise every new team. First, most BAPIs do not commit on their own, so you call the BAPI and then call the commit function explicitly, and if you forget, everything appears to work and nothing is saved. Second, errors do not throw. They come back in a return table with a message type, so a caller that ignores the return table will treat a failed post as a success. We wrap every BAPI call with return table inspection and an explicit commit or rollback decision, and we test the rollback path rather than assuming it.

IDocs, and what the status numbers actually mean

IDocs remain the workhorse for asynchronous document exchange, with standard types for orders, invoices, material master, customer master and much else. The operational reality is that IDocs fail quietly. A message sits in an error status in the monitor and nothing else happens unless somebody looks. We instrument this properly: statuses that indicate a posting failure are pulled into your alerting with the failing segment and field, retries are controlled rather than blind, and reprocessing is a runbook step with an owner rather than a habit one person developed. Partner profiles, ports and process codes all need to exist on the SAP side before anything flows, which is ERP team work and needs booking in.

SAP Integration Suite, Cloud Connector and the middleware question

If you already own SAP Integration Suite, we build the flows there. It handles the connectivity, the mapping and the monitoring, and Cloud Connector is the standard way to reach an on-premise system from a cloud tenant without opening inbound ports. If you do not own it, buying it purely for two interfaces is usually poor value, and a small well-tested service in your own cloud will do the job with less licensing and fewer specialists required to change it. We will say which way we would go and why, including when the answer is that you should not add middleware at all.

Custom fields, Z objects and the upgrade tax

Almost every SAP estate has custom fields on standard structures and often custom IDoc segments. Integrations that depend on them are fine until an upgrade or a conversion project touches them. We keep an explicit dependency register naming every custom object the integration reads or writes, so that when the upgrade programme starts, the impact assessment takes an hour instead of a fortnight of archaeology.

Licensing is a design input, not a footnote

How SAP counts access from external systems has real commercial consequences at volume, and the answer depends on your specific agreement. This is not something to discover after you have built a chatty integration. Raise the design with your SAP account team or licensing advisor early, and treat their answer as a constraint on the architecture. We are engineers, not your licensing advisors, and we will not guess on your behalf.

Oracle Integration: Fusion Cloud, E-Business Suite and the Gap Between Them

Oracle estates split into two very different worlds, and plenty of companies run both at once during a multi-year move. The integration approach is not transferable between them.

Fusion Cloud ERP, where REST is real but bulk is not

Fusion exposes genuine REST APIs across financials, procurement and projects, and they are good for reading and for moderate transactional volume. Bulk is a different path. The file-based data import route, where you build a structured file, upload it and trigger an import job, remains the supported way to load large volumes of journals, invoices and suppliers. Extraction at volume usually goes through a report definition rather than paging a REST collection, because the API paging will time out long before the report does. Teams that try to do everything over REST in Fusion tend to discover this in week three.

E-Business Suite and the open interface tables

EBS integration is often still table-based, and that is the supported design rather than a hack. You insert into an open interface table, then run the matching concurrent program which validates, posts and writes rejections back with error codes. Journals through the general ledger interface and payables invoices through the invoice interface are the two flows we see most. Handled properly, this is reliable and very auditable. Handled badly, rows accumulate in the interface table for months and nobody notices that a tenth of them never posted. Any interface table design needs a rejection sweep and a report, not an insert on its own.

Oracle Integration Cloud, and when it earns its place

OIC gives you adapters, a mapper and scheduling, and when you are integrating Fusion with other Oracle products it removes a lot of plumbing. It is worth it when you have a spread of interfaces and want one operational surface. It is not worth it for a single flow between Fusion and one in-house system, where a small service you control will be easier to change and easier to hire for.

Multi-org, ledgers and the accounting flexfield

The part that consumes the estimate is rarely the connectivity. It is that your source system has an order with a currency and an amount, and Oracle needs a ledger, a legal entity, a business unit and a full account code combination with every segment populated. Deriving those is business logic that has to come from finance, it differs by entity, and it changes. We hold it as reviewable configuration with an audit history, never as a case statement in code.

Update cycles you do not control

Oracle updates Fusion on its own cadence and gives you a test window rather than a veto. That makes a maintained regression pack genuinely valuable: a small set of interface tests you can run in the test pod during the window, so you find a changed field or a tightened validation before it reaches production. EBS is the opposite problem, with infrequent, large, heavily planned upgrades where the risk is concentrated into one weekend and the integration needs to be part of the test plan rather than an afterthought discovered on the Monday.

NetSuite Integration: SuiteTalk, RESTlets, SuiteQL and Governance Limits

NetSuite is the ERP we see most often behind fast-growing ecommerce and services businesses, and it has a specific failure mode that catches almost everyone: the platform meters your scripts, and the meter runs out exactly when volume is highest.

The interface options, and what each is for

SuiteTalk comes in a long-standing SOAP flavour with dated versions and a REST flavour that supports SuiteQL for querying. RESTlets are custom endpoints you write in SuiteScript, which is the right choice when the standard record operations do not match your business process and you want the logic to run inside NetSuite rather than in your middleware. Saved searches and the analytics connectivity option are the sane way to pull reporting volumes out. Picking between them is mostly about whether you need custom logic on the NetSuite side and how much data moves.

Governance is the design constraint

Every SuiteScript operation consumes usage units, and each script type gets a budget per execution. Exceed it and the script stops, mid-job, with work half done. The numbers are published by NetSuite and do change, so we read the current governance table rather than trusting anything written in a blog post. What matters architecturally is that you design for it: process in chunks with a resumable cursor, use map/reduce for anything large because it is built for exactly this, keep RESTlets small and let the middleware own orchestration, and never write a script whose unit cost scales with an unbounded record count. Add account concurrency limits on top, and a naive parallel loader will start getting rejected under load.

Authentication and the moving target

Token-based authentication and OAuth 2.0 are the supported routes and the older simpler methods have been retired. Roles and permissions in NetSuite are granular and integrations frequently fail on a permission nobody thought about, in a way that produces an unhelpful error. We provision a dedicated integration role with least privilege, document exactly which permissions it needs and why, and keep that list current, because the alternative is somebody granting administrator to make a ticket go away.

Sandboxes are a paid, scarce resource

NetSuite sandboxes are licensed separately, refreshes take real time, and the one your company owns is usually booked by whoever is doing a configuration project. This is the single biggest practical constraint on NetSuite integration work and it needs to be in the plan on day one, with agreed booking windows, rather than discovered when the first posting test is due.

Where the business logic goes

The recurring architectural decision is whether transformation lives in SuiteScript inside NetSuite or in your integration layer outside it. Inside is closer to the data and can use the record model directly. Outside is easier to test, easier to version control properly, easier to staff and does not consume governance units. Our default is outside, with SuiteScript reserved for things that genuinely must run in the platform, such as user event validation. Every line of SuiteScript you write is a line somebody has to maintain in a language with a small hiring pool.

Dynamics 365 Integration: Dataverse, Business Central and Finance and Operations

Dynamics 365 is not one product, and treating it as one is the first mistake. Finance and Operations, Business Central and the customer engagement apps sitting on Dataverse have different data models, different interfaces and different limits.

Finance and Operations

F&O exposes OData entities for record-level work and a data management framework for bulk, where you define data entities, build packages and run recurring imports and exports as batch jobs. As with every ERP on this page, the split is the same: entity-by-entity for low volume and interactive work, package-based batch for anything large. Number sequences, financial dimensions and the posting profile configuration are where the mapping effort lands, and none of that is integration work, it is configuration your team owns.

Business Central

Business Central is a different lineage with its own extension model in AL and API pages exposing OData. It suits smaller estates and is much quicker to integrate against, with the trade-off that custom behaviour means writing and deploying an extension through the AppSource or per-tenant publishing route, which has its own release rhythm.

Dataverse, throttling and the 429 you must handle

The customer engagement apps sit on Dataverse with an OData v4 Web API, change tracking for incremental sync and alternate keys for upsert against your own business identifier. Alternate keys are worth setting up early because they let you post against your external reference rather than maintaining a full GUID mapping. Dataverse also applies service protection limits on request volume, cumulative execution time and concurrency, and returns a 429 with a retry hint when you cross them. Any client that does not honour that hint will make the situation worse under load. This gets found in production more often than in testing, because the test environment never sees the volume.

Dual write, and going in with your eyes open

Dual write synchronises Dataverse and F&O for shared entities and is genuinely useful when it fits. It is also the feature we see cause the most operational pain, because a mapping error or a validation failure on one side can stall the flow and the recovery is not always obvious to whoever is on call. If you are adopting it, adopt it deliberately with monitoring and a documented recovery path, not because it looked like the default option in a diagram.

Where Power Platform helps and where it quietly hurts

Power Automate is excellent for a low-volume, business-owned flow that someone in operations needs to change occasionally. It is a bad host for a core financial interface, because version control, code review, testing and error handling are all weaker than in a normal codebase, and the flow tends to end up owned by whoever built it rather than by the engineering team. We are happy to build in it where it is the right fit and will tell you when a scheduled job in your own stack would be more honest.

Financial Period Close and Why Your Integration Has to Respect It

This is the section that separates people who have integrated an ERP from people who have integrated a database. The financial calendar is not background information. It is a hard constraint that your interface has to model.

Periods close, and closed means closed

At the end of a month, quarter or year, finance closes the posting period. After that, the ERP will refuse a posting dated inside it. This is not a bug to work around, it is the control that makes the reported numbers mean something. Your integration will therefore get rejections it never sees for three weeks and then hits every month, and if the design treats a rejection as a transient failure it will retry into a closed period forever.

Three different dates, and they are not the same date

A document has a document date, which is when the business event happened. It has a posting date, which determines the period it lands in. It has an entry date, which is when it hit the system. A transaction that occurred at 23:58 on the last day of the period and arrives at 00:03 belongs to the old period by document date and would land in the new one if you let the ERP default it. Getting this wrong shifts revenue between periods, which is the kind of error that gets escalated well above your level. We carry all three dates explicitly through the interface and never let the target system default the one that matters.

Freeze windows and held traffic

Finance will usually want quiet during the close run. That means the integration needs a supported way to stop accepting postings, hold them durably, and release them afterwards in the right order, without the source system either blocking or silently dropping them. Building this in from the start is a day of work. Retrofitting it during a live close is not.

Accruals and the cut-off problem

For goods received but not invoiced, or services delivered but not billed, finance needs the accrual at period end. If your integration is the thing that tells the ERP about those events, its timeliness becomes a reporting accuracy issue rather than a convenience issue. That changes the service expectation for a handful of days a month, and it is worth agreeing what those days look like before you are in one.

Year end is a bigger version of the same problem

Year end brings balance carry forward, a new fiscal year in the ERP configuration, sometimes new company codes or a restructured cost centre hierarchy, and a longer freeze. Anything in the integration that hardcodes a fiscal year, a period number or a cost centre will break, and it will break at the busiest possible time. We audit for exactly that before the first year end after go-live, and treat the first close and the first year end as planned support events with agreed cover rather than as ordinary weeks.

Reconciliation, Audit Trail and Proving the Two Systems Agree

In most integration work, monitoring is enough. In ERP work you need to be able to prove, to someone who does not trust you, that everything that happened in one system is correctly represented in the other. That is a different requirement and it needs to be designed, not bolted on.

Control totals per run

Every batch reports the count of records sent, the count accepted, the count rejected, and the sum of the monetary values in each of those buckets. Both sides produce their own figure independently and the two are compared. A run where counts match and values do not is usually a rounding or currency conversion bug, and it is much cheaper to find on the day than in the quarterly review.

A daily reconciliation report finance actually reads

Not a dashboard nobody opens. A short report, delivered where the finance team already works, showing what moved, what is stuck, what was rejected and what is held for a closed period. When the number of exceptions is zero, the report should say so in one line. The value of it is that finance stops asking engineering whether the interface ran, and starts telling engineering when it did not.

Correlation identifiers in both directions

Every message carries an identifier that is visible in the source system, in the integration log and on the resulting ERP document. When somebody asks where a journal came from, the answer takes a minute rather than a morning. This single practice pays for itself the first time an auditor asks the question, and they will.

Immutable message logging

The payload received, the payload sent, the response, the timestamp, the outcome, retained for as long as your retention policy requires. Not a debug log that rotates after a week. The reason is simple: the question you will be asked is about a document from eight months ago, and the answer must not be a shrug. Personal data inside those payloads needs a handling and retention decision made with your privacy lead before you build the store, not after.

Separation of duties in the integration itself

If one person can change a field mapping and also approve the run, you have created a control gap that your auditors will find. Mapping changes go through review and version control, deployment is separate from authorship, and production access is granted and revoked by you. Whether any of this needs formal control documentation depends on your regulatory position, which is a conversation for your controls owner and your auditors rather than for us. We build so that answering their questions is straightforward.

Reversal, not deletion

When a bad posting gets through, the correction is a reversal or a credit document. That has to be a supported path in the integration, with its own reference back to the original, and someone has to be allowed to trigger it. Teams that skip this end up correcting by hand in the ERP, which leaves the source system and the ERP permanently out of step and quietly destroys trust in the reconciliation report.

Transactional Consistency When the ERP Will Not Join Your Transaction

You cannot wrap your database write and an ERP posting in one atomic transaction. Distributed transaction protocols are either unavailable, unsupported by the vendor or banned by whoever runs the ERP. Accept that early and design for it, because the alternative is a system that is subtly wrong in ways that only show up at volume.

The outbox pattern, and why it is worth the extra table

Write the business change and the intent to send in the same local transaction, then have a separate process read the outbox and deliver to the ERP. If your service crashes after the write and before the send, the message is still there. If it crashes after sending and before marking it sent, it sends again, which is why the next point matters more than this one.

Idempotency has to be enforced by the ERP, not by your code

A deduplication check in your service is a race condition with extra steps. The reliable design puts a stable business reference on the document and relies on the ERP to reject the duplicate, using a field it treats as unique. Where the ERP will not enforce uniqueness on any usable field, the fallback is a check immediately before posting plus a reconciliation sweep that catches what slipped through. That is weaker, and we say so rather than pretending the problem is solved.

Compensating actions instead of rollback

When step three of a five step process fails, you cannot undo steps one and two. You post an offsetting entry, cancel a reservation, or raise a credit. Each of those is a real business operation with its own rules, and it needs designing alongside the happy path rather than being invented during an incident. We write the compensation for every multi-step flow as part of the build.

Ordering, and why it bites in ERP more than elsewhere

Masters must exist before transactions. A goods receipt cannot precede its purchase order. A payment cannot precede its invoice. Queues that parallelise for throughput will happily deliver these out of order. Partitioning by business key so that everything about one document stays in one ordered stream is usually the right answer, and it costs you some parallelism. Take the trade rather than sequencing by hope.

Eventual consistency is fine, undetected divergence is not

Nobody sensible expects the two systems to agree at every instant. What matters is that they converge, that the window is known, and that a divergence which persists past the window raises an alarm. That is the whole reason the reconciliation loop exists. Without it, eventual consistency quietly becomes permanent inconsistency, and you find out when a customer disputes an invoice.

Sandbox Scarcity, and Why You Cannot Just Test in Production

In most projects, environments are a solved problem. In ERP work they are usually the critical path, and pretending otherwise is how a plan slips by a month in week two.

Why non-production is scarce

ERP non-production environments are licensed, sized like real systems and expensive to run. Refreshing one from production is a scheduled operation, not a button. The one your company has is typically shared between a configuration project, a finance test cycle, an upgrade rehearsal and you. Nobody is being unhelpful. The resource is genuinely constrained, and the only useful response is to book time in writing at the start of the project.

The data in it is wrong in one of two ways

Either it is a copy of production, in which case it contains real supplier bank details and real personal data and needs masking that somebody has to own, or it has been reset to a skeleton, in which case there are no open orders, no historic documents and no realistic master data, so half your test cases cannot be constructed. Both are workable. Both need a plan and neither is free.

Why testing in production is not an option

A test post in an ERP is a real document. It has a number from a real sequence, it appears in the general ledger, it affects balances and reports, and removing it requires a reversal that stays in the audit trail permanently. Do it a few times and your reconciliation is polluted, the auditors have questions, and the finance team stops trusting the integration before it goes live. There are narrow exceptions such as a genuinely isolated test entity or subsidiary set up for the purpose, and those are decisions for your finance owner rather than for an engineer under deadline pressure.

What we do about it

We front-load everything that does not need the real system. Mapping logic, transformation, routing, retry behaviour and error handling all get built and tested against a mock that returns recorded ERP responses, including the ugly ones: the rejection, the partial success, the timeout, the response that says success in the status and failure in the body. Then we use scarce environment time for the small set of things that can only be proven against the real thing, with the test cases written and reviewed before the booking starts. It sounds obvious. It is routinely not what happens, and it is the difference between using two days of environment time well and burning two weeks of it discovering mapping bugs.

Recorded responses have a shelf life

A mock built from recordings drifts as the ERP changes. We refresh recordings when we get environment access and we treat a mismatch between recording and reality as a finding, not an inconvenience. A mock nobody has revalidated in six months is a source of false confidence, and false confidence in this domain is expensive.

Upgrade Cycles, Customisation Debt and Integrations That Rot

An ERP integration is not finished when it goes live. It sits on top of a platform that changes underneath it, on a schedule you influence at best.

Two very different upgrade shapes

Cloud ERPs push updates on the vendor's cadence. You get a preview or test window and a mandatory adoption date, and the changes are usually small and frequent. On-premise ERPs get infrequent, enormous, heavily planned upgrades where a year of accumulated change lands in one weekend. The first shape needs a small regression pack you can run often. The second needs the integration to be a named workstream in the upgrade programme, with its own test plan and its own sign-off, rather than a line item somebody remembers late.

Customisation is the real risk, not the version number

Standard interfaces on standard objects survive upgrades reasonably well. Interfaces that read a custom field added by a contractor in 2016, or a modified message segment, or a report whose layout somebody tweaked, are the ones that break. The mitigation is unglamorous: an explicit register of every ERP object the integration touches, marked standard or custom, with the custom entries flagged as upgrade risks. It takes a day to produce and saves a fortnight of investigation later.

Version pinning where the vendor allows it

Some ERP interfaces are versioned and let you stay on a known version while you test the next. Where that exists, use it, and put a date in the calendar for moving rather than treating pinning as a permanent solution. Pinning without a migration plan is how you end up on a version the vendor stops supporting during your busiest quarter.

Deprecation notices arrive by email to somebody who left

Vendors do announce retirement of authentication methods, API versions and interface types, and the notice usually goes to an administrator address rather than to your engineering team. We make it a named responsibility to watch the release notes for the specific interfaces in the register. It is a small amount of ongoing attention and it is the difference between a planned change and an outage.

The integration will accumulate its own debt too

Special cases pile up. One entity that needs a different tax rule, one product line with a different unit of measure, one customer whose purchase order numbers have letters in them. Each is reasonable on its own and together they turn a mapping into something only one person understands. We push those into reviewable configuration wherever we can, and where a genuine code branch is needed we make sure it is documented with the reason and the date, so the person removing it in three years knows whether they are allowed to.

The ERP Team Does Not Report to You

The technical problems on this page are tractable. The organisational ones cause more delays, and they are almost never in the plan.

Who owns the ERP, really

It might be an internal team under the CFO rather than under you. It might be a managed service partner with a contract that prices every change request. It might be the systems integrator who did the implementation and still holds most of the knowledge. Each of those has different incentives, different lead times and a different definition of urgent. Find out which one you are dealing with in week one, by name, because every dependency you have runs through them.

Change control is slower than you expect and that is deliberate

Getting a partner profile created, a user provisioned, a service activated or a transport moved to production will go through a change process with a board that meets on a schedule. Two days of engineering work can wait three weeks for an approval. Build the calendar around it. We front-load every ERP-side request into one batch at the start of the engagement rather than discovering them one at a time, because each discovery costs a full cycle.

Finance has a veto and should

The controller can stop a go-live and is right to if the reconciliation is not credible. Treat them as an approver from the first week, not as a stakeholder to be informed at user acceptance testing. In practice this means showing them the reconciliation report design early and asking what would make them comfortable signing it off. The answer is usually cheaper to build than to retrofit.

When the incumbent partner sees you as competition

It happens. The response is to be visibly narrow about scope, put the interface contract in writing so both sides know exactly where the boundary is, and route everything through a shared document rather than through side conversations. We are integration engineers with no interest in your ERP configuration work, and saying that early and consistently defuses most of it.

Documentation debt on their side becomes your risk

The specification for the interface built in 2018 may not exist, and the person who built it may have left. When that is the case we say so and price the archaeology honestly, because building a new interface on top of undocumented behaviour is guesswork wearing a project plan.

Four Situations We See Repeatedly

These are composite patterns drawn from the shape of work in this space rather than named clients. They are here because the failure modes repeat, and recognising yours is more useful than a logo wall.

A direct-to-consumer brand on Shopify and NetSuite, breaking every peak

Orders sync fine at normal volume. During a sale weekend the nightly job stops halfway through, because the script exhausted its governance budget and there was no resumable cursor. Meanwhile refunds are being pushed as order deletions, which NetSuite will not accept, so a growing pile of refunds exist in Shopify and not in the ERP. The fix has three parts. Move the load to a chunked, resumable pattern designed for volume. Model a refund as a credit memo referencing the original document rather than as an undo. Add a daily reconciliation on order count and value so a divergence is caught the next morning instead of at quarter end.

A manufacturer on SAP with a new shop-floor application

Production confirmations and goods movements flow as IDocs. It works, until it does not: messages start failing on a material that was extended to a new plant without the corresponding master data, and they sit in an error status. Nobody is watching the monitor, so the first anyone knows is a stock discrepancy three weeks later, by which time hundreds of messages have accumulated and reprocessing them in the wrong order makes things worse. The fix is operational rather than clever. Failure statuses feed alerting with the failing segment and field named. Errors land in a queue with an owner. Reprocessing is ordered by document and gated on the master data being fixed first. A weekly count reconciliation between the shop-floor system and SAP proves it stays clean.

A multi-entity services business moving billing onto Oracle Fusion

The homegrown billing system knows customers and amounts. Oracle needs a ledger, a legal entity, a business unit and a complete account combination, and the derivation differs by entity. The first attempt hardcodes it, then a restructure adds two entities and the mapping is wrong for a month. On top of that, the first month end lands mid-project and postings start bouncing off a closed period. What works is holding the derivation as finance-reviewable configuration with change history, staging postings so rejects are visible and fixable rather than lost, making the scheduler period-aware so late arrivals are held rather than retried blindly, and treating the first close as a supported event with agreed cover on both sides.

A logistics business on Dynamics 365 with a third-party warehouse provider

Stock movements arrive from the provider as files at unpredictable times, sometimes twice. Without an idempotency key the same movement gets applied twice and inventory drifts. Under load the Dataverse side starts returning throttling responses, the client ignores the retry hint and hammers harder, making it worse. The corrections are straightforward once diagnosed: a stable movement reference enforced on the ERP side, a client that honours the retry hint with backoff, ordered processing partitioned by item and location, and a daily stock reconciliation against the provider's own totals rather than trusting the feed.

How Does an ERP Integration Team in India Work Across Your Timezone?

Handing engineers write access to the system your general ledger depends on, from eight to thirteen hours away, is a legitimate thing to be nervous about. Here is what actually happens on our side of that gap.

What the clock actually gives you

We work 09:30 to 18:30 IST. Line that up against the UK and you get a genuine four-hour stretch in your afternoon, enough for a daily standup and same-day replies on anything urgent. Australia and New Zealand see most of their morning inside our day. US Eastern barely touches it and Pacific does not touch it at all unless somebody shifts. That is the plain fact, not a sales version of it. Where a shifted or split roster would help close week or a go-live weekend, we say so and agree it with you rather than letting a US-based finance lead discover the gap mid close.

Why batch ERP work suits this arrangement unusually well

Most ERP interfaces run overnight relative to you, which is the middle of the working day in India. That means the nightly load has already run, the failures are visible, and they can be triaged and often fixed before your finance team opens their laptop. Compare that to work where every decision needs a live conversation. Here the artifacts are logs, reconciliation reports, rejected records and message statuses, and they read identically in Manchester and in Mumbai. The timezone gap works in your favour for this specific kind of work more than for almost any other.

Close week is different and gets planned differently

For a few days a month the tolerance for a stuck interface drops to nearly zero. That needs an agreed arrangement rather than goodwill: who is on, in which hours, what counts as an escalation, and how it is raised. We agree that with you in advance, in writing, and we do not invent a support commitment on a web page that we have not discussed with you.

What a working day with us looks like

We close the day with a short note: which interfaces ran clean, which are stuck, and what needs a decision from your side, dropped into whichever channel your finance and engineering teams actually read rather than sent to an inbox nobody checks. There is one live call inside the overlap, kept short unless a posting failure needs walking through properly. Tickets live in your own tracker, not a separate board we maintain for ourselves. When something is genuinely blocked, we write the question with our best guess at the answer attached, so you are confirming rather than starting from a blank page.

Access, review and where the paperwork lives

Every change we make goes through your review process and is signed off by your own engineers before it merges. On the ERP side, access is scoped to exactly the sandbox, environment and objects a given interface needs, nothing wider, and it is you who switches it on and off. Supplier bank details, payroll fields and anything else that counts as personal or payment data get masked before we touch a copy, and where a real dataset is genuinely unavoidable we agree the handling in writing first. Ownership of the code, confidentiality and how data is processed all sit in the MSA and NDA signed before the engagement starts, not on this page. If your industry adds regulatory obligations on top, loop your compliance lead in during week one rather than after the first sandbox refresh.

The talent pool for this specific skill

India has enormous depth in ERP work, built over decades of systems integration for global companies. Most of that depth is functional and implementation skill: configuration, module rollout, functional testing. Engineers who are strong at the integration layer, who understand queueing, idempotency, reconciliation design and pipeline work, and who also know why a BAPI needs an explicit commit, are a much smaller subset. That subset is who we hire for. We screen with a working exercise against a real interface problem rather than a certification check, because somebody can hold a tool certification and still ship a client that treats a 200 response containing a rejection as a success.

What Goes Wrong, and How We Handle It

No point pretending everything goes smoothly. Here is where ERP integration work actually goes sideways, and how we respond when it does.

Environment access arrives six weeks late

The single most common cause of slippage. The request goes into a change process, it needs an approval from someone on leave, and the sandbox is booked. We batch every access and environment request into week one, put dates against them, and sequence the work so that mock-based development continues while we wait. If the dates cannot be met we raise it as a schedule issue immediately rather than absorbing it silently and reporting a delay later.

The interface specification describes a system that no longer exists

The implementation-era documentation and the live system rarely agree anymore. Week one becomes an audit: we run the real interface, record what it actually does field by field, and mark every point where the old spec no longer matches reality. Your team calls each disagreement, and the corrected version becomes what we build against. That audit costs a handful of days. Skipping it costs the rework later.

Master data is not ready and nobody knew

Half the items in the source system have no equivalent in the ERP, or exist under a different code, or are not extended to the plant or subsidiary the transaction needs. This is not an integration bug and cannot be fixed by an integration. We surface it early with a gap report by count so it becomes a visible piece of work with an owner, rather than a stream of mysterious posting failures after go-live.

Two systems are both allowed to create the same record

Discovered when duplicates appear. The fix is a business decision about ownership, and the integration cannot make it. What we can do is make the consequences visible fast, propose a per-field ownership model, and hold the build until someone with the authority signs it. Building the sync first and settling ownership afterwards produces an integration that encodes an argument rather than a decision.

The volume in production is nothing like the volume in test

Governance limits, throttling, batch windows and job timeouts all behave differently at real volume, and the test environment will never show you. We design for the documented limits rather than for observed behaviour in test, load-test the transformation and queueing layers where we can, and treat the first peak after go-live as a planned event with someone watching.

A perfectly good integration gets blamed for a data problem

Common and corrosive. When the numbers do not match, the newest component gets suspected first. The defence is the reconciliation report and the correlation identifiers, because they let you demonstrate in minutes what was sent, what was accepted and what the ERP did with it. This is a large part of why we build them from day one rather than adding them when trust has already gone.

What happens when someone leaves

Engineers move on, here and everywhere else, and pretending otherwise helps nobody. What actually protects you is structural: no interface is ever known by one person alone, the dependency register and the runbook live in your repository rather than in somebody's head, and handover is written down as the work goes rather than assembled in a hurry during somebody's last week. Exactly what notice and replacement look like is set out in the MSA before the engagement starts, and we are not going to invent a figure for this page that was never agreed with you.

Engagement Models

Three shapes, matched to what the ERP work in front of you actually needs rather than to what is easiest to sell.

Integration assessment

A time-boxed review of what exists. We inventory every current interface, find the ones failing quietly, check whether reconciliation would survive an audit question, look at the dependency on custom ERP objects, and report what we would fix in what order. You keep the findings and the reasoning whether or not you carry on with us.

Project engagement

A defined set of interfaces with a start and an end. A new system connected to an existing ERP, a migration of interfaces during an ERP move, or a rebuild of a fragile point-to-point estate into something monitored. Scope agreed up front, delivered into your repository and your environments, with reconciliation and runbook as deliverables rather than as goodwill.

Dedicated engineers

Integration engineers who sit inside your team, join your standups and pull from the same backlog as your own developers. This fits estates where interfaces keep arriving and somebody needs to own the operational side month after month, not just the next project. Team composition, working hours and commercial terms go into the MSA, agreed directly with you rather than assumed.

Where This Sits Alongside Our Other Work

ERP integration rarely arrives on its own. If the wider problem is a whole estate of point-to-point connections rather than one ERP, our enterprise integration services cover the architecture question of what middleware, if any, you should actually own. Where the system on the other end of the interface is an ageing in-house application that nobody wants to touch, the integration work and the legacy application modernisation question tend to constrain each other and are worth deciding together rather than in sequence.

If the ERP itself is moving from on-premise to a hosted or cloud deployment, the interface layer has to be replanned around new network paths, new authentication and a different latency profile, which is work we usually pick up alongside cloud migration services in India. And where you want the same skills inside your own team rather than as a scoped engagement, hiring dedicated Java developers in India or .NET developers in India gives you engineers who work in the languages most ERP integration layers are already written in.

Frequently Asked Questions About ERP Integration in India

Do you configure our SAP or Oracle system as well?

No. We build and run the integration layer against the interfaces your ERP exposes. We do not do functional configuration, chart of accounts design, module rollout or ERP implementation, and we do not present ourselves as a certified SAP or Oracle practice. Your ERP team or your implementation partner keeps that work. We write the specification with them, agree who changes what, and stay on our side of the line.

Why can we not just use the ERP REST API for everything?

Because on most ERPs the REST layer is a thin wrapper over the same function modules and interface tables that existed before it, so it inherits their semantics. You still get validation results in a payload rather than in the HTTP status, you still need an explicit commit on some calls, and bulk posting is still faster and safer through the file or batch route. REST is the right choice for lookups and low volume. It is often the wrong choice for a nightly load.

What happens to our integration during month-end close?

It has to know the calendar. Posting periods get closed in the ERP, and anything that arrives late is rejected rather than queued for you. We build interfaces that hold traffic during an agreed freeze window, park anything that would post into a closed period, keep the original document date rather than silently re-dating it, and give finance a single report showing what is held and why before they sign the close.

We only have one NetSuite sandbox and finance owns it. Can you still work?

Yes, but the plan has to say so out loud. We build against recorded responses and a mock layer for most of the development, then book real environment time for the posting paths that genuinely need it. What we will not do is quietly test in production because the sandbox queue is long. A bad post creates a real document that has to be reversed and stays in the audit trail permanently.

How do you stop duplicate invoices when a retry fires?

With a business key the ERP will enforce, not with a hope. Every outbound document carries a stable external reference, that reference is written into a field the ERP treats as unique, and the interface checks for it before posting. When a retry does slip through, the correction is a reversal or a credit memo rather than a delete, because finance systems do not let you remove history and should not.

Our ERP upgrade is next year. Will the integration break?

Parts of it probably will, and the goal is to know which parts before the upgrade rather than after. We keep a written register of every ERP object the integration depends on, including custom fields and modified segments, pin API versions where the vendor allows it, and maintain a regression pack that can be run in the preview or test environment during the vendor window. That turns an upgrade from a surprise into a checklist.

Who decides which system owns the customer master?

You do, and it is a business decision rather than a technical one. Our job is to make the consequences visible before it is made: who can create a record, who can change which fields, what happens to the record that already exists in both systems with different spelling, and which system mints the identifier. We write that down field by field and get it signed off. Integrations built without that document end up encoding an argument nobody settled.

How does an ERP integration team in India work with our finance calendar?

Most ERP interfaces are batch and run overnight relative to you, which is the working day in India. That means failures get triaged and often fixed before your finance team logs in. Our day is 09:30 to 18:30 IST, giving a solid afternoon overlap with the UK, most of the morning with Australia and New Zealand, and very little with US Eastern or Pacific unless hours are shifted. We agree the overlap and any close-week cover with you before work starts.

Tell Us Which ERP and What Has to Talk to It

Send us the ERP and release you are on, the systems that need to exchange data with it, and the last interface failure that reached your finance team. We will come back with the interface style we would use, where the reconciliation has to sit, and which parts of it are honestly not worth building.

Start the Conversation