KPIs
Overview
The main goal of the profitability project is to calculate net margin, and slice it by various dimensions.
One of the main challenges is to allocate common costs to specific sales. For example, some supplyers provide staggered bonuses that are triggered at a certain threshold. Or when a client orders multiple items, but pays transport cost only once, then it needs to be split up / allocated.
KPQ
How can we know what our margins are, by:
- product
- channel
- time period
- categories
- brands
KPIs
Entities
Indices
- \(s\): a supplier
- \(b\): a brand
- \(i\): an Item in our sales catalog (i.e. an SKU)
- \(b\): a brand
- \(o\): an order
- \(l\): an order line, consisting of
- \(q\): a quantity of an
- \(i\): item
- \(l\): an order line, consisting of
- \(v\): an inVoice
Margin
Gross Margin
For a single SKU \(i\) of an order \(o\), the margin is calculated as
With:
- \(M_{i,o}\) = Margin of SKU \(i\) on order \(o\).
- \(P\) = Price
- \(R\) = Shipment revenue (the shipment cost charged to the client, if any. This is on the invoice, and not on the item!)
NOTE: After feedback from Frederic we decided that the Gross Margin already takes into account the marketplace fee, handling and storage. Also all Transport costs should be included.
Net Margin
Where \(F\) is the marketplace, storage and handling Fee paid by the merchant
With:
- \(F^{marketplace}_{i,o}\) : A fee charged by the market place, e.g. BOL, for each sale
- \(F^{handling}_{i,o}\) : A handling fee charged by BOL to expediate a package (Pick&Pack)
- \(F^{storage}_{i,t}\): Storage cost in BOL Warehouse, for a period of time
and \(T\) is the shipment cost defined as:
With:
- \(T^{I}_{i,t}\): Transport from Profilec Warehouse to BOL LVB
- \(T^{II}_{i,o,t}\): Transport from Warehouse or LVB to Client (last mile)
Cost Allocation
Generally speaking, we allocate the costs as follows to a item \(i\) in an order \(o\):
- if the cost is on the SKU, but not on the order (e.g. \(F^{storage}\)), then we are storing this data in the table
FactSalesCost. To calculate the impact on an order line, we take the total cost per analysis period (e.g. per month) for that SKU, divided by the number of items of that SKU sold during that same period. - if the cost is on the order, but not on the order line item (such as e.g. Shipment Cost) then we spread it pro rata by money value. These are stored redundantly in
FactCustomerInvoiceLine, and we can calculate the pro rata share per order line. - if the cost is neither on the order nor on the item (e.g. salaries, rent, etc.), then it's considered a fixed cost. We exclude it from the calculation of the net margin.
Variables
Conditions overview
Cost Price \(P^{cost}\)
Where:
- \(P^{invoice}_{i,o}\): The cost-price for the invoice at hand for the SKU, as calculated by logic4$
- \(SC\): Sellout Conditions, defined on a SKU
- \(BC\): Brand Conditions, defined on brand
- \(TBC\): Target Brand Conditions, defined on brand
In more detail, this is:
SC: Sellout Conditions
Sometimes, brands offer a sales commission in order to stimulate sales.
In the Excel-Source, we will store the price reduction per item sold, as a money amount and for a given time period.
\(SC_i\): Sales condition amount, as stored in Excel.
BC: Brand Conditions
Sometimes, a supplier is offering sales conditions on a brand instead of on an SKU. This is called a Brand Condition, or \(BC\).
The formula for the brand condition is:
for a given brand \(b\) and a year \(y\).
We store \(BC_b\) as a percentage in an Excel sheet, per brand, for a given time period.
TC: Target Back Conditions
Sometimes, brands offer a back condition that triggers when a certain sales target is reached for the brand. This is called target back condition, which we denote as \(TBC\).
There are different thresholds for the target back conditions, and this is very difficult to estimate systematically in advance. For the purpose of BI, we will track the most likely back condition per brand, before it is realised.
We store \(TBC_{b,y}\) in an Excel sheet, per brand and per year.
Delivery Revenue \(R^{delivery}\)
This is the cost charged to and paid by the client. We need to split the delivery cost if an order contains multiple line items. We allocate pro-rata, based on the sales price, such that for line item \(i\) in an order, we have:
Where:
- \(P^{sale}_{i}\): The sales price of item / SKU \(i\)
- \(OrderValue\): The total amount of the order, in EUR
- \(R^{delivery}_{o}\): Cost of shipment of the order, charged to the client
The applicable transport cost charged to the client depends on the channel. However, we can get it centralised from logic4 (versending).
Note that, for BI purpose, all costs and prices are always without VAT.
Fees \(F\)
Marketplace Fees \(F^{marketplace}_{LVB}\)
The Market Place Fee is charged by BOL, and is only appliccable for items stored in LVB. It is available per item via API.
Handling Fees \(F^{handling}\)
The handling fee depends on the Warehouse (LVB or own Warehouse).
LVB \(F^{handling}_{LVB}\)
The BOL handling fee (Pick & Pack) is available per item via API.
LVB is the drop shipping service from Bol. The merchant pays various fees for the service.
There are six different BOL warehouses. They charge for storage, based on the size.
Warehouse \(F^{handling}_{WH}\)
For shipments handled by Profilec, we define a fixed cost per SKU category (Excel).
Storage Fees
\(F^{storage}_{LVB}\)
The storage fee applied by BOL/LVB is available per item.
TODO: Do they report it by item sold? Probably not, but it's per item stored. If that's the case, then we need to apply some sort of FIFO or LIFO accounting of the items sold.
\(F^{storage}_{WH}\)
The storage fee for shipments stored in the Warehouse is defined as a fixed cost per SKU category. We store it in an Excel.
Transport fees \(T\)
Warehouse \(T^{I}\)
TODO: Need to understand this better. In the consulting, we discussed the different BOL sizes, and an exception list per SKU. But it's not clear how this relates to the channels.
Last Mile \(T^{II}\)
Q: How do we know which shipment has which type?
A: We know from logic4.
Post NL to BE \(T^{II}_{Post NL -> BE}\)
We get the cost from Excel.
Post NL to NL \(T^{II}_{Post NL -> NL}\)
For deliveries to NL, Post NL charges a seasonality surcharge in high season.
We get the cost from Excel (and the type from logic4).
\(T^{II}_{dynalogic}\)
We have a price list depending on size and service. As a matter of fact, we have different service levels from dynalogic, such as:
- shipment to curb
- shipment into house
- installation in house
However, for now we ignore the service level. We just take the price from an Excel.
LVB \(T^{II}_{LVB}\)
We take the cost from BOL and split pro rata based on sales price
Overview Table: Channel, Storage, and shipment Method
| Channel | Storage | Delivery Methods | \(F^{marketplace}\) | \(F^{handling}\) | \(F^{storage}\) | \(T^{I}\) | \(T^{II}\) (last mile) |
|---|---|---|---|---|---|---|---|
| Webshop | Profilec WH | Post NL | 0 | \(F^{handling}_{WH}\) | \(F^{storage}_{WH}\) | \(T^{II}_{Post NL -> BE}\) or \(T^{II}_{Post NL -> NL}\) | |
| Webshop | Profilec WH | Dynalogic | 0 | \(F^{handling}_{WH}\) | \(F^{storage}_{WH}\) | \(T^{II}_{dynalogic}\) | |
| Webshop | Distributor WH | Lanckriet | 0 | 0 | 0 | \(T^{II}_{lanckriet}\) | |
| Bol | LVB | LVB | \(F^{marketplace}_{LVB}\) | \(F^{handling}_{LVB}\) | \(F^{storage}_{LVB}\) | \(T^{II}_{LVB}\) | |
| Bol | Profilec WH | Post NL, Dynalogic | 0 | \(F^{handling}_{WH}\) | \(F^{storage}_{WH}\) | \(T^{II}_{Post NL -> BE}\) or \(T^{II}_{Post NL -> NL}\) | |
| Bol | Distrutor WH | Lanckriet | 0 | \(F^{handling}_{WH}\) | \(F^{storage}_{WH}\) | \(T^{II}_{Post NL -> BE}\) or \(T^{II}_{Post NL -> NL}\) | |
| Shop | Profilec WH | Client | 0 | 0 | \(F^{storage}_{WH}\) | 0 | |
| Shop | Profilec WH | Profilec Van | 0 | \(F^{handling}_{WH}\) | \(F^{storage}_{WH}\) | 0 (because fixed cost) | |
| Shop | Distributor WH | Lanckriet | 0 | 0 | 0 | \(T^{II}_{lanckriet}\) |
QUESTION: Does it ever occur that we deliver from Profilec WH -> BOL WH/LVB?