Why ERPNext REST API integration takes more design than the first endpoint call
When an e-commerce platform, bank or payroll system must read or write ERPNext records every day, the first successful endpoint call is the easy part. The Frappe REST API can cover most of this work without custom code, but the hard parts are permissions, idempotent writes, retries and document lifecycle rules. Those four areas decide whether the integration still behaves correctly after a month of real traffic, not whether a single test request returns data.
Teams usually need an integration rather than manual imports when records change frequently, when a delay creates a business problem, or when the same data must reach ERPNext from more than one system. A nightly CSV load through the Data Import tool can be sufficient for low-volume master data, but it does not give you per-transaction error handling, and the documentation advises importing only a few thousand records at a time. For order, payment or payslip flows, the question is how often the source system produces events and how quickly ERPNext must reflect them.
What makes this harder than it looks is that ERPNext validates every document it receives. A Sales Order, Payment Entry or Salary Slip can be rejected for a missing mandatory field, an inactive item, a closed fiscal period or a link to a record the integration user cannot read. Once a document is submitted, it follows rules that differ from draft documents, and corrections usually mean cancelling and amending rather than editing in place. One order can also touch stock, accounting and payments at once, so a failed step in the middle can leave partial effects that your integration must detect and reconcile.
Before you design anything, confirm the supported API surface against the exact ERPNext and Frappe version you run. Behavior around resource endpoints, submit and cancel actions, and whitelisted methods can differ between major versions, and the version 15 and 16 lines both receive frequent minor releases. Ask your integration partner or Frappe to show, on your installed version, which endpoints and methods they will rely on, and test those calls on a staging site before committing to a design.
Which ERPNext API surfaces and settings the integration touches
An ERPNext integration rarely uses one interface. It combines the Frappe REST endpoints, a dedicated user with its own credentials and permissions, and sometimes custom Python exposed as whitelisted methods or Server Scripts. The bulk Data Import tool sits alongside these for large loads. Each card below names one of these pieces and what to confirm before design starts.
Frappe REST resource and method endpoints
The Frappe REST API exposes DocType records through resource endpoints, and it exposes custom functions through method endpoints. Most integrations read and write standard documents such as sales orders, items or payment entries through the resource endpoints, and call method endpoints for actions that need server-side logic, such as submitting a document. Confirm the exact paths, query parameters and response shape against the API documentation for your ERPNext version before writing client code, because they are not copied here.
API key and secret credentials on a user
ERPNext authenticates API calls with an API key and secret generated for a specific user, and the same pair is sent in the request header. Treat the integration as a user account: create a dedicated service user, generate the pair there, and store the secret in your secrets manager. Confirm the header format and the token generation steps for your version, since these details change between releases.
User role and user permissions
The API applies the same role permissions and user permissions as the Desk UI, so a service user with broad roles can read and change far more than the integration needs. Define the roles and document-level user permissions on the service user first, then test each endpoint the integration calls with that user. A call that works for an administrator can fail or return partial data for a restricted user, so verify with the restricted account.
Whitelisted methods for Python functions
Whitelisted methods expose a Python function from a custom app as an API method endpoint. They are the right choice when an integration needs logic that a plain resource call cannot express, such as a multi-document posting or a status calculation. Each whitelisted function is code you own, so it needs review, input validation and tests, and it must be included in your custom app's upgrade plan.
Server Scripts as API endpoints
Server Scripts can run Python and be published as API endpoints without a custom app. From version 15 they are disabled by default and must be enabled with the server_script_enabled setting. Frappe Cloud public shared benches do not allow them, so a Frappe Cloud plan must be checked before design. Most teams keep them off unless a small, reviewed endpoint is needed, because they run code from the Desk and are harder to version than a custom app.
Data Import tool for bulk loads
The Data Import tool loads and updates records from CSV or Excel files or public Google Sheets, using downloadable templates and supporting child table rows. It is the usual choice for one-time or periodic bulk loads, such as opening masters, rather than sending thousands of API calls. The documentation advises importing only a few thousand records at a time, so plan batches and reconciliation counts with the business owner before the load.
Which credential, endpoint and sync pattern to choose
This table compares the main choices for an ERPNext integration: which credential the external system uses, which endpoint it calls, how data moves between systems, and whether work runs in the background. Read each row against your own audit, hosting and retry requirements. The main takeaway is that a dedicated integration user with a standard resource endpoint is usually the simplest option to audit and maintain, and the other choices are worth their extra cost only when a specific need requires them.
| Option | Fits when | Operational cost |
|---|---|---|
| Credential: dedicated integration user with API keys | The integration runs unattended and needs its own permissions and audit trail. | Keys tied to one user need scheduled rotation. Confirm key and secret handling steps for your version. |
| Credential: named user's credentials | A one-off task must act as a specific person, such as a short-term data load. | Records show a person who may leave. Password or role changes can break the integration and blur audit records. |
| Endpoint: standard resource endpoints | Your integration creates, reads or updates documents that its user's roles already permit. | Behavior follows DocType permissions and validation, so business rules stay in ERPNext. Confirm field-level limits for your version. |
| Endpoint: whitelisted method | A fixed business action, such as a status change, must be exposed to one known caller. | Requires code in a custom app. Input and permission checks become the developer's responsibility. |
| Endpoint: Server Script API endpoint | A small, quick change on a self-hosted site where your team controls whether scripts are enabled. | Disabled by default from version 15 and must be enabled. Frappe Cloud public shared benches do not allow Server Scripts. |
| Sync: push from the external system | The source system already knows when a change happens and can retry failed calls. | The sender owns retries and duplicate checks. ERPNext receives nothing if the sender fails silently. |
| Sync: scheduled polling | The external system cannot receive calls, or changes arrive in periodic batches. | Adds load and delay between runs. Needs a stored last-sync marker to avoid gaps and duplicates. |
| Sync: webhooks from ERPNext | The external system must react soon after a document event occurs. | The receiver must be reachable and verify requests. Failed deliveries need retries and monitoring. Confirm webhook options for your version. |
| Execution: queued background job | Imports, bulk updates or slow external calls can finish later without blocking users. | Needs worker capacity and job monitoring. Synchronous calls return results directly but tie up requests and risk timeouts. |
How to build an ERPNext API integration step by step
This sequence takes an ERPNext API integration from a written data contract to a tested, repeatable build on staging. Each step closes with a check the team can run, so problems surface before production data moves. The output is an integration that handles reads, writes, duplicates and failures in a predictable way.
Define the data contract per DocType
Your team and the integration owner list every DocType the external system reads or writes, such as Sales Order, Customer, Item, Payment Entry or Journal Entry. For each one, document the required fields, field types, allowed values, child tables, and the document states the integration may read or set, including draft, submitted and cancelled. Name the owner of each field, since the system of record decides conflicts. Check: a reviewer can take the contract and predict, for any sample payload, whether ERPNext will accept, reject or change it.
Create a scoped integration user and credentials
Create a dedicated user for the integration, separate from any person, and assign only the roles the contract needs. Add user permissions to restrict it to the companies, warehouses or customer groups in scope. Generate an API key and secret for that user, store them in your secrets manager, and rotate them under a documented process. Check: as the integration user, attempt a read and a write outside the contract and confirm ERPNext refuses both, then confirm the in-scope read and write succeed.
Prototype reads and writes against staging
Build a small client that calls the Frappe REST resource endpoints for one DocType at a time, starting with a read and then a create or update on a test record. Confirm the authentication header format against the ERPNext version you run, since token behavior should be verified in your own environment rather than assumed. Record response codes, validation messages and the fields ERPNext fills in automatically. Check: the prototype creates a document on staging, reads it back with the same field values, and logs a clear error when given a deliberately invalid field.
Decide how external records are identified
Choose how each external record maps to an ERPNext document. The common options are a custom external reference field on the DocType that stores the source system ID, or a separate mapping table that links source IDs to ERPNext document names. A custom field is simpler to query and audit, while a mapping table keeps source identifiers out of the ERPNext schema. Decide what happens when a source record is updated, deleted or merged. Check: for a sample of records, you can resolve the ERPNext document from the source ID and the source ID from the ERPNext name.
Implement writes as idempotent operations
Make every create and update safe to repeat. Before inserting, look up the external reference and update the existing document if one exists, and send the source system's own transaction or event ID with each write so it is stored on the document. Do not assume a timeout means the write failed, because the document may already exist. Check: replay the same request three times with a timeout simulated between calls, then confirm that exactly one document exists with the expected values.
Add retry and dead-letter handling
Classify errors before retrying. Network failures, timeouts and rate-limit responses can be retried with increasing delays and a cap on attempts. Validation and permission errors should not be retried, because the same payload will fail again. Send exhausted or non-retryable messages to a dead-letter queue or table that stores the payload, error text, timestamp and source ID, and assign an owner who reviews it. Check: force a validation failure and a transient failure on staging, then confirm the first is parked with its error and the second is retried and succeeds.
Wire webhooks or polling for outbound events
Decide how ERPNext tells the external system about changes. Document events can trigger webhooks, and the alternative is a scheduled poll that reads records modified since the last checkpoint. Confirm the webhook configuration options and whether ERPNext retries failed deliveries in your version. Either way, process each event idempotently and keep a checkpoint or delivery log. Check: change a document on staging, confirm the event is applied once, and restart the consumer mid-stream to confirm no event is lost or applied twice.
Run an end-to-end test with production-like volumes
Run the full flow on staging with masked or synthetic data at production-like volume, covering every contract state, duplicate sends, permission boundaries and forced failures. Load large batches in chunks, since the ERPNext Data Import documentation advises importing only a few thousand records at a time. Measure run time, error rate and dead-letter volume, and compare ERPNext record counts and totals with the source system after each run. Check: the reconciliation shows matching counts and totals for every in-scope DocType, with no unexplained dead-letter entries, before cutover is approved.
How webhooks and polling move changes out of ERPNext
The integration needs a clear owner for each kind of change: how does the external system learn that a delivered order, a payment entry or a new employee was created or updated in ERPNext? In practice, there are two routes. The first is an outbound webhook configured on document events. The second is polling the REST API for records whose modified timestamp has moved forward. Decide which route carries each event type before you build anything. Webhooks give the lowest latency but depend on how ERPNext sends and retries calls. Polling is slower but entirely under your control. Most teams make webhooks the primary channel and polling the safety net. Before you commit, confirm in your installed version that the webhook feature exists, which document events it can fire on, and whether it can sign payloads. The receiver should be designed around one rule: acknowledge quickly, then process later. When a call arrives, validate it, write the raw payload to a durable queue or table, return a success response, and let a worker handle the business logic. Do not call ERPNext, the bank or the payroll provider inside the inbound request, because slow downstream work causes timeouts, and timeouts cause resends. Validate the inbound call before parsing it. If the release signs payloads, check the signature against the raw request body using the shared secret, and reject any call that fails. Keep the secret in your secrets manager and plan how to rotate it. If the release offers no signing, restrict the endpoint at the network or reverse proxy layer and record the gap as a known risk for your security review. Assume every event can arrive more than once and that events can arrive out of sequence. A payment entry may be reported after a later update to the same record, or an older update may arrive after a newer one. Build idempotent handling: key each processed event on the document name, the event type and the modified timestamp, or on an event identifier if the payload includes one. Do not trust the order of payloads. Before acting, fetch the current document through the REST API and act on what ERPNext returns. The payload may be stale, and the document may have changed again or been cancelled since the event fired. Checking the current document status before posting downstream prevents a cancelled order from creating a shipment or a reversed payment from creating a duplicate entry. Polling covers what webhooks miss, including events lost during receiver outages and changes made while a webhook was disabled. Store a cursor for each DocType that records the last successfully processed modified timestamp. Read with a small overlap window so that records saved at the same moment as the cursor are not skipped, and rely on idempotent handling to absorb the overlap. Choose the polling interval with your team, weighing freshness against load on the ERPNext site and any API limits that apply to your hosting. Reconciliation is the periodic check that confirms both systems agree. For a chosen date range, compare record names and counts between ERPNext and the external system, list the gaps, and reprocess them through the same pipeline. Run reconciliation after any outage and on a schedule agreed with finance or HR owners. Before go-live, test the failure paths on a non-production site. Take the receiver down and confirm that events are queued and then processed. Replay the same payload twice. Send an update before its create. Change a document after its event fires and confirm the receiver reads the current state. Confirm the payload format, the retry schedule and the behavior after repeated failures with the vendor documentation for your exact ERPNext release, and write those details into your runbook. Ask any implementation partner to show the test results and the reconciliation report, not only the happy-path demonstration.
What drives the cost and duration of an ERPNext integration
This table lists the factors that most change the effort of an ERPNext REST API integration and how to keep each one contained. Read each row as a scoping question you can answer before requesting a quote. The main takeaway is that a narrow, written scope with defined sync direction, batch sizes and environments usually costs less to build and to keep running than an open-ended integration.
| Driver | Why it changes effort | How to keep it down |
|---|---|---|
| External systems and document types | Each system adds its own authentication, field mapping and error cases, and each ERPNext DocType (such as Sales Order, Item or Payment Entry) needs its own mapping. | List the systems and DocTypes in the written scope and defer the rest to a later phase. |
| Direction and frequency of sync | Two-way sync needs conflict rules and duplicate checks, while near-real-time sync through webhooks or polling adds more moving parts than a scheduled daily job. | Use one-way sync where the business allows it and choose the lowest frequency that meets the process need. |
| Volume of records per run | Large runs increase timeouts, rate limit handling and the time needed to test. The ERPNext Data Import documentation advises importing only a few thousand records at a time. | Batch records into runs of a few thousand or fewer, and confirm your expected daily and initial load volumes before scoping. |
| Reconciliation and exception handling | Someone must decide what happens to rejected, duplicate or partially posted records, and reports must show totals match between systems. This work is often underestimated. | Specify the exception queue, retry rules and the reconciliation report in the scope, and name who reviews exceptions. |
| Custom fields and scripts to map | Custom fields and Server Scripts must be mapped and tested. Server Scripts are disabled by default from version 15 and Frappe Cloud public shared benches do not allow them, which can force a custom app instead. | Inventory custom fields and scripts first, and confirm early whether the hosting model allows Server Scripts. |
| Number of environments | Staging, production and any test copy each need configuration, credentials and data refreshes. Hosting on your own servers or on Frappe Cloud changes who maintains each environment. | Agree the environment count and refresh process in writing, and keep one shared test dataset across environments. |
| Compliance evidence such as logs and access reviews | Auditors and internal reviewers may ask for API request logs, credential ownership, token rotation records and periodic access reviews of integration users. | Define the log retention, named integration user roles, token rotation schedule and review cadence before build starts. |
How to protect API credentials and inbound endpoints
An ERPNext integration gives an outside system a way to create, change and read business records, so each credential, endpoint and inbound call becomes part of your attack surface. The cards below cover the controls that limit what a stolen key or forged request can reach, and what to confirm in your installed release before go-live.
Dedicated integration user with least privilege
Create a separate ERPNext user for each integration instead of reusing an administrator or a person's account. Give it only the roles and user permissions needed for the DocTypes it reads or writes, such as a company or warehouse restriction on Sales Order access. Confirm in your release that the role matrix and user permissions block access to the other DocTypes it should not reach, and test with a request for a record outside its scope.
Secrets manager for keys and rotation
Keep API keys, secrets and tokens in a secrets manager or the platform's credential store, never in source code, configuration committed to Git, shared spreadsheets or chat. Set a rotation schedule and a documented procedure to issue a new key, update the calling system and revoke the old key without a gap in service. Confirm that the calling system can read its secret at runtime and that revoking a key immediately blocks requests that use it.
Allowlisted endpoints and methods
Expose only the resources and whitelisted methods that the integration calls, and block every other path and HTTP method at the reverse proxy or firewall. Whitelisted methods are a deliberate publication, so review each one for the data it returns and the records it changes. Confirm which methods are reachable from outside your network in your installed release, including any default endpoints you did not intend to publish.
Server Scripts disabled by default
Server Scripts run Python on document events or as API endpoints, which makes them a high-impact target if a low-privilege account can create or edit one. Frappe's documentation states that from version 15 they are disabled by default and must be enabled with the server_script_enabled setting. Keep them off unless a specific endpoint needs one, and confirm the setting value in your installed release. Frappe Cloud public shared benches do not allow them.
TLS and signed inbound webhooks
Require TLS on every API call and webhook, with certificates that the calling system validates, and reject plain HTTP at the proxy. For inbound webhooks, verify a signature or shared-secret header on each request before any processing, and reject requests with missing or mismatched signatures or stale timestamps. Confirm in your release and integration design which webhook signing options are supported, and test that a request with a altered payload is refused.
Audit logging of API writes
Record who or what changed a document through the API, when, and which fields changed, so that an unexpected posting or master-data edit can be traced to a specific integration user and key. Review the version history of DocTypes that matter to finance and inventory, and forward proxy and application logs to a store that the ERPNext administrators cannot silently edit. Confirm which DocTypes track changes in your release and how long logs are retained.
How the integration changes on Frappe Cloud, Docker and bench servers
On Frappe Cloud, the platform controls much of the server, so the integration design starts from what the plan permits. Public shared benches do not allow Server Scripts, which means endpoints you might otherwise write as server scripts must move into a custom Frappe app or onto a dedicated bench where the platform supports your setup. Confirm the exact options for your plan before you fix the architecture.
- Endpoints: Public shared benches block Server Scripts, so custom API methods ship in a custom app or run on a dedicated bench where supported.
- Outbound calls: Confirm which external destinations the bench can reach before you design polling or push flows to banks or payroll providers.
- Background jobs: Scheduled syncs and queued webhook work depend on the worker capacity the plan provides, so confirm queue capacity with the platform.
- Credentials: Store API keys and tokens using ERPNext's own mechanisms and rotate them under your own process.
- Upgrades: Platform-managed upgrades set the timing for your custom app compatibility checks.
Check the plan, custom app support and outbound rules in writing before you commit to an integration pattern.
With frappe_docker, the integration service can run as a container on the same Compose network as ERPNext and reach the backend by service name. Production setups separate the web, background worker, scheduler, Socket.io and Nginx services, and queued integration jobs only complete when the workers are running and healthy.
- Network: Place the integration service on the internal network and expose only the endpoints it needs through Nginx.
- Workers: Webhook handlers that enqueue jobs need background worker containers running, or the work stays queued.
- Scheduler: Periodic pulls from banks or payroll providers run through the scheduler service, so confirm it is enabled in each environment.
- Images: Custom apps must be built into the image used by every service, including workers and the scheduler.
- Demo setup: The single-file demo Compose setup is for short-lived evaluation only and should not carry integration traffic or live data.
Verify that each container role starts on the same app version and can reach the other services before you test the integration end to end.
A bench installation on your own servers gives you full control over custom apps, the scheduler, worker configuration and network rules. The trade-off is that your team owns process supervision, reverse proxy configuration, patching and backups for every server involved.
- Custom apps: Package endpoints as a custom app, keep it in source control and test it against each ERPNext minor release before deployment.
- Scheduler: Enable the scheduler per site on purpose and set sync job timing so that jobs do not overlap with batch windows on the other side.
- Workers: Size background workers for queued integration traffic and monitor queue depth as part of normal operations.
- Network rules: Restrict inbound access to API and webhook endpoints at the firewall and reverse proxy, and allow outbound traffic only to named destinations.
- Server Scripts: Keep them disabled unless you need them, since version 15 disables them by default.
Document which team owns each setting, because the bench layout determines where failures appear and who must act on them.
In air-gapped or tightly restricted networks, ERPNext cannot receive webhooks from internet services or call them directly. Traffic must pass through approved paths such as a DMZ receiver, an integration gateway or a controlled file exchange, and each path needs its own authentication, logging and owner.
- Webhook receivers: Place the receiver in an approved zone that validates the sender's signature and forwards only permitted events to ERPNext.
- Outbound calls: Route bank or payroll calls through a proxy or gateway that your security policy allows.
- Software delivery: Plan how custom apps and ERPNext updates reach the network, usually through an internal mirror and reviewed artifacts.
- Firewall rules: Record source, destination, port and purpose for each flow, and review them whenever the integration changes.
- Failure testing: Test each approved path end to end, including retries, timeouts and what happens when a gateway is unavailable.
Confirm with your security and network teams which paths are approved, who owns each one and how each is logged before the design is finalized.
How to test that the ERPNext integration works and fails safely
A working ERPNext integration is one that behaves correctly when the other system is slow, when a request is repeated, and when the integration user lacks a permission. Before go-live, the test plan should cover each of those cases explicitly, not only the happy path where a sales order or payment record arrives once and is accepted. Start by writing a contract test for every endpoint the integration calls or exposes, whether it is the standard Frappe REST resource routes or a whitelisted method. Each test should check the request shape, required fields, the response body and the status codes for both valid and invalid input. Confirm against the version of ERPNext you run, since field names and validation rules are the part most likely to differ between your staging and production sites.
Permission testing deserves its own pass. Run every test with the dedicated integration user and its API key or token, not with an administrator account, because administrator sessions hide missing role and user permissions. Include denied actions on purpose: an attempt to read a company the user should not see, to submit a document the role cannot submit, or to modify a DocType outside its scope. Each denial should return a clear error and leave no partial record behind. Record which roles and user permissions the integration user holds, so that a later change to them is caught by a failing test rather than discovered by a finance team member.
Idempotency and failure tests are where most integrations fail in production. Replay the same create or payment request several times and confirm that ERPNext does not produce duplicate documents, or that your middleware detects the duplicate using an external reference you store on the record. Then inject failures: force timeouts between your middleware and the ERPNext API, return errors from the bank or e-commerce side mid-batch, and cut the connection after a write has been sent but before the response is received. For each case, decide in advance whether the correct outcome is a retry, a quarantine for manual review or an alert, and verify that the system does what the design says. Partial failures in a multi-document flow, such as a sales invoice created without its payment entry, need a documented recovery path.
Reconciliation and load testing confirm the result at the business level. After a test run, compare record counts and totals between the source system and ERPNext for each object type, such as orders, invoices, payments and stock movements, and investigate every difference. For the load test, follow the Data Import guidance in the ERPNext documentation, which advises importing only a few thousand records at a time, and apply the same batching to any bulk API job. Keep test volumes within what your infrastructure and rate limits can sustain, and confirm the actual limits with your hosting provider and your own configuration rather than assuming defaults.
After go-live, the integration needs operational controls. Log every API call with a correlation identifier, the integration user, the endpoint, the outcome and the error message, and keep those logs separate from ERPNext application logs so they can be searched during an incident. Alert on retries that have exhausted their attempts, and on any record moved to a failed or quarantine state. Monitor the queue backlog on background workers, because a growing queue often signals a problem before users see one. Put credentials on a documented rotation schedule, and rotate API keys and secrets through the same change process used for other production secrets. Take a verified backup before any schema change or custom field migration, and keep endpoint documentation, field mappings and runbooks current with each release so that the next engineer can diagnose a failure without reconstructing the design from memory.
What buyers ask before building or hiring help for ERPNext integration
What drives the cost of an ERPNext REST API integration project?
The cost depends mainly on how many systems connect, how many document types move between them, and how much business logic sits in the middle. Each connection needs discovery: which DocTypes, fields and status changes must sync, and which system owns each record. Error handling, retries, reconciliation reports and logging add effort because they take much of the test time. Mapping rules for taxes, currencies, item codes and customer identities are often the largest single driver. ERPNext itself is free under GPL-3.0, so the spend sits in hosting, build labor, testing and ongoing support. Ask each quote to list every flow separately, the environments built, who builds and who tests, and which costs are one-time versus recurring after upgrades and changes in the connected system.
How long does an ERPNext integration usually take to build?
Duration follows scope, so the reliable answer comes from a written plan rather than a general estimate. The main factors are the number of flows, how well the other system's API is documented, how many test cycles the business requires, and whether a staging environment and sandbox credentials are ready when build starts. Authentication setup and sandbox access with the third-party vendor often delay projects more than the ERPNext work does. Ask for a schedule with milestones for discovery, mapping sign-off, build, staging tests, a cutover rehearsal and go-live. Confirm external dependencies such as vendor approval windows, bank or payroll certification steps and holiday freezes in writing. Fixed-scope projects agree timelines before work starts, so the quote should name the assumptions that would move the dates.
What must our internal team provide for an ERPNext integration?
The internal team owns decisions that no integrator can make for the business. Name a system owner for ERPNext and one owner for each connected system, with authority to approve field mappings and status rules. Provide test data that includes the edge cases your business actually sees, such as partial shipments, refunds, multi-currency invoices and duplicate customers. Anonymize any test data that contains personal information. Sign off mappings in writing before build starts. Grant access to a staging site and sandbox credentials for each external system, and name a person who can approve production changes. Plan reviewer time in advance, because delays in sign-off usually stall testing more than coding.
Can our in-house team build an ERPNext REST API integration?
Yes, if the team already knows the Frappe Framework and the other system's API, but test that assumption before committing. The work covers API keys and tokens, whitelisted methods, document events, background jobs, retries and safe repeated writes. If the design uses Server Scripts, note that from version 15 they are disabled by default and must be enabled with the server_script_enabled setting. Frappe Cloud public shared benches do not allow Server Scripts, so the hosting choice shapes the design. Assess the team's Python skills, its understanding of ERP accounting logic, and its ability to test endpoints for security weaknesses. Ask whether the same people can maintain the integration through each upgrade, since that is where in-house projects most often struggle.
Do we need an implementation partner for ERPNext integration work?
A partner is not required, but one helps when the integration touches finance, payroll or regulated data and the internal team has no spare capacity. Frappe's pricing page says implementation is available through certified partners, so confirm any partner's credentials directly with Frappe before relying on them. DeployOpen plans, implements, integrates, hardens, documents and supports self-hosted open-source platforms inside your own infrastructure. Most engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts, and ongoing support is available as a retainer. Compare any partner on written scope, test evidence, handover documentation and who will support the integration after go-live.
What should an ERPNext integration quote include?
A useful quote lists scope as individual flows, each with its trigger, direction, source and target DocTypes, and a field mapping appendix. It should name the environments built, the authentication method, the error handling and retry behavior, the logging and reconciliation reports, and the testing and cutover support. Separate one-time build work from recurring items such as monitoring, upgrade testing after ERPNext releases, and support hours. State what is excluded, including changes to the connected system's API. Confirm the assumptions on sandbox access, test data and sign-off dates, along with the change process for scope additions. Because most engagements are fixed-scope, the written scope is what the price follows, so review it line by line.
How should we confirm rate limits and webhook behavior for ERPNext?
Confirm both in the documentation for your ERPNext version and in the other vendor's API documentation, then measure them in your own staging environment. For webhooks, check which events fire, whether they fire on save or on submit, how retries behave when the receiver is down, whether duplicates or out-of-order deliveries occur, and how timeouts are handled. For rate limits, check any throttling in your hosting setup or reverse proxy, plus the external system's quotas. Load test with realistic volumes. The ERPNext Data Import documentation advises importing only a few thousand records at a time, which is a useful planning signal for bulk syncs. Ask the team to record each answer and the test that proves it.
What happens to an ERPNext integration during an upgrade?
An integration can break during an upgrade when field names, API responses, custom apps or scripts change, so every upgrade needs a staging test before production. ERPNext v15 is planned for support until the end of 2027 and v16 until the end of 2029, while v14 reached end of life on January 31, 2026. Both supported major versions receive frequent minor releases. On staging, run the update and migrate steps on a recent copy of production data, then rerun the integration tests. Check API tokens, webhook subscriptions, scheduled jobs and mappings. Keep a rollback plan backed by a verified backup. Frappe's warranty coverage requires a listed version and a matching Frappe Cloud support plan, so confirm your own eligibility before planning. Ask any partner whether upgrade testing is in scope or sold as a retainer.
How DeployOpen scopes, builds and hands over ERPNext integrations
DeployOpen plans, builds, documents and supports ERPNext REST API integrations inside your own infrastructure, whether on your servers, in your cloud account or on Frappe Cloud. Each engagement starts from a written, fixed scope that names the external systems, the ERPNext DocTypes involved and the operational responsibilities on both sides.
How we scope
- Inventory each external system, its data owners and the ERPNext DocTypes that will be read or written
- Agree the authentication method per integration, such as API keys and secrets or token-based access, and who issues and rotates them
- Define which events need webhooks, which need scheduled polling, and which whitelisted methods must be exposed
- Record expected error handling, retry rules, rate limits and the owner for each failure alert before build starts
How we build
- Build integrations against a staging ERPNext bench with the same version and custom apps as production
- Implement whitelisted methods with explicit permission checks so API callers only reach the data their role allows
- Test idempotency, duplicate handling and partial failure using replayed and malformed payloads
- Confirm Server Scripts are enabled only where the scope requires them, since they are disabled by default from version 15
How we hand over
- Deliver a written runbook covering endpoints, credentials locations, webhook configuration and log locations
- Provide a test script and sample requests so your team can reproduce each integration path after handover
- Document the mapping between external fields and ERPNext fields, including child table rows and default values
- Walk your administrators through error logs, failed-job review and the steps to disable an integration safely
How we support
- Review integration behavior after each ERPNext minor release and before any major version upgrade
- Keep a change log for custom apps, scripts and API configuration so upgrades can be tested against a known baseline
- Offer ongoing support, upgrades and testing as a retainer, with the scope confirmed in writing
- Confirm with your team which support tier, response times and monitoring responsibilities apply before signing

