Overview
Sending product content to Bol and sending offers to bol are two separate things:
- Product content (the product export) enriches bol's shared product catalog for an EAN. It does not put the product in your store.
- An offer (the offer export) is what puts the EAN on your bol store, with a condition, a price, a stock and a fulfilment method. Creating the offer in Activation replaces the step you would otherwise do by hand in the bol Seller Dashboard.
Every offer sent to a bol flow must carry two bol-specific objects, a condition and a fulfilment, on top of the common price and stock. They mirror the bol Retailer API offer fields one to one, with no defaults: an offer without them is refused.
Things to know before you start:
- A bol offer is unique per retailer, EAN and condition. Creating it is what puts the EAN in your store; content alone never does. The product must have an EAN.
- If bol does not have content for the EAN yet, the offer is still created but stays not for sale on bol until content exists. Send content with the product export.
- The flow needs a valid economic operator (see below), otherwise the offer export cannot be turned on.
- Prices are EUR only.
Before you export: economic operator and permissions
Step 1: Get the ID of your economic operator
Under the EU Digital Services Act, bol only puts an offer on sale when it references a valid economic operator that belongs to your bol account. Economic operators are not shared between accounts: each one has its own ID (a UUID) and a status (PENDING, VALID or INVALID).
If you don't have an economic operator yet
- Log in to your bol seller account (partner platform).
- Go to Settings, then Economic Operators.
- Add your economic operator and enter its details (name, address, contact information). To add several at once, download the Excel template at the bottom of the page, fill it in without changing the column names, and upload it on the same page.
- bol checks the details. The status starts as PENDING and must become VALID. If it ends up INVALID, correct the details or contact bol.
You do not need to link the operator to your items in bol: Akeneo sends it with every offer.
Find the ID
Each economic operator has an ID (a UUID, for example 3f2b8c1e-...). Copy the ID of an operator whose status is VALID.
Without a VALID economic operator, bol keeps the offer offline.
Step 2: Add it to your bol flow
- In Activation, open your bol flow settings.
- In the offer export settings, enter the ID in Economic operator ID. It is required whenever offer export is on.
- Turn offer export on. The toggle stays read-only until an ID is stored.
The same economic operator is sent on every offer of the flow. There is one ID per flow; it cannot be set per offer.
Before sending anything, each offer export run checks the ID with bol. If it is missing, unknown, or not VALID, the job stops before sending any offer and tells you what to fix.
Step 3: Grant the right permissions on bol
When you connect (or reconnect) bol, tick the following resources when you authorize Akeneo:
| Resource | Access | Used for |
|---|---|---|
| Offers | Read and write | Looking up, creating and updating offers |
| Economic Operators | Read | Checking your economic operator |
If a permission is missing, the job stops with: "Reconnect bol in the connection settings and grant Offers read and write, and Economic Operators read permission."
Sending offers to Activation
Offers are brought into Activation with the offer import, flat file included. The general import process (file formats, upload methods, scheduling) is covered in the offer import article. This article only covers what is specific to bol.
The bol-specific fields are sent:
- in an offer import file, as one column per field. Values are case-insensitive;
- through the offer API, under marketplaceOfferDetails.bol.
Common offer fields
Price and stock come from the standard offer fields. bol's limits are checked before anything is sent. A refused offer gets an error in the job report and stays pending.
| Field | Import column | Sent to bol | Rules |
|---|---|---|---|
| Product identifier | product_identifier | Its mapped EAN, as the offer EAN | The product must have an EAN. bol keeps one offer per EAN and condition, so two live offers of a product in the same condition are refused. |
| Offer SKU | offer_sku | As the offer reference | Matching on bol is done on EAN and condition, not on SKU. |
| Base price | base_price_amount + base_price_currency | On creation, then only when the price changes in Akeneo | EUR only, 1 to 9999 including VAT, max 2 decimals. Not resent otherwise, so a repricer can own the price on bol. |
| Discounted price | n/a | Never | Discounts and date windows are not sent to bol. |
| Stock quantity | stock_quantity | FBR offers only | Integer 0 or more. Infinite stock is refused. FBB stock is managed by bol and never sent. |
Bol-specific offer fields
12 fields, grouped under condition and fulfilment. Only two are always required; the others become required depending on the value picked above them. API paths are relative to marketplaceOfferDetails.bol.
Condition
| API field | Import column | Required | Allowed values | Description |
|---|---|---|---|---|
| condition.category | bol_condition_category | Always | NEW, SECONDHAND, REFURBISHED | Condition of the item sold. Cannot be changed once the offer is on bol. |
| condition.state | bol_condition_state | When category is SECONDHAND | AS_NEW, GOOD, MODERATE, REASONABLE | Wear level of a second-hand item. |
| condition.comment | bol_condition_comment | No (SECONDHAND only) | Text, max 2000 characters | Free-text description of the item's state, shown to buyers. |
| condition.grade | bol_condition_grade | When category is REFURBISHED | A, B, C | Refurbishment grade. |
| condition.margin | bol_condition_margin | When category is REFURBISHED | true, false | Whether the item is sold under the VAT margin scheme. |
Fulfilment
| API field | Import column | Required | Allowed values | Description |
|---|---|---|---|---|
| fulfilment.method | bol_fulfilment_method | Always | FBB, FBR | Who ships: FBB = Fulfilment by bol (bol warehouse), FBR = Fulfilment by Retailer. |
| fulfilment.schedule | bol_fulfilment_schedule | When method is FBR | MY_DELIVERY_PROMISE, BOL_DELIVERY_PROMISE, SHIPPING_VIA_BOL | How the delivery time is set: from a bol delivery profile, from explicit min/max days, or via bol's shipping service. |
| fulfilment.stockManagedByRetailer | bol_stock_managed_by_retailer | When method is FBR | true, false | Whether the retailer manages stock reservations for open orders. |
| fulfilment.profileId | bol_delivery_profile_id | When schedule is MY_DELIVERY_PROMISE | Id of a bol delivery profile | Delivery profile created by the retailer in the bol Seller Dashboard. |
| fulfilment.deliveryPromise.minimumDaysToCustomer | bol_minimum_days_to_customer | When schedule is BOL_DELIVERY_PROMISE | Integer 0 or more | Minimum days before the order reaches the customer. |
| fulfilment.deliveryPromise.maximumDaysToCustomer | bol_maximum_days_to_customer | When schedule is BOL_DELIVERY_PROMISE | Integer 0 or more | Maximum days before the order reaches the customer. |
| fulfilment.deliveryPromise.ultimateOrderTime | bol_ultimate_order_time | No (BOL_DELIVERY_PROMISE only) | 12:00 to 23:00, on the hour | Order cut-off time for the delivery promise to apply. |
A field that does not apply to the chosen category, method or schedule is ignored.
Example import file rows (illustrative values)
offer_sku,product_identifier,base_price_amount,base_price_currency,stock_quantity,bol_condition_category,bol_fulfilment_method,bol_fulfilment_schedule,bol_stock_managed_by_retailer,bol_minimum_days_to_customer,bol_maximum_days_to_customer
SKU-001,8718526012345,29.99,EUR,,NEW,FBB,,,,
SKU-002,8718526067890,49.95,EUR,12,NEW,FBR,BOL_DELIVERY_PROMISE,true,1,2The first row is fulfilled by bol (no stock sent, bol owns it). The second is fulfilled by you with a 1 to 2 day delivery promise.
Publishing new offers
Run the offer export from your bol flow. For each offer, Activation checks bol for an existing offer with the same EAN and condition:
- None found: the offer is created on bol.
- One found: it is updated (see next section).
- Several found: the offer is refused as ambiguous, and the report lists the bol offer IDs so you can clean them up.
What is sent on creation: EAN, condition, base price, fulfilment (and, for FBR, the stock), your offer SKU as reference, and your economic operator. No country is sent: the country setting of your bol account applies.
Notes:
- The "delta" setting is ignored for bol offers: what is sent depends on what changed on each offer.
- A dry run looks offers up but creates and updates nothing.
- bol evaluates a new offer after it is created and does not publish how long that takes. If it is not for sale, the reasons are visible in the bol Seller Dashboard.
Updating existing offers
Akeneo updates an existing bol offer instead of creating a duplicate, including offers you created by hand in the Seller Dashboard (they are adopted, never duplicated).
| Part | When it is sent |
|---|---|
| Fulfilment | On every update. |
| Price | Once when Akeneo first touches the offer, then only on a real price change in Akeneo. |
| Stock | Only for FBR offers, and only when it changed. |
Good to know:
- Your repricer keeps control of the price. Because the price is only resent when it changes in Akeneo, a repricer on bol can own it after the first push.
- FBB stock is never sent. bol owns it, so an FBB offer whose only change is stock sends nothing.
- An unchanged offer is not resent.
- Matching is on EAN and condition, not SKU. Replacing an offer SKU with another on the same product updates the same bol offer.
Changing or removing offers
- Condition is fixed. bol never lets an offer change condition. If you change the condition of an already pushed offer, it is refused with a message in the report naming the old bol offer. Remove the old offer in the bol Seller Dashboard; the next run creates the new one.
- Selling two conditions of the same product is fine: keep one live offer (SKU) per condition.
- Removing an offer in Akeneo leaves the bol offer untouched. Remove it on bol if you want it gone. If you remove all offers of a product, an info message says the bol offer was left unchanged.
- If an offer is deleted on bol, the next change to it in Akeneo creates it again, price included.
Limits of the offer export
- One price per offer: discounted prices, date windows and volume pricing are not sent.
- One economic operator per flow, not per offer.
- No country selection: the country setting of your bol account applies.
- Deleting an offer in Akeneo does not delete it on bol.
Troubleshooting
Errors appear as messages on the offer in the job report. Offers that fail stay pending and are retried at the next run.
| Message / situation | What to do |
|---|---|
| Bol condition and fulfilment are missing | Add marketplaceOfferDetails.bol (API) or the bol import columns. |
| Price outside 1 to 9999 EUR, not EUR, or more than 2 decimals | Fix the price in Akeneo. |
| Infinite or negative stock on an FBR offer | Send a stock quantity of 0 or more. |
| Two live offers with the same condition | Keep one offer per condition for that product. |
| Several bol offers for the same EAN and condition | Remove the duplicates in the bol Seller Dashboard. |
| Condition changed on a pushed offer | Remove the old offer in the bol Seller Dashboard. |
| bol refused the offer | The message shows bol's own explanation. Fix the data and re-run. |
| Offer created but not for sale on bol | Check the reasons in the bol Seller Dashboard (for example missing content). |
| Economic operator missing, unknown or not VALID | Fix it in the flow settings or in bol. The job stopped before sending anything. |
| Reconnect bol message (401/403) | Reconnect and grant Offers read and write, and Economic Operators read. |