> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aloftly.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Product revenue

> Order-time line-item revenue published by the fenced Shopify bulk pipeline.

| Contract           | Value                     |
| ------------------ | ------------------------- |
| Metric key         | `shopify.product_revenue` |
| Source             | Shopify                   |
| Status             | active                    |
| Type               | source                    |
| Semantic version   | 1                         |
| Catalog visibility | Picker-eligible           |

## How it's calculated

```text theme={null}
value = immutable order-time line-item gross original total. Product revenue = SUM(value) over the selected window.
```

### Built from

* `Bulk order line item originalTotalSet.shopMoney.amount`
* `Line item quantity and product/variant identity`

## Known caveats

* Only the bulk product publisher may write this key.
* This is gross line revenue. It does not subtract discounts, refunds, or cancellations.

## Where this appears

* Top Products revenue
* Top Products grouping and sorting

<AccordionGroup>
  <Accordion title="Grain and identity" icon="ruler">
    One order-time line item. The Top Products read groups rows by product title, then SKU, variant title, or variant id.

    **Join and identity keys**

    * HMAC line-item dedupe identity
    * orderToken for distinct-order reads
    * productHandle/productTitle/variantId/variantTitle/SKU for grouping
  </Accordion>

  <Accordion title="Filters and boundaries" icon="filter">
    * Organization and store are resolved from the authenticated request.
    * Reads use a half-open interval: recorded\_at >= start and recorded\_at \< end.
    * ShopifyQL sales values are used as reported; no extra paid-order filter is added by Aloftly.
  </Accordion>

  <Accordion title="Timezone, currency, and freshness" icon="clock">
    **Timezone.** ShopifyQL groups by the shop reporting date; Aloftly stores that date as a UTC-midnight label. Order lifecycle events retain their provider timestamp.

    **Currency.** Currency values use Shopify shop-money amounts. Aloftly does not perform foreign-exchange conversion; mixed-currency all-store totals must not be interpreted as converted currency.

    **Freshness.** Daily scheduled product bulk sync and deliberate history runs.
  </Accordion>

  <Accordion title="Version history" icon="clock-rotate-left">
    | Date       | Change                                                                     |
    | ---------- | -------------------------------------------------------------------------- |
    | 2026-08-03 | Bound the metric to the executable certified semantic release.             |
    | 2026-07-27 | Registered Shopify authority and metric contracts in the semantic catalog. |
  </Accordion>
</AccordionGroup>
