This article is designed to provide you with a clear understanding of how data flows between Exact Online and Optiply, ensuring your operations run smoothly and efficiently.
Synchronization Overview
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
Below you find the data mapping per entity.
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) 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.
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.
Product Compositions
Optiply | Exact Online |
composedProductId | Id |
partProductId | BillOfMaterialItemDetails.ItemId |
partQuantity | BillOfMaterialItemDetails.QuantityPerBatch (*1) |
remoteId | BillOfMaterialItemDetails.Id |
Exact allows a partProduct to be Parent of it own Parent, which is something Optiply does not support. Our database has a rule that prevents two products from simultaneously serving as both composed products and parts in different sets. In other words, if you've already created composed product A using part B, you won't be able to create composed product B using part A.
To Optiply, a composition represents the quantity to produce 1 final composed with a minimum 1 per partQuantity.
(*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.
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 that field or not. By default, we will not map this 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 that field or not. By default, we will not map this field
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) Customer can decide if we should map that field or not. By default, we will not map this field.
(*2) Customer can decide if we should map that field or not. By default, we will map this field.
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.
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.
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
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.
Sell Order Lines - Using Exact Production Orders
Optiply | Exact Online |
optiplyWebshopProductArticleCode | Item |
quantity | PlannedQuantity |
subtotalValue | 0 |
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
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 customer 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 the DateTime we send the Orders to Exact (OrderSyncDateTime).
Calculation is:
ReceiptDate = OrderSyncDateTime + OP.supplier.deliveryTime
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
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.
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.
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.
Buy Order Lines - Using Exact AssemblyOrders to Optiply
Optiply | Exact Online |
optiplyWebshopProductRemoteID | Item |
quantity |
|
subtotalValue | 0 |
remoteID | ID |
Receipt Lines - Exact to Optiply
Optiply | Exact Online |
quantity | IF THEN Otherwise |
occurred | Created |
remoteID | ID |
Receipt Lines - Using Exact AssemblyOrders to Optiply
Optiply | Exact Online |
quantity |
|
occurred | now() |
remoteID | ID |