Skip to main content
All CollectionsIntegrationsExact Online
Exact Online - Data Mapping & Synchronization
Exact Online - Data Mapping & Synchronization

This article describes in detail what and how data is used for the connection with Exact Online for Trade

Carla Domingos avatar
Written by Carla Domingos
Updated over 3 months ago

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 Price>9999999.99

THEN OP.price = 0

Otherwise OP.price = Price

unlimitedStock

If IsPurchaseItem = false

THEN unlimitedStock = true
Otherwise unlimitedStock = false

stockLevel (*3)

CurrentStock - PlanningOut

status (*4)

If (EndDate<currentDate) OR (IsMakeItem = 0 & IsPurchaseItem = false)

THEN OP.status = disabled

Otherwise OP.status = enabled

eanCode

Barcode

assembled (*2)

If isMakeItem = 1

THEN assembled = true
Otherwise assembled = false

(*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

Item.Description (from Optiply)

remoteId

ID

price

If using LOT → supplierItem.PurchasePrice divided by supplierItem.PurchaseUnitFactor
else → supplierItem.PurchasePrice

skuCode

SupplierItemCode

status

default: “enabled”

eanCode

item.barcode

lotSize

(*1) IF useLOT = true

THEN lotSize = supplierItem.PurchaseUnitFactor
Otherwise we don’t map lotSize from Exact

minimumPurchaseQuantity

(*1) IF useMOQ = true

THEN minimumPurchaseQuantity = supplierItem.MinimumQuantity
Otherwise we don’t map MinimumQuantity from Exact

deliveryTime

(*1) IF use_lead_time = true

THEN deliveryTime = PurchaseLeadTime
Otherwise we don’t map deliveryTime from Exact

preferred

(*2) IF map_preferred_supplier = true

THEN preferred = supplierItem.MainSupplier
Otherwise we don’t map preferred from Exact

(*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 QuantityInPurchaseUnits = quantity / supplierProduct.lotSize

Otherwise QuantityInPurchaseUnits = quantity

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

ID

totalValue

0

placed

OrderDate

completed (*1)

FinishedAssemblyDate (*1)

expectedDeliveryDate

AssemblyDate

supplierId

Optiply.Supplier.Name = Exact.AssemblyOrder.WarehouseCode (*2)

(*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

PlannedQuantity

subtotalValue

0

remoteID

ID


Receipt Lines - Exact to Optiply

Optiply

Exact Online

quantity

IF useLot=true

THEN quantity = QuantityReceived * lotSize

Otherwise quantity = QuantityReceived

occurred

Created

remoteID

ID

Receipt Lines - Using Exact AssemblyOrders to Optiply

Optiply

Exact Online

quantity

FinishedQuantity

occurred

now()

remoteID

ID


Did this answer your question?