Exporting Order Data From ProfitMetrics
How to download your orders as a CSV file, which of the three export formats to pick, and what every column in the file means.
The Orders page in ProfitMetrics holds every order that has been tracked for your store, along with the cost and profit figures calculated for it. You can download that data as a CSV file for a date range you choose, in one of three formats. This article covers how to run the export, how the three formats differ, and what each column contains.
On this page- Running the export
- Choosing a format
- Order columns
- Tracking parameter columns
- The products JSON column
- Product columns
- Troubleshooting
Running The Export
Open the Orders page and click Export. A dialog opens asking for a date range and a file format.
The Date field defaults to Today. Click it to pick any other range, then choose one of the three formats and click Export. The file downloads straight to your browser.
NOTE: Dates are handled in UTC, so an order placed late in the evening in your own time zone can appear on the following day in the export. Widen the range by a day at either end if an order you expect is missing.
Choosing A Format
All three formats cover the same orders. What changes is how the products on each order are laid out.
| Export option | Rows | What it contains |
|---|---|---|
| CSV with products as JSON | One row per order | Every order column, plus a final column holding all of that order’s products as a single block of JSON. |
| CSV with only products | One row per product | Order number plus the details of one product line. An order with four different products produces four rows. |
| CSV with only orders | One row per order | Identical to CSV with products as JSON with the JSON column removed. No product detail at all. |
The practical difference is what you plan to do with the file. CSV with only products is the one to use for product-level analysis, because each product sits on its own row ready to sort, filter or pivot. Both order-level formats keep one row per order, which is what you want for order counts, revenue and profit totals — but the products are either packed into a single cell of JSON or left out altogether.
Order Columns
These columns appear in CSV with only orders and in CSV with products as JSON. All money values are in your account currency and use a full stop as the decimal separator.
| Column | What it means |
|---|---|
order_id |
The order number as it appears in your webshop. Use this to match a row back to the order in your platform admin. |
total_price |
Order revenue excluding VAT, after discounts, including anything the customer paid for shipping. |
shipping_charged |
The amount the customer paid for shipping. This is already part of total_price |
product_cost |
The combined cost price of every item on the order. |
shipping_cost |
What the shipment costs you to send, taken from your shipping cost settings. Shows 0 if no shipping cost is configured. |
extra_cost |
Any other per-order cost you have configured, such as packaging, picking or a fixed handling charge. |
payment_fee |
The cost of taking the payment, based on the payment gateway fees configured in your account. |
gross_profit |
total_price minus product_cost, shipping_cost, extra_cost andpayment_fee This is the profit figure ProfitMetrics reports to your ad platforms. |
vat |
The VAT amount on the order. This is 0 when your store reports revenue excluding VAT, which is the usual setup. |
breakeven_roas |
total_price divided by gross_profit. The return on ad spend at which this order breaks even — spend more than that and the order loses money. Goes negative when the order made no profit. |
timestamp |
When the order was placed, in UTC, written as 2026-09-08T16:55:21Z. |
voucher_code |
The discount code used on the order. Empty when no code was applied. |
payment_method |
The payment method as your platform reports it, for example shopify_payments or paypal. The exact wording comes from the store, not from ProfitMetrics. |
shipping_method |
The delivery option the customer chose, named exactly as it is in your store. |
shipping_country |
Delivery country. |
shipping_zipcode |
Delivery zipcode/postcode. |
shipping_state |
Delivery state, province or region. Empty for countries where your platform does not collect one. |
order_margin |
Gross profit as a percentage of total_price. A value of 76.44 means the order kept 76.44% of its revenue as profit. |
has_gclid, has_wbraid, has_fbclid, has_fbp, has_gacid |
Tracking parameters found on the order. See Tracking parameter columns below. |
has_default_calculated_unit_cost |
TRUE if one or more items on the order used your fallback margin instead of a real cost price from a product feed or a cost price override. Treat the profit on those orders as an estimate. |
json_products |
Only present in CSV with products as JSON. Holds every product on the order as JSON. See The products JSON column. |
NOTE: Gross profit here is revenue after product, shipping, payment and extra costs. It does not deduct ad spend or your fixed overheads, so it will not match the net profit shown elsewhere in ProfitMetrics.
Tracking Parameter Columns
These five columns record whether ProfitMetrics was able to attach a tracking identifier to the order. They are true or false only — the identifiers themselves are never included in the export.
| Column | What it means |
|---|---|
has_gclid |
A Google Ads click identifier was captured, so the order can be attributed to a Google Ads click. |
has_wbraid |
A Google Ads click identifier of the type used when a visitor arrives from an app or from a browser where the standard identifier is unavailable. |
has_fbclid |
A Meta click identifier was captured, so the order can be attributed to a Facebook or Instagram ad click. |
has_fbp |
The Meta browser cookie was present. This helps Meta match the order to a visitor even when there is no click identifier. |
has_gacid |
A Google Analytics client identifier was captured, tying the order to a browsing session in GA4. |
When an identifier is present on an order this information will be sent to the relevant platform to assist in attributing conversions back to clicks. Point of sale, telephone and other offline orders normally have all five set to FALSE, because the customer never passed through your website with an ad click attached. That is expected and is not a sign of a tracking fault.
The Products JSON Column
In CSV with products as JSON, the last column holds every product on the order in one cell. The value is a JSON list, with one entry per product line, so an order with two different products has two entries inside a single cell on a single row.
[
{
"unit_price": 74.5,
"unit_cost": 28.9,
"unit_cost_default": false,
"sku": "TRV-4410-BLK",
"quantity": 1,
"title": "Rivelin 40L Travel Backpack - Black"
},
{
"unit_price": 18.0,
"unit_cost": 6.25,
"unit_cost_default": true,
"sku": "TRV-2208-SLV",
"quantity": 2,
"title": "Packing Cube Set of 3"
}
]
Each entry uses the same six keys:
| Key | What it means |
|---|---|
sku |
The product or variant identifier your store sends with the order. |
title |
The product name as your store sends it. |
quantity |
How many units of this product were bought. |
unit_price |
The sell price of one unit, excluding VAT, after any discount. |
unit_cost |
The cost price of one unit. |
unit_cost_default |
true when the cost price came from your fallback margin rather than a real cost price. |
NOTE: Spreadsheet software will not split this column for you. If you want products in rows rather than in JSON, use CSV with only products rather than trying to unpack the JSON by hand.
Product Columns
CSV with only products puts each product line on its own row. The order number repeats down the rows.
| Column | What it means |
|---|---|
order_id |
The order this line belongs to. Repeats on every row of a multi-product order. |
sku |
The product or variant identifier your store sends with the order. |
quantity |
How many units of this product were bought. |
unit_price |
The sell price of one unit, excluding VAT, after any discount. |
unit_cost |
The cost price of one unit. |
unit_cost_default |
TRUE when the cost price came from your fallback margin rather than a real cost price. This is the per-product version of has_default_calculated_unit_cost. |
title |
The product name as your store sends it. |
This export carries no order-level figures. There is no revenue total, no shipping charged, no payment fee and no gross profit, because those belong to the order rather than to any one product. You can still see the individual order totals on this report using a pivot table, but running a separate 'CSV with only orders' report is a simpler solution.
Troubleshooting
| Symptom | Check |
|---|---|
| The file has fewer orders than you expected | The export only covers the date range in the Date field. Also, it's sometimes possible that not all orders have been sent to ProfitMetrics, depending on the configuration of your integration. |
| Product rows do not add up to the order total | The product export carries sell price and cost price per unit only. Shipping charged, payment fees and extra costs sit at order level, so use one of the order exports for the full picture. |
| Profit looks wrong on some orders | Filter on has_default_calculated_unit_cost. Any order marked TRUE has at least one item priced from your fallback margin rather than a real cost price. |
Every tracking column reads FALSE |
Expected for point of sale, phone and other offline orders. If it is happening on normal web orders, your tracking setup or consent configuration needs checking. |
| The JSON column will not split in your spreadsheet | Use the CSV with only products export instead, which is already one row per product. |
| Something else | Send the export and the order number to support@profitmetrics.io. |