Skip to content
  • There are no suggestions because the search field is empty.

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

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.