🔗 Exact Online: Data Mapping & Synchronisation
This guide details the data flow between Exact Online and Optiply. It covers synchronisation frequency, specific field mappings, and the logic used for different order types (Sales Orders vs. Invoices vs. Production Orders).
⏱️ Synchronisation General Board
Entity | Sync FROM > TO | Frequency |
Products | Exact > OP | each 30 minutes |
Product Deletions | Exact > OP | each 30 minutes |
Product Compositions | Exact > OP | each 30 minutes |
Suppliers | Exact > OP | each 30 minutes |
When New Supplier Products are added |
|
|
Supplier Deletions (setting to ignore) | Exact > OP | each 30 minutes |
Supplier Products | Exact > OP | each 30 minutes |
Supplier Products Deletions | Exact > OP | each 30 minutes |
Stocks | Exact > OP | each 30 minutes |
Buy Orders | Exact > OP | each 30 minutes |
OP > Exact (*3) | each 30 minutes |
|
Buy Order Deletions (*4) | Exact > OP | each 30 minutes |
Buy Order Line Added | Exact > OP | each 30 minutes |
Buy Order Line Changes | Exact > OP | each 30 minutes |
Buy Order Line Deletions | Exact > OP | each 30 minutes |
Sell Orders (*1) | Exact > OP | each 30 minutes |
Sell Order Deletions | Exact > OP | each 30 minutes (*2)(*2.1) |
Sales Invoices (*1) | Exact > OP | each 30 minutes |
Sales Invoices Deletions | Exact > OP | each 30 minutes (*2) |
Production Orders (*1) | Exact > OP | each 30 minutes |
Production Orders Deletions | Exact > OP | each 30 minutes (*2) |
Receipt Lines (Item Deliveries) | Exact > OP | each 30 minutes |
(*1) Sell Orders can be mapped to Exact Sales Orders OR Exact Sales Invoices OR Production Orders (the map is slightly different)
(*2) We only handle Sell Orders deletions, not Sell Order Line deletions.
(*2.1) We will also delete Sell Orders that were cancelled, salesOrders with Status 45 (Cancelled) on Exact
(*3) We will set Exact BuyOrder “ReceiptDate” according to the number of linear days associated with the Supplier as deliveryTime (OP.supplier.deliveryTime).
If deliveryTime is not defined (null or empty), we will set ReceiptDate to the next working day from the DateTime we send the Order to Exact (OrderSyncDateTime).
Calculation is:
ReceiptDate = OrderSyncDateTime + OP.supplier.deliveryTime
(*4) We can only handle deletions since this integration is totally being done in Hotglue, which happened on 20/11/2023.
We cannot sync deletions to buyOrders before that date.
🗺️ Data Mapping Details
Below you find the data mapping per entity.
1. Products
Optiply | Exact Online |
remoteId | ID |
name | Description |
skuCode | Code |
articleCode | SearchCode |
price (*1) | If THEN Otherwise |
unlimitedStock | If THEN |
stockLevel (*3) |
|
status (*4) | If ( THEN Otherwise |
eanCode | Barcode |
assembled (*2) | If THEN |
(*1) We always get the last updated price that does not have "end date" from Exact. When you create a new price, the old one automatically gets an "end date" and that way we can keep track of which one is the updated price. Prices can have a relation with specific customers and even have different unit conditions. We will only take into account prices not related to any customer and where Unit=DefaultItemUnit.
(*2) By default, we map assembled according to isMakeItem, but customers using Product Compositions can decide if we should map assembled according to compositions instead.
(*3) Customers can decide if we should map that field or not. By default, we will map this field
(*4) The customer can decide if we should use IsPurchaseItem and IsMakeItem to map status. By default, we will map using both as described in the table.
Phase-Out Status
Phase-out functionalities are unique to Optiply and not connected to the data transfer from Exact. In Optiply, phased-out items are snoozed from order calculations until the next restocking cycle or a manually set date.
Customers can decide if we should sync Stocks from All Warehouses, a Subset of Warehouses or just the default main Warehouse. By default, we sync from only one Warehouse, the main specified WarehouseID.
Although we can get stocks from specific warehouses, Exact does not allow to pull only products from specific warehouses, so we will pull all the products to Optiply.
2. Product Compositions
Optiply | Exact Online |
composedProductId | Id |
partProductId | BillOfMaterialItemDetails.ItemId |
partQuantity | BillOfMaterialItemDetails.QuantityPerBatch (*1) |
remoteId | BillOfMaterialItemDetails.Id |
⚠️ Limitation: Exact allows a part to be a parent of its own parent (circular reference). Optiply does not support this. You cannot create Composed Product A using Part B if Part B is already made of Part A.
(*1) PartQuantity can be calculated according to the composedProductQuantity when a Composition is producing more than 1 composedProductQuantity. For those cases, we can enable a calculation.
⚠️ We do not sync composition deletions, so if you remove the composed status from a product in Exact please reach out to us, and we will remove the assembled status from Optiply so that the product can be purchased again.
3. Suppliers
Optiply | Exact Online |
name | Name |
remoteId | ID |
emails | (*2) Email |
deliveryTime | (*3) PurchaseLeadDays |
(*1) We will not sync Suppliers without Name (*2) Customer can decide if we should map the Email field or not. By default, we will not map the Email field. If a customer wants us to sync the email but a supplier has an invalid email, that supplier will be created without an email address. (*3) Customers can decide if we should map the PurchaseLeadDays field or not. By default, we will not map this field
Troubleshooting Lead Time Mapping
If delivery time information is not accurately mapped from Exact to Optiply, users should manually verify and adjust delivery time settings directly within Optiply. This ensures the correct handling and calculation of supplier lead times.
4. Supplier Products
Optiply | Exact Online |
name |
|
remoteId | ID |
price | If using LOT → |
skuCode | SupplierItemCode |
status | default: “enabled” |
eanCode | item.barcode |
lotSize | (*1) IF THEN lotSize = |
minimumPurchaseQuantity | (*1) IF THEN minimumPurchaseQuantity = |
deliveryTime | (*1) IF THEN deliveryTime = |
preferred | (*2) IF THEN preferred = |
(*1) The customer can decide if we should map that field or not. By default, we will not map this field.
(*2) The customer can decide if we should map that field or not. By default, we will map this field.
Lot Sizes and MOQ Accuracy
Any inaccuracies in lot sizes or minimum order quantities originating from Exact will reflect in Optiply. Users should verify the data in Exact to correct any incorrect values.
5. Sell Orders - Using Exact Sales Orders
Optiply | Exact Online |
totalValue | AmountDC |
remoteID (*1) | OrderID |
placed | OrderDate |
completed | DeliveryDate |
(*1) We have only gotten OrderID since 2021 May. And only for new ones.
The customer can decide if he wants us to sync All Sales Order Status or just the “Completed” (Status=21(Complete)). By default, we pull ALL Sell Orders.
SalesOrders where UseDropShipment=1 will not be synced to Optiply since those orders don’t really impact over the stock management of the customer itself.
Attention: We do not sync Order changes in any way, order line changes, line deletions or new lines added to existing Orders will not be updated in Optiply.
6. Sell Orders - Using Exact Sales Invoices
Optiply | Exact Online |
totalValue | AmountDC |
remoteID (*1) | InvoiceID |
placed | InvoiceDate |
completed | InvoiceDate |
The customer can decide if he wants us to sync All Sales Invoices Status or just the “Completed”
(*1) We have only gotten OrderID since 2021 May. And only for new ones
Attention: We do not sync Order changes in any way, order line changes, line deletions or new lines added to existing Orders will not be updated in Optiply.
7. Sell Order Lines - Using Exact Sales Orders or Sales Invoices
Optiply | Exact Online |
optiplyWebshopProductArticleCode | ItemCode |
quantity | Quantity |
subtotalValue | AmountDC |
Customers can decide if we should sync SellOrders and/or SalesInvoices from All Warehouses, a Subset of Warehouses or just the default main Warehouse. By default, we sync from only one Warehouse, the main specified WarehouseID.
Sales Invoices might come from a Sale Order, so if we sync both from a shop we need to apply some filtering to avoid duplicate sales on the same products.
If sync SalesOrders only: We will get all the SalesOrders to Optiply
If sync SalesInvoices only: We will get all the SalesInvoices to Optiply
If sync SalesOrders and SalesInvoices: We will get all the SalesOrders, and we will get only SalesInvoices not related to a SaleOrder
8. Sell Orders - Using Exact Production Orders
Optiply | Exact Online |
totalValue | 0 |
remoteID (*1) | ID |
placed | PlannedStartDate |
completed | PlannedDate |
The customer can decide if he wants us to sync All Production Orders (Shop Orders) Status or just the “Completed” (Status=30(Finished) and Status=40(Completed)).
By default, we only pull ALL Sell Invoices.
Customers can decide if we should sync Production Orders from All Warehouses, a Subset of Warehouses or just the default main Warehouse. By default, we sync from only one Warehouse, the main specified WarehouseID.
Attention: We do not sync Production Order changes in any way, quantity changes or products inside the Orders will not be updated in Optiply.
9. Sell Order Lines - Using Exact Production Orders
Optiply | Exact Online |
optiplyWebshopProductArticleCode | Item |
quantity | PlannedQuantity |
subtotalValue | 0 |
10. Buy Orders - Optiply to Exact
Optiply | Exact Online |
optiplyBuyOrderId | OrderNumber |
optiplySupplierId | Supplier |
placed | OrderDate |
OrderSyncDateTime + OP.supplier.deliveryTime (*1) | ReceiptDate (*1) |
When Posting a BO to Exact, some fields are automatically filled in by Exact Online.
The account manager within the supplier will be filled in as "Purchase Agent", if no Account manager is linked to the supplier then the Creator of the purchase order will be put in the purchase agent field.
The Creator will also always be filled in by the user who made the connection between Exact and Opitply
11. Buy Order Lines - Optiply to Exact
Optiply | Exact Online |
optiplyWebshopProductId | item |
quantity | IF useLot=true THEN Otherwise |
remoteId | ID |
We sort BuyOrderLines by skuCode ascending when sending the buyOrders to Exact, so that the customer can more easily match lines between Optiply Frontend and Exact Frontend (since our FE allows customers to sort by SKU)
(*1) ReceiptDate to Exact
We will set Exact BuyOrder “ReceiptDate” according to the number of linear days associated with the Supplier as deliveryTime (OP.supplier.deliveryTime).
If deliveryTime is null or empty, we will set ReceiptDate equal to the DateTime we send the Orders to Exact (OrderSyncDateTime).
Calculation is:
ReceiptDate = OrderSyncDateTime + OP.supplier.deliveryTime
12. Buy Orders - Exact to Optiply
Optiply | Exact Online |
remoteID | PurchaseOrderID |
totalValue | AmountDC |
placed | OrderDate |
completed (*1) | DateNow (*1) |
expectedDeliveryDate | ReceiptDate |
optiplySupplierRemoteID | Supplier |
(*1) Order will be set to completed when:
OrderStatus in (30, 40) or ReceiptStatus in (30, 40)
30-Complete, 40-Canceled
13. Buy Order Lines - Exact to Optiply
Optiply | Exact Online |
optiplyWebshopProductRemoteID | Item |
quantity | Quantity |
subtotalValue | AmountDC |
remoteID | ID |
expectedDeliveryDate | ReceiptDate |
The customer can decide if we should sync BuyOrders from All Warehouses, a Subset of Warehouses or just the default main Warehouse. By default, we sync from only one Warehouse, the main specified WarehouseID.
14. Buy Orders - Using Exact AssemblyOrders to Optiply
Optiply | Exact Online |
remoteID |
|
totalValue | 0 |
placed |
|
completed (*1) |
|
expectedDeliveryDate |
|
supplierId |
|
(*1) Order will be set to completed when OrderStatus is 50(Completed)
(*2) There is no Supplier for AssemblyOrders, but we need it to create the buyOrders in Optiply, and we will use the WarehouseCode on the AssemblyOrder to map a Supplier.
The customer needs to have the Supplier with Name=WarehouseCode for each Warehouse he will use on the AssemblyOrders, and we will map to Optiply according to that.
16. Buy Order Lines - Using Exact AssemblyOrders to Optiply
Optiply | Exact Online |
optiplyWebshopProductRemoteID | Item |
quantity |
|
subtotalValue | 0 |
remoteID | ID |
17. Receipt Lines - Exact to Optiply
Optiply | Exact Online |
quantity | IF THEN Otherwise |
occurred | Created |
remoteID | ID |
18. Receipt Lines - Using Exact AssemblyOrders to Optiply
Optiply | Exact Online |
quantity |
|
occurred | now() |
remoteID | ID |
❓ Frequently Asked Questions (FAQs)
Why isn't the "Phase-out" status syncing from Exact?
Phase-out functionality is unique to Optiply and is not connected to the data transfer from Exact Online. You must manage phase-out statuses (snoozing items from calculations) directly within Optiply.
Why are my Product Compositions failing to import?
This often happens due to circular references. Exact Online allows a part to be a parent of its own parent (e.g., A is made of B, and B is made of A). Optiply's database rules prevent this logical loop. You must resolve these circular dependencies in Exact for the compositions to sync correctly.
Can I sync both Sales Orders and Sales Invoices?
Yes. To avoid duplicate sales data, Optiply applies a smart filter: we import all Sales Orders, but we only import Sales Invoices that are not related to an existing Sales Order.
My Supplier Lead Times (Delivery Time) look incorrect. Why?
If the "Purchase Lead Days" from Exact are not mapping accurately or are missing, we recommend manually verifying and adjusting the Delivery Time settings directly within the Optiply Supplier page to ensure accurate purchasing advice.
Why aren't my Production Order changes updating?
Optiply does not sync changes to Production Orders (or Sell Orders) after the initial import. If you change a quantity or add a product to an existing order in Exact, that change will not be reflected in Optiply.
Why do I see incorrect Lot Sizes or MOQs?
Optiply reflects exactly what is in Exact Online. If you see an incorrect Lot Size or Minimum Order Quantity, it is likely due to an inaccuracy in the Exact Online master data. Please verify your values in Exact first.
