> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tryoto.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ERP integrations

> Connect your ERP to OTO: decide which system owns which data, what crosses between them, which identifiers matter, and how the integration gets built.

An ERP is usually the system of record for what a business owns and what it owes. OTO is the system of record for what is moving. Integrating them is mostly about agreeing where one ends.

## Drawing the line

The integrations that go wrong are the ones where both systems believe they own the same fact. The ones that work draw a line and hold it.

| Owned by the ERP | Owned by OTO |
| - | - |
| The product master — what exists, what it is called, what it costs | Where each unit physically is, and what is reserved against an order |
| Financial records, invoices, tax | Shipment records, carrier charges, proof of delivery |
| Procurement and supplier relationships | The inbound receipt against a purchase order |
| The customer as an accounting entity | The customer as a delivery address and a phone number |

> [!WARNING]
>
> **Decide who owns stock, and mean it**
>
> This is the decision that determines whether the integration is calm or permanently in dispute. If the ERP owns stock, OTO reports movements and the ERP reconciles. If OTO owns stock, the ERP receives movements and does not overwrite them.
>
> What does not work is both writing stock levels for the same SKU at the same location. The symptom is figures that disagree in a pattern nobody can explain, and it is very hard to unpick once a quarter of history exists.

## What crosses the line

| Flow | Direction | Endpoints |
| - | - | - |
| **Products** | ERP → OTO | `createProduct`, `productList` |
| **Stock levels** | Either, per the decision above | `updateStockQuantity`, `checkInventoryStock`, `checkGlobalStock` |
| **Orders** | ERP → OTO | `createOrder`, `updateOrder` |
| **Fulfillment events** | OTO → ERP | [Webhooks](https://docs.tryoto.com/integrations/webhooks.md) — `orderStatus`, `shipmentError` |
| **Shipping costs** | OTO → ERP | `shipmentTransactions`, `getShippingPriceTransactionsList` |
| **Inbound and transfers** | ERP → OTO | `createInventoryOrder` |

Stock Management endpoints require the WMS add-on. Availability per plan is in the [endpoint index](https://docs.tryoto.com/developers/rest-api-reference.md).

## The two identifiers that matter

| | |
| - | - |
| **SKU** | The join for everything product-shaped. If the ERP and OTO disagree about a SKU, stock and orders both break at once. |
| **Hub code** | The join for everything place-shaped. Your ERP's plants and sites map onto OTO [hubs](https://docs.tryoto.com/modules/hubs-management/overview.md) by this code. |

> [!TIP]
>
> **Ten minutes with whoever owns the ERP, before the first hub is created**
>
> Hub codes and SKUs are free to decide and expensive to change, because every integration, every import file and every historic record keys on them.
>
> The alternative is a renaming exercise six months in, with a mapping table somebody maintains by hand in between.

## Three ways an ERP connection gets built

Unlike [sales channels](https://docs.tryoto.com/integrations/sales-channels.md), ERP connections are not a self-serve catalog. There are three routes, and the third is the one most enterprise customers actually take.

| Route | How it works | Suits |
| - | - | - |
| **You build it** | Your developers work against the [REST API](https://docs.tryoto.com/developers/overview.md) and [webhooks](https://docs.tryoto.com/integrations/webhooks.md), at your own pace. | Teams with in-house developers and a well-understood ERP. |
| **Your ERP partner builds it** | The integrator who already maintains your ERP extends it to call OTO. | Businesses whose ERP is managed by a third party. |
| **OTO builds it for you** | You provide the endpoints of your own system and the business rules; OTO develops a connector against them, scoped to your account. | Enterprise customers, bespoke or in-house systems, and anything with unusual requirements. |

### Custom integrations built by OTO

Where a system has no ready-made connector — an in-house ERP, a bespoke WMS, an industry package nobody else runs — OTO can build the integration rather than hand you an API and wish you luck.

The shape of it is simple: **you expose endpoints, OTO integrates against them.** The connector is developed for your account, to your business requirements, and maintained as part of your setup rather than as a project that finishes and decays.

| What OTO needs from you | Why |
| - | - |
| **Endpoint documentation** | The calls your system exposes, with request and response shapes. |
| **Authentication** | How the connector will identify itself, and credentials for a non-production environment. |
| **A test environment** | Somewhere to build against that is not your live ERP. |
| **The field mapping** | Which of your fields are the SKU and the site code, and how your statuses correspond to OTO's. |
| **The business rules** | Who owns stock, when an order is considered committed, what happens on a partial fulfillment, how returns post back. |

> [!TIP]
>
> **The business rules are the long pole, not the code**
>
> Writing a connector against a documented endpoint is routine work. What takes the time is the set of decisions underneath it — and those are decisions about your business, so only you can make them.
>
> Bringing them already answered is the single biggest thing that shortens an integration: who owns stock, what a partial fulfillment means in your accounts, and whether an order is committed when it is placed or when it is picked. Teams that arrive with those settled integrate in a fraction of the time of teams that discover them during build.

> [!NOTE]
>
> **This works in both directions**
>
> The same approach covers systems that need to *push* into OTO (an ERP creating orders, a POS reporting stock) and systems that need to *receive* from it (a finance system taking shipment costs, a BI warehouse taking fulfillment events).
>
> It is also not limited to ERP. [POS](https://docs.tryoto.com/integrations/pos-systems.md), WMS, in-house order managers and bespoke internal tools are all connected the same way.

Custom integrations are scoped commercially. Talk to your account contact, or write to [support@tryoto.com](mailto:support@tryoto.com) with a description of the system and what you need to move between it and OTO.

## Coming to the conversation prepared

If you are evaluating, the useful question to bring is not “do you integrate with X” but “here is which system owns stock, here are our site codes, here is the SKU convention, and here is what our ERP exposes”. That conversation is short. The other one is not.

## Related

* [Developers](https://docs.tryoto.com/developers/overview.md) — authentication and the API surface.
* [Inventory sync](https://docs.tryoto.com/modules/inventory-management/inventory-sync.md) — how stock is calculated and pushed.
* [Hubs Management](https://docs.tryoto.com/modules/hubs-management/overview.md) — hub codes.
* [POS systems](https://docs.tryoto.com/integrations/pos-systems.md) — the shop-floor equivalent.


## Related topics

- [Integrations overview](https://docs.tryoto.com/integrations/overview.md)
- [POS integrations](https://docs.tryoto.com/integrations/pos-systems.md)
- [Plans, pricing and add-ons](https://docs.tryoto.com/pricing/plans-and-packaging.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.