Analytics and reports
Use dashboards, reports, cohorts, exports, and Live View in Analytics and reports.
This page is the contract that decides whether a number is right. It answers, for every reported metric: what it counts, whether it includes tax, which currency it is in, which clock owns its day boundary, and what happens to it after a refund.
Read it before reconciling two numbers. For the underlying money and ledger lifecycles, read Financial semantics.
Every money metric on this page is defined by the same seven fields. When a definition below omits a field, the default in this table applies.
| Field | What it tells you | Default |
|---|---|---|
| What it answers | the business question, in one sentence | — |
| Formula | the aggregate over named stored columns, not prose arithmetic | — |
| Tax treatment | net of all tax, contains tax, is tax, or not money | merchandise money is net of all tax |
| Currency | reports are always in the store’s one configured currency | store reporting currency |
| Clock | which timestamp decides the day the value lands on | store-local reporting date |
| Restatement | order-dated immutable, event-dated signed, or snapshot | see Restatement |
| Freshness | worker cadence and worst-case lag | see Per-source freshness |
Two rules follow from the template and are worth stating on their own:
Every store carries an order-level snapshot of whether prices were entered with tax included. One store can hold both regimes, so nothing may be summed across them without normalising first. Sellerlane normalises when the fact is written, not when the report is read.
Every merchandise figure is net of all tax, in both tax regimes. Gross sales, Discounts, Net sales, AOV, COGS-based gross profit and Shipping are reported after the tax embedded in a tax-inclusive price has been carved back out.
Tax is reported once, by the tax metrics. Taxes is the sum of every tax
line on the order — the tax embedded in tax-inclusive prices and additive tax.
It is the only place tax appears.
Therefore Net sales + Taxes is not double counting. It is the buyer-facing
subtotal, and adding shipping, tips, additional fees and adjustments to it gives
Total sales — the amount the buyer actually paid.
| Ladder term | India, GST-inclusive ₹11,800 order | United States, $10,000 + $2,000 tax |
|---|---|---|
| Gross sales | 10,000 | 10,000 |
| Discounts | 0 | 0 |
| Net sales | 10,000 | 10,000 |
| Taxes | 1,800 | 2,000 |
| Total sales | 11,800 | 12,000 |
On the inclusive order the buyer-facing line money is 11,800; the 1,800 of
embedded tax is subtracted from the line before gross_sales_cents and
net_sales_cents are written. On the exclusive order the line money is already
10,000 and nothing is subtracted. Both then add the full tax back once, in
Taxes, to reach what the buyer paid.
Before this normalisation the same metric names meant tax-inclusive money on one store and tax-exclusive money on another. If you are comparing a report against a figure captured earlier, that is the difference you are looking at.
Tax is levied on the discounted base, so there is no per-line tax on the pre-discount total to subtract. Gross sales is derived by applying the line’s own realised net-to-gross ratio:
net = discounted line money − embedded taxgross = round(pre-discount line money × net ÷ discounted line money)discount = gross − netDiscounts is defined as the difference, which is why gross − discounts = net
closes exactly at every grain despite the rounding. Rounding is exact decimal,
half away from zero.
One deliberate edge case: a line discounted to zero carries no tax line at all, so no ratio exists and the pre-discount total is used unchanged. On a tax-inclusive store that overstates Gross sales and Discounts by the same amount on that line. Net sales, Total sales, COGS, gross profit and AOV are unaffected because both terms move together.
Shipping is reported net of shipping tax on exactly the same basis as
merchandise. shipping_tax_cents is a breakout of the tax total, never an
addend to Total sales — adding it to Shipping would count that tax twice.
The line labelled Tax-inclusive price adjustment is the out-of-zone tax adjustment: the cross-zone re-gross delta that arises only under inclusive pricing. It is honestly zero on a tax-exclusive store, because no such delta exists there.
It is measured, not derived. It carries no cash-rounding component: that column is dead in the platform (checkout assigns a literal zero), so including it would have been a permanent zero masquerading as a figure.
If Total sales does not equal the sum of its rungs, the difference lands in
unattributed_total_sales_cents under its own name, and a database CHECK
constraint rejects the row rather than letting the ladder close on a wrong split.
Orders counts non-test, non-deleted orders with at least one reportable line
item. Gift-card-only orders are excluded from core sales reporting: issuing a
gift card creates a liability, not merchandise revenue. Gift-card and
store-credit redemption are tenders, not discounts.
| Term | Formula | Tax | Clock | Restatement |
|---|---|---|---|---|
| Gross sales | line money before discounts, less allocated embedded tax | net of all tax | order day | order-dated, immutable |
| Discounts | gross − net at line grain; presented negative | net of all tax | order day | order-dated, immutable |
| Returns | merchandise reversed by a refund linked to a return | net of all tax | refund-processed day | event-dated, signed |
| Non-return refunds | merchandise reversed by a refund with no linked return — goodwill and price-adjustment refunds | net of all tax | refund-processed day | event-dated, signed |
| Refunds | the full refund amount, tax and shipping included; positive | contains tax | refund-processed day | event-dated |
| Sales reversals | merchandise cancelled, edited or charged back away — the merchandise leg only; refunds are Returns and Non-return refunds | net of all tax | processed day | event-dated, signed |
| Total sales reversals | the same reversals expressed gross of tax — a disclosure figure, never subtracted a second time | contains tax | processed day | event-dated, signed |
| Net sales | gross − discounts − all refunded merchandise − merchandise cancelled, charged back or edited away | net of all tax | mixed | composite |
| Shipping | shipping charged net of shipping tax, less shipping reversals | net of all tax | order day / reversal day | signed net |
| Taxes | every tax line — embedded and additive — less tax reversed | is tax | order day / reversal day | signed net |
| Duties | not supported. The platform does not support duties: no order source persists an amount, the fact and rollup columns have been removed, and no family exposes a metric | — | — | — |
| Tips | tips captured, less tip reversals | not taxed | order day / reversal day | signed net |
| Additional fees | the COD fee, the one persisted customer-facing fee, less fee reversals | net of tax | order day / reversal day | signed net |
| Tax-inclusive price adjustment | the out-of-zone tax re-gross delta, less adjustment reversals. Zero on a tax-exclusive store. No cash-rounding component — that column is dead | not tax-basis dependent | order day / reversal day | signed net |
| Total sales | Net sales + Shipping + Taxes + Tips + Additional fees ± Tax-inclusive price adjustment + Unattributed | contains tax | mixed | composite |
| Average order value | (Gross sales − Discounts) ÷ Orders | net of all tax | order day | order-dated |
The Total sales line is an identity, not a description: every component column above it is already the signed net of its own reversals, and the order fact’s total is built from exactly those addends. It holds in both tax regimes, and a fully cancelled tax-inclusive order returns Taxes and Total sales to exactly zero.
Average order value is not Net sales ÷ Orders. Its numerator is the
order-dated merchandise after discounts — Gross sales − Discounts — with no
reversal term at all, so a refund never moves a past day’s AOV. Its denominator
and numerator therefore share one clock, which Net sales ÷ Orders would not.
| Term | Where | What it actually means |
|---|---|---|
| Returns | Sales, Orders, Finance | merchandise on refunds linked to a return, net of tax |
| Refunds | Sales, Orders, Finance | the whole refund amount paid back, tax and shipping included, positive |
| Refunds | Payments | successful refund transactions, a payment flow, not a sales reversal |
| Sales reversals | Sales, Orders, Finance, Total sales by location | the merchandise-only reversal (net_sales_reversal_cents) — the leg that reduces Net sales. All four commerce families bind the same column |
| Returns | Returns by product, Returns by reason | a count of returned units, not money. The same word heads a negative-money column in the families above |
| Total sales reversals | Profit | the total-sales reversal at product grain, plus an order-grain residual row |
| Taxes | Sales, Orders, Finance | all tax charged, signed by later reversals, every order |
| Tax collected | Taxes family | all tax on orders whose payment landed, order-dated, refunds netted separately |
| Orders | everywhere except Taxes | non-test, non-deleted, at least one reportable line item |
| Orders | Taxes family | the same, restricted to paid / partially-refunded / refunded orders |
| Revenue | Products, Collections, Vendors, Recommendations | product-attributed net merchandise sales |
| Revenue | Traffic, Marketing, Search, session-location families | attributed total sales — a whole-order figure credited to a session or touchpoint |
| Net sales | Products, Collections, Vendors | product-attributed net merchandise; no shipping, tax, tips or fees |
Reversal metrics are presented as negative signed contributions so displayed components add up to the displayed total. Never negate or subtract a signed reduction a second time.
This is the section merchants need most. A report is not a photograph — parts of it move, and the rules for which parts are strict.
Positive bookings are order-dated and immutable. Gross sales, Discounts, Orders, ordered quantity, COGS, and the original shipping, tax, tip, fee and adjustment amounts are booked once on the order’s store-local day and are never reduced afterwards. Gross sales for 1 March is the same number in April as it was on 2 March.
Every reversal is event-dated and signed. A reversal lands as a negative row on its own processed day. It is never back-dated into the order day.
The two rules combine differently for different metrics. Gross sales, Discounts, Orders, ordered quantity and COGS carry no reversal, so they never move. The component metrics — Shipping, Taxes, Tips, Additional fees, Adjustments — are reported as the order-day booking net of reversals that landed on later days, which is why a single day’s Taxes can be negative when a large refund was processed and no tax was charged.
| Event | Lands on |
|---|---|
| Refund, including return-linked | the refund’s processed date |
| Cancellation, full or partial | the adjustment’s processed date |
| Order edit | the adjustment’s processed date |
| Lost chargeback | the dispute’s resolved date |
| Return receipt (units) | the per-receiving date |
A lost chargeback reverses revenue, not just payment state. Voiding the order alone would leave Sales, Finance and Profit carrying the full order value forever after the provider clawed the money back. The reversal is the order’s still-unreversed value, written in the same shape a full cancellation uses, so the existing machinery caps chargeback-after-refund and refund-after-chargeback without double reversal. A replayed webhook finds nothing left to reverse.
Reversed quantity rate can legitimately exceed 100%. It is not
clamped into a more comfortable but false range.RFM, lifetime value, product ABC, inventory day snapshots, month-end inventory and outstanding liabilities are point-in-time snapshots. A snapshot’s history is only as good as the day it was computed on. Selecting a date returns the state at that snapshot; adding snapshot rows across days counts the same balance many times.
These are three different units and only one of them is summable.
| Unit | Definition | Summable across days? |
|---|---|---|
| Session (visit) | one retained visit row; opens on first qualifying activity, closes after 30 minutes idle or at UTC midnight | Yes |
| Visitor | a distinct first-party browser identity within the queried range | No |
| Customer | a resolved durable customer identity; a session may have none | n/a |
Staff, preview, test and bot traffic each carry their own traffic class, and the
merchant rollups select human only — so those four populations are excluded by
construction rather than by a filter someone could forget. Reports that
deliberately include bots expose Human or bot session as a dimension.
A new visitor is not a new customer, and a returning customer can arrive from a browser that looks new. Customer status comes from order history; visitor status comes from the browser identity consent permits Sellerlane to retain. Declining analytics tracking means no visit is persisted at all.
The durable Valkey session state — not the browser’s visit cookie and not a database lookup — is the session authority. State is isolated by a SHA-256 key over store, browser identity and traffic class; the raw browser identity is not present in the key. A request reuses the current visit only when all of these hold:
At exactly 30 minutes, and at 00:00:00Z, the next accepted activity receives a
new visit token. The visit cookie’s lifetime is the shorter of 30 minutes and the
remaining time to UTC midnight; it reflects the authoritative decision and is
never an independent fallback resolver.
Document requests and validated browser collect events are activity. A context-token refresh is a heartbeat and does not extend the session. Token selection and the seller resolve intent commit in one Lua transaction, so concurrent tabs observe one new token and a retried create intent cannot increment the session count twice. If the result is uncertain the buyer retries once with identical task, intent and candidate token; if neither attempt is observable the request continues with no analytics context.
These rules move session counts, conversion denominators, bounce, landing pages and attribution. They never create, remove or change an order, payment, refund, tax or sales amount.
bounced sessions ÷ all sessions in scope. Sessions still
open when the rollup ran sit in the denominator with bounced = false, so the
current day reads low until those sessions close.There are two funnels. They have different units and must never be read as one chain.
The session funnel is genuinely session-distinct and monotonic. Each stage counts sessions carrying a per-visit flag, and every rate divides by the same denominator, total sessions:
sessions → product view → add to cart → checkout started → purchase
Checkout completion rate is deliberately different: converted sessions ÷ checkout-started sessions. A session that places two orders is one converted session but contributes two eligible orders to an order report.
The checkout step funnel is a count of raw checkout events:
contact submitted → address submitted → shipping submitted → payment info submitted
Checkouts started and Checkouts completed in the Checkout family are also raw
event counts, and Checkouts abandoned there is started − completed within
the same day, floored at zero. A checkout that starts before midnight and
completes after it is counted as abandoned.
The Overview’s checkout card is where the two bases sit side by side: its Checkout started, Checkout completed and Checkout abandoned figures are session counts, while its four middle steps are the event counts above. Read the card as two blocks, not one descending chain. The Overview’s conversion card, by contrast, is session-based throughout.
Date presets, daily buckets, comparison ranges and scheduled deliveries all resolve in the store’s configured reporting timezone. Reporting dates are stored columns stamped once from the event’s own timestamp in that zone, never recomputed at read time. Range starts are inclusive and ends are exclusive internally, so combining adjacent periods cannot double-count midnight.
Order, refund, adjustment, event and page-view reporting dates read the store’s
timezone from the store record at write time. The one exception is a visit’s
start date, which is stamped from the reporting timezone the storefront server
sends on visit resolve; that server sends the store’s own timezone, and falls
back to UTC if the store record carries none. A visit’s start date is therefore
store-local in practice, but by a slightly different route than every other
stamped date.
Comparisons resolve calendar periods in the same zone. “Previous period” is the immediately preceding equal-length calendar window; “previous year” maps to the corresponding prior-year calendar dates.
Hourly buckets are store-local wall clock. Under daylight saving the fall-back hour merges two real hours and the spring-forward hour is empty.
Session close is UTC, on purpose, permanently. A session closes after 30
minutes idle or at UTC midnight, for session-count parity with Shopify. The
consequence is real and is not hidden: on an Asia/Kolkata store the boundary
falls at 05:30 local, so a visitor browsing at 05:25 and again at 05:35 is two
sessions inside one store-local reporting day. Only the session’s close is UTC
— its reporting day is still store-local, so daily session totals still bucket
correctly.
Web vitals is the one family whose reporting dates are UTC. Its samples are
bucketed by UTC date and both primary and comparison ranges must fall inside the
latest 90 UTC calendar days. The server normalises the range to UTC even when a
shared report form supplied the store timezone, and the resolved response reports
UTC. This is fixed report semantics, not a selectable dimension.
Everything else — including the product-recommendation session funnel — buckets on the store-local stamped reporting date.
“A few minutes” is not a useful answer. These are the actual cadences.
| Source | Cadence | Worst-case lag |
|---|---|---|
| Order, line, finance and fulfillment-timing facts | 5 min | ~10 min |
| Attribution | 5 min | ~10 min |
| Visit sweep (session close) | 5 min | ~10 min |
| Daily store rollup (3-day rolling window) | 15 min | ~30 min |
| Hourly store rollup (6-hour window) | 10 min | ~20 min |
| Abandoned-checkout stamping | 10 min | ~20 min |
| Cart abandonment and recovery | 30 min | ~1 h |
| Inventory and inventory movements | 1 h | ~2 h |
| Lifetime value, store credit, month-end inventory, product ABC | 6 h | ~12 h |
| Attribution reconciliation | 12 h | ~24 h |
| RFM, customer cohorts, cart retention | 24 h | ~48 h |
Storefront events enter a durable, idempotent outbox before background delivery. Every event has a stable identity, retrying delivery is expected, and consumers must produce one business effect. Visit resolution uses the same acceptance boundary: session-state mutation and resolve-intent append are atomic, and the storefront does not wait for the seller network call. During a Valkey outage no visit cookie or context is exposed rather than claiming tracking is available.
“Accepted” means the event intent is durably stored. It does not mean the event already appears in a report. Events for one browser/store identity are a strict FIFO: only that partition’s head is eligible for delivery, a retry keeps the same head, and acknowledgement promotes exactly one successor. Different identity partitions remain independently claimable, so one delayed visitor cannot hide or reorder another’s due events.
Every claimed payload is structurally validated before delivery. An invalid envelope is a poison record, not a business event: the same atomic claim copies its bytes, identity, partition, reason and quarantine time to durable quarantine, removes only that record, installs an idempotency tombstone, and promotes the next record in that FIFO. A lost response can cause a retried claim but cannot restore, duplicate or discard anything.
Quarantine records have no automatic expiry or retry. /health reports
analyticsDispatch.quarantineDepth and oldestQuarantinedAgeMs, and any
non-zero depth degrades analytics health until an operator preserves and
investigates the evidence. A quarantined intent is absent from every report until
it is corrected and replayed as a separately auditable event; quarantine itself
never counts as a sale, session, conversion or adjustment.
Production uses either managed synchronous multi-AZ durability or a dedicated
self-managed Redis with TLS, noeviction, AOF enabled and appendfsync always.
appendfsync everysec is deliberately rejected: it can acknowledge a short write
window before disk persistence and therefore does not satisfy the acceptance
contract.
Late-arriving events mark their actual reporting day dirty, so an old refund or identity link is rebuilt even when it falls outside the rolling refresh window. A freshness state describes data delay; it never changes a metric definition.
Stating this here is better than letting a merchant discover an empty report. Each entry names the missing primitive.
| Not reported | Why |
|---|---|
| Subscriptions | requires subscription contracts, recurring-order lineage, interval and activation/cancellation snapshots. Ordinary repeat orders are not subscriptions. |
| Order risk scoring | requires an order-risk provider with a levelled per-order assessment and a fraud-attributed cancellation decision. Neither is persisted, so every field would be a permanent zero. Chargebacks are a different primitive and are reported, from provider payment disputes. |
| Duties | the platform does not support duties. No order source persists an amount, the fact and rollup columns have been dropped, and no report family exposes a duties metric. |
| Sales by discount code | combined discounts retain only a combined reversal amount, not an immutable allocation back to each discount application. Proportional allocation would fabricate financial results. |
| Restocking / return fees | orders persist no restocking fee. The fact column, the rollup column and the metric were all removed rather than shipped as a permanent zero. |
| Shipping-discount split on the sales ladder | orders persist no merchandise/shipping discount split. Real shipping discounts are reported at their own grain by Shipping by order. |
| Shop channel, Shop Pay, Managed Markets, Markets, Autopilot, agentic commerce | each requires a Shopify-owned identity or classification. Sellerlane does not relabel online-store traffic, gateway names, shipping country or transaction currency as any of them. |
Source: the daily commerce rollup, at (store, day, channel, currency).
| Metric | Formula | Tax | Clock |
|---|---|---|---|
| Gross sales | SUM(gross_sales_cents) | net of all tax | order day |
| Discounts | SUM(discount_cents), shown negative | net of all tax | order day |
| Returns | return-linked refund merchandise | net of all tax | refund-processed day |
| Refunds | refund amount paid back, positive | contains tax | refund-processed day |
| Sales reversals | total-sales reversal, shown negative | contains tax | processed day |
| Net sales | see the ladder | net of all tax | mixed |
| Shipping, Taxes, Tips, Additional fees, Adjustments | signed component nets | see the ladder | mixed |
| Total sales | the ladder identity | contains tax | mixed |
| Orders | orders with a reportable line item, non-test, non-deleted | not money | order day |
| Average order value | (Gross sales − Discounts) ÷ Orders | net of all tax | order day |
On Sales, hourly granularity is available for gross sales, discounts, returns, refunds, net sales, total sales, orders and AOV only. The hourly rollup carries no shipping or tax columns.
Orders reads the same daily rollup as Sales — the same columns computed by the same writer, not a second opinion. It exposes a narrower money set (orders, AOV, refunds, returns and sales reversals) and adds sessions, converted sessions and conversion rate. Its hourly set is orders, AOV, refunds, returns and sessions; converted sessions and conversion rate have no hourly column.
Total sales by billing location groups the order’s own address. Billing and
shipping are separate order-address dimensions and never session IP geography.
Its Sales reversals is the merchandise reversal, unlike the Sales family’s.
It also carries Average order quantity (ordered quantity ÷ orders, original
demand only, never reduced by later reversals) and Reversed quantity rate
(reversed ÷ ordered), which can exceed 100% when a range contains reversals for
older orders.
Sales by company reads the order fact directly for B2B orders only. Its money is order-dated gross and is not reduced by later refunds; its returns and refunds columns are order-lifetime reference amounts. Use Finance or Returns & refunds for the refund-dated split. Company and location names are order-time snapshots.
Cancellations is dated by the day the order was cancelled, while Orders placed is dated by the order day, so Cancellation rate holds over any range.
Canceled orders and Partially cancelled orders are disjoint: an order whose
line cancellations belong to a same-day whole-order cancellation is counted once
by the former, and the latter counts only orders touched by a cancellation that
is not part of one. Cancellation rate stays the whole-order rate.
Tips counts tipped orders only. The rollup selects rows with a tip, so it cannot count untipped orders and has no denominator of its own.
Point of sale shares every financial formula, refund timing and currency rule with online. It differs only in dimensions — selling location, terminal, cashier, sales staff. A POS order never receives a synthetic online session to fill a traffic report, and a gift-card-only POS checkout belongs to gift-card liability reporting, not POS order count, merchandise sales or AOV.
Fees, payouts & reversals (the family labelled “Finance summary” in older copy) carries the same commerce columns as Sales. It is not a second rollup with matching predicates: both families read the same shared commerce table, so the money is identical because it is literally the same stored columns, not because two computations agree. Sales is the authoritative surface for Total sales. The two metrics only Finance has are Payment fees and Payouts; Additional fees and the total-sales reversal are on both families. Finance carries no Orders and no Average order value, and no COGS, gross profit, margin or cost coverage — those are on Profit.
Payments counts successful capture and refund rows on their transaction processed date.
| Metric | Meaning |
|---|---|
| Attempts | payment attempt identities, dated to the attempt’s first qualifying intent/auth/capture event, so a lifecycle crossing midnight does not move or repeat |
| Transactions | captures + refunds |
| Gross payments | successful captured money |
| Refunds | successful refunded money, positive |
| Net payments | gross payments − refunds; legitimately negative in a quiet period with refunds for older orders |
Payment-method and gateway breakdowns use the immutable attributes snapshotted on each transaction. Payments are not sales: authorizations, failures, voids, payouts, provider fees and disputes are separate measures.
Chargebacks & disputes reports live provider payment disputes only.
Chargeback rate is disputes opened in the period ÷ successful live gateway
captures processed in that period. Disputes are dated by the day the provider
opened them, not by the disputed order’s date, so a short period can exceed 100%.
Order risk scoring is not reported — see Not supported.
Taxes is order-dated and restricted to orders whose payment landed (paid,
partially refunded, refunded) — tax charged on a pending order is not tax
collected. This restriction is why Taxes on the Sales ladder and Tax collected here can differ on the same day.
| Metric | Meaning |
|---|---|
| Tax collected | every tax line, embedded and additive, on collected orders |
| Taxable sales | the double-count-safe taxable base: one taxable amount per tax target at its lowest applied priority, not net sales |
| Refunded tax | item tax + shipping tax on refunds, on the refund’s processed date; the out-of-zone adjustment is deliberately excluded |
| Net tax | tax collected − refunded tax |
| Orders | the payment-restricted count, unlike Orders everywhere else |
Geography follows the order’s own tax calculation basis: billing-first when tax was driven by the billing address, shipping-first otherwise, and a refund nets the same bucket it was collected in.
Tax by rate is a sibling, not a widening. It is gross-only — tax collected and orders, broken down by tax name and rate (CGST/SGST/IGST, VAT standard and reduced) under the same collected-orders filter, so it adds up to the jurisdiction total. Refunded tax and the taxable base live on Taxes.
Liabilities mixes flows and balances. Gift cards and store credit issued and redeemed are flows and sum across days. Outstanding balances and the loyalty points liability are point-in-time snapshots: the range reads the last day only. Loyalty points outstanding is a point count; its liability is that count valued at the program’s redeem rate.
COD & partial payments is order-cohort dated: cancellation and RTO rates
divide within one order cohort, so they will not line up day-for-day with Sales
or Cancellations. COD balance outstanding is a cumulative point-in-time balance
stamped on every day row and read as last-in-range.
Source: the daily profit rollup, at product/variant/order grain with POS dimensions.
| Metric | Formula | Note |
|---|---|---|
| Cost of goods sold | SUM(unit cost snapshot × net sold quantity) | order-dated; the snapshot is immutable, so a later cost change never rewrites history |
| COGS restored | cost restored by refund and cancellation events | on the event’s processed date |
| Gross profit | Net sales (net of tax) − COGS | mixed clock |
| Net sales with cost recorded | net sales on lines carrying a unit-cost snapshot | the gross-margin denominator |
| Net sales missing cost | net sales on lines with no cost snapshot | — |
| Gross margin | Gross profit ÷ Net sales with cost recorded | not ÷ Net sales |
| Cost coverage | costed units ÷ all units, sold and refunded | a unit share. The money share is Net sales with cost recorded ÷ Net sales, and the two need not agree |
Orders on Profit counts distinct orders on sale rows only — a refund event
retains its order for the Order dimension but must not create an order on the
refund day. Total sales reversals here is the total-sales flavour, including a
null-product order-grain row for any full, itemless or custom-refund residual;
that residual completes the order total without inventing product-level
merchandise, cost or profit.
Sales by vendor and Product ABC analysis read the same cost basis. Product ABC is a snapshot family over a 28-day lookback.
This figure is computed by the server for the Overview payload but is not rendered on any Analytics screen today, and it is not a report metric — no report, dashboard card or dashboard target can select it. It is documented here because the number exists and is referenced elsewhere. This is the formula the server actually computes:
gross profit + shipping + tips + additional fees + adjustments − outbound shipping cost − payment fees
It excludes customer sales tax, duties, overhead, payroll, marketing spend, financing, income taxes, reserves and chargebacks. It is a commerce contribution diagnostic, never accounting net profit.
Products, Variants and Collections share one engagement metric set: product or
collection views, added to cart, card impressions, card clicks, orders, units
sold, and Net sales — which is product-attributed net merchandise only.
Shipping, tax, tips, fees and order-level refund residuals cannot be allocated to
a product without inventing data, so they are absent by design.
Store search counts searches, result clicks, searches with and without clicks, zero-result searches, click-through rate, average results returned, added to cart, orders, and search-attributed total sales.
Recommendations exposes two distinct populations that must not be mixed:
sessions ≥ clicks ≥ add-to-carts ≥ purchases. Sessions are assigned to the
store-local day of the first eligible impression. A click after order creation
cannot receive purchase credit.Traffic acquisition is operational acquisition reporting: sessions, visitors, orders and attributed total sales, by referrer source and host and UTM. Marketing attribution is a separate consent-qualified dataset backed by the touchpoint and credit ledgers; it never relabels Traffic rows as campaign attribution.
Visitor behavior carries sessions, visitors, page views, bounced sessions, bounce rate, the session-funnel stages, conversion rate, average session duration and average pages per session.
Always pick the location dimension that answers the business question.
| Location | Source | Use it for |
|---|---|---|
| Session location | trusted edge/IP geolocation captured when the visit begins | approximate audience geography |
| Customer location | the customer’s most recent non-empty shipping location across their complete eligible order history | customer geography |
| Sales/POS location | the order’s POS selling location, assigned inventory location, or named fulfillment location | store and inventory performance |
Session location never means the shipping address or the fulfilling store. Sales location never means where the shopper’s IP was.
At the edge, Cloudflare country, region, city, timezone, latitude and longitude
are accepted only when the request arrived through the configured trusted proxy
path; client-supplied copies are not trusted. Coordinates are validated and
retained only as an approximate IP point for coarse map placement — their decimal
precision is never treated as address accuracy, and named city/region detail, not
coordinate precision, determines the reported accuracy label. Cloudflare’s XX
and T1 country values become Unknown rather than a fabricated country.
Detailed region/city fields are trusted only after the production transform is
checked and the runtime trust flag enabled. The connecting IP is used only
through keyed identity and rate-limiting hashes; analytics does not persist the
raw address. Postal and metro codes, True-Client-IP and JA3/JA4 are not collected
merely because they can be. Cloudflare’s visitor timezone never changes the store
reporting timezone.
When tracking is allowed but trusted location is unavailable, the visit produces an Unknown geography row. It is never reassigned to the merchant’s own location.
The canonical acquisition model is last non-direct click within the configured lookback window — 30 days by default, capped at 365.
First click, last click, linear and any-click are separate lenses, not numbers to add. Marketing defaults to last non-direct click. Selecting the attribution-model dimension compares lenses row by row; cross-model totals, comparisons and time series are suppressed because they would multiply sessions. See Marketing attribution.
Customer lifecycle counts customers as order-event facts. A cancellation, restoration, return or refund never manufactures a customer on its processed date.
In Live View, the visitor new/returning split is browser-based: new means the retained visitor token was first seen on the current store-local day. The customer mix is order-based and requires a customer identity on every classified row, so anonymous guest commerce stays in overall Orders and Total sales but contributes to neither customer bucket. Live windows are adjustable: visitors default to a rolling 5 minutes (adjustable 1–30 minutes) and customer behaviour to 10 minutes (adjustable 1–60).
RFM and lifetime value are point-in-time customer snapshots, not daily totals. Both require a stable customer identity, so a guest order stays in store sales but cannot be assigned to a customer. They differ in population: the lifetime-value snapshot writes a row only for customers who have purchased, while the RFM snapshot writes a row for every customer in the store and puts those with no eligible order in Prospects.
An order is eligible for either snapshot when it is non-test, non-deleted, in the store’s reporting currency, carries at least one reportable line item, and was placed on or before the snapshot date. B2B company orders are excluded from both, so a company buyer scored only through company orders reads as a Prospect.
R, F and M are store-relative purchaser quintiles from 1 to 5, tie-broken
deterministically so reruns are stable. Recency is scored so that the most recent
buyers get 5. The combined score is FM = floor((F + M) ÷ 2), and the segment is
the first matching rule in this order:
| Segment | Rule | What it means |
|---|---|---|
| Prospects | no eligible order | a known customer who has never bought; also the fallback bucket |
| Dormant | R ≤ 2 and FM ≤ 2 | bought little, long ago |
| At risk | R ≤ 2 and FM 3–4 | solid history, has gone quiet |
| Previously loyal | R ≤ 2 and FM = 5 | your best buyers, now absent |
| Almost lost | R = 3 and FM ≤ 2 | low value, fading |
| Needs attention | R = 3 and FM = 3 | mid on everything; the nudge segment |
| Loyal | R 3–4 and FM ≥ 4 | frequent and valuable, recently active |
| Promising | R = 4 and FM = 1 | bought recently, has not built history yet |
| Active | R ≥ 4 and FM 2–3 | recent, moderate value |
| New | R = 5 and FM = 1 | just bought for the first time |
| Champions | R = 5 and FM ≥ 4 | most recent, most frequent, highest value |
Rules are evaluated top to bottom and the first match wins. The bands overlap on
purpose: a customer with R = 2, FM = 2 satisfies both Dormant and At risk, and
is Dormant, because Dormant is tested first. Customers with no eligible order
are never given a fabricated purchaser score.
Actual lifetime value uses the same signed lifetime total-sales basis and the same zero floor. It is historical customer spend — not contribution margin, not predicted value, not gateway cash, not accounting revenue. Average lifetime value is the sum of actual customer values ÷ distinct customers in the result. The lifetime-value report’s Average order value is a separate order-time merchandise calculation (gross less discounts, weighted by lifetime orders) and therefore does not divide lifetime value by orders or absorb later reversals. Predicted lifetime value and predicted-spend tier are separately labelled Sellerlane estimates that become available only after more than 100 eligible store orders.
A customer enters exactly one weekly, monthly or quarterly cohort by the store-local placement date of their first eligible merchandise order.
customers returned zero by construction.Cohort date and period are required dimensions and one exact interval must be chosen. The server omits totals, comparisons and time series and rejects a result with either cell dimension removed, because cohort size repeats on every period row and one customer may return in several periods — summing those rows could report retention above 100%.
Carts counts carts created, cart views, items added and removed, cart updates, active, abandoned, recovered and checked-out carts, plus average cart value (weighted by carts created), abandoned cart value and recovered cart value.
Checkout funnel is described under The two funnels. It has
no revenue metric: the column that once existed summed total sales over every
order on the day, paid or not, and never joined the checkout cohort — a duplicate
of Sales wearing a checkout label. Paid orders is the funnel’s only
money-adjacent figure.
Checkout OTP verification counts OTPs sent, verified and skipped, with
abandoned derived as sent − verified − skipped floored at zero.
Fulfillment counts fulfillment orders, fulfillments created, shipped and delivered, items and orders fulfilled, shipped and delivered, and four average duration metrics (order to fulfillment, order to ship, ship to delivery, order to delivery) computed as summed hours ÷ summed samples — never an average of daily averages.
Returns by product dates Units returned by the day the return was
received and Units sold by the order day, carrying units sold on the
unspecified-reason rows only, so Return rate is correct per product over any
range and grouping by reason never fans the denominator — per-reason rate rows
read as blank by design. Refunded amount is per-line refund allocations by
processed day; order-level-only refunds carry no product attribution and stay on
Returns & refunds.
Returns & refunds counts returns, items returned, refunds and refund amount by reason.
Post-purchase requests is sourced from the append-only request timeline;
Requests counts distinct requests per group and Estimated refund amount sums
each distinct request’s buyer-shown estimate once.
Inventory is location- and time-sensitive, and mixes flows with boundary snapshots.
(gross units sold + max(ending inventory, 0)), undefined when that denominator is zero. Only the sell-through
denominator treats a negative ending balance as zero; raw ending inventory
stays negative for policies that permit selling past zero.Ratios are recalculated from aggregate components at the requested grain and are never averages of daily rates. Inventory movement date and sales event date answer different questions: a return receiving can restock on a later date than the refund. Inventory movements, transfers, shipments and month-end inventory are separate families at their own grains.
Loyalty program columns are whole loyalty points, not money;
Redemption value is the cash value of consumed redemptions. Outstanding points
liability lives on the Liabilities family as a snapshot, not here.
Referrals carries shares, visits, unique visits, signups, referral orders, fulfilled and rewarded orders, rewards issued and cancelled, gross and net referral revenue, pending and issued advocate rewards, three funnel rates, and suspicious referrals.
Theme components counts impressions, clicks and click-through rate per surface, component, section and block.
Privacy & ingest health counts analytics-allowed and marketing-allowed visits, consent events, events rejected by consent, browser events received and dropped, and ingest errors.
The nine Core Web Vitals presets are three views — over time, by page type and by page path — for each of LCP, INP and CLS, from validated browser Real User Monitoring samples only. Bot, staff, preview, test, server and synthetic events are excluded, as is any sample whose value is not a plain number. This family’s dates are UTC and its range is limited to the latest 90 UTC calendar days; see The deliberate UTC boundaries.
P50, P75 and P95 are calculated from every individual retained experience in the selected range and grouping. Sellerlane does not average daily, device, page-type or page-path percentiles; percentiles are not composable that way.
The Web vital dimension carries five metrics, not three: FCP and TTFB are retained and banded alongside the three the presets chart. These are the bands:
| Vital | Good | Needs improvement | Poor |
|---|---|---|---|
| LCP | ≤ 2500 ms | > 2500 ms and ≤ 4000 ms | > 4000 ms |
| INP | ≤ 200 ms | > 200 ms and ≤ 500 ms | > 500 ms |
| CLS | ≤ 0.10 | > 0.10 and < 0.25 | ≥ 0.25 |
| FCP | ≤ 1800 ms | > 1800 ms and ≤ 3000 ms | > 3000 ms |
| TTFB | ≤ 1800 ms | > 1800 ms and ≤ 3000 ms | > 3000 ms |
CLS is deliberately banded with a strict < 0.25 for needs-improvement and
≥ 0.25 for poor, rather than the generic inclusive bucket.
The page-path dimension strips the URL authority, query string and fragment, rejects protocol-relative and control-character values, caps the retained path and groups by hash, so tokens and customer data in URLs cannot enter merchant reports. A sample with no safe path still contributes to the over-time and page-type populations but not to a page-path row.
Some questions cannot be answered truthfully from a daily aggregate. These families execute against dedicated entity or event sources at their documented grain.
| Family | Grain and contract |
|---|---|
| Visitors right now | a rolling point-in-time count of distinct visitor identities whose latest qualifying online-store visit was active in the window ending now. Multiple active visits for one identity count once. |
| Net payments by order | one row per successful tender event. Gateway, manual, cash and COD use payment-transaction rows; gift cards and store credit use their non-overlapping bearer-money ledgers. Dated when processed. Test orders and simulated gateway transactions excluded. |
| Net sales from gift cards | one row per original sold gift-card line. Date and sale ID stay the original sale while later cancellations, edits, restorations and refunds update net items and net sales on that row — so re-running the original period can show a later reversal. Redemption is excluded: it settles a liability. |
| Shipping by order | shipping money at order/event grain. Original lines keep gross charge and discount; cancellation, edit, restoration and refund amounts stay distinct signed reversals on their processed date. Shipping tax is excluded rather than mixed in. |
| Items bought together | one complete distinct current-product set per eligible order. A + B + C is not expanded into three pairs and duplicate quantities do not multiply the combination. Labels come from current product records, so deleting a product removes that entity. Because the metric is an order count, it spans every order and does not apply the reporting-currency filter. |
| Sales by customer name | groups durable customers by identity, so a profile rename does not split history. Current profile supplies the label; immutable order snapshots fill blanks and label guest orders. Original sales at order time, signed reversals at processed time. |
| Total sales by order | a signed order/reversal ledger. Original sales at order-created time; cancellation, edit, restoration and refund rows at processed time, retaining order identity and currency. Refund-line amounts and the order-level residual are disjoint, so a refund is never deducted twice. |
| Weekly sales patterns | the same signed events grouped by the event timestamp’s store-local day of week × hour of day. A two-dimensional heatmap, not a daily series renamed. |
| Offer and component sales | one immutable order-line-component event source behind the bundle and upsell reports. Offer kind splits fixed bundle, bundle rule and upsell rows. Original component merchandise and item tax on the order day; refunds, cancellations, restorations and edits keep the originating offer identity and land signed on their processed day. Order-time offer title, handle, configuration hash, component title, variant and SKU are separate dimensions, so catalogue edits never relabel history. |
| Post-purchase upsell decisions | eligibility-decision cohort dated. Its reversals are dated to the eligibility-decision day, so it will not line up day-for-day with Sales or Finance. |
| Customer details, one-time and returning customer lists | classify from complete eligible order history even when the range contains only the first order. Accepted-marketing comes from an immutable snapshot on the most recent eligible order; today’s subscription state is never substituted. |
For the customer lists, Total amount spent is the sum of each eligible order’s event-net Total sales, floored at zero per order — so it includes tax, discounts, shipping, applicable fees and processed reversals, without letting an excess goodwill refund create negative spend. Average amount spent per order divides that by eligible orders; it is not sales-report AOV.
Attributable offer/component sales on the bundle family is signed component net merchandise plus directly retained item tax. It excludes shipping, shipping tax, tips, order-only fees and residual adjustments because those amounts have no immutable component owner. Net offer component items is signed component quantity and is not presented as whole parent-bundle units when a buyer reverses only part of a bundle.
The channel dimension is part of every sale fact. Online and POS share the financial formulas, refund timing, currency rules, bundle allocation, loyalty and inventory invariants; only their operational dimensions differ. Online reports may use session, landing page, referrer, device and UTM data; POS reports may use selling location, terminal, cashier, sales staff and payment method. An online order fulfilled from a location remains online-channel sales unless the report explicitly groups by fulfillment or inventory location.
Commerce families default to Online + POS when no channel scope is supplied. Traffic, marketing attribution, behaviour, checkout, carts, search, recommendations, device, landing-page, session-location, conversion-location and web-vitals reports are online-store populations. An explicit channel scope always wins; the server never accepts a channel filter and then executes an incompatible hidden default.
A dashboard target is a persisted threshold over one enabled canonical report metric. It does not copy a card’s displayed text, execute a free-form query or create a second formula. Its current value comes from the same server-owned executor and metric registry as the corresponding report.
Each target snapshots everything needed to keep its meaning stable: report family, metric key, name and value type; threshold direction; typed unit and, for money, one ISO currency; inclusive store-local start and end dates; and the IANA timezone used to resolve them. Calendar presets resolve to their complete period at creation — today, Monday–Sunday week, calendar month, quarter or year — and do not roll forward. Changing the store timezone later does not move an existing target.
| Unit | Stored value | Meaning |
|---|---|---|
| Money | signed-capable 64-bit column, constrained non-negative | integer minor units in the snapshotted reporting currency |
| Count | 64-bit integer | whole count; never money or points-as-money |
| Rate | integer basis points | 10,000 = 100%; no implicit cap, because some ratios exceed 100% |
| Number | numeric(30,6) | general non-monetary decimal, no currency |
Exactly one typed value may be present. A money target fails closed when its currency differs from the current reporting currency; during hydration a current value in another currency is returned as unavailable with a warning rather than summed or relabelled.
Attainment is current ÷ target × 10,000 basis points, rounded half away
from zero, so 10,000 means 100%. It is undefined for a zero target or an
unavailable current value and is not capped. Achieved is a separate
directional comparison: current ≥ target for at-least targets, current ≤ target for at-most targets — so for an at-most target, lower attainment is
better. If the canonical metric is a ratio with a zero denominator, current
value, attainment and achieved state all stay unavailable rather than treating
the ratio as zero.
Metric identity, unit, currency, direction and resolved period are immutable; only the value in the already-selected typed column can be updated. Create, update and soft-delete events are recorded at the database boundary with actor and before/after snapshots.
Sellerlane distinguishes three levels of support:
“Executable” does not mean “externally reconciled”. Reports that rely on proprietary third-party classifications or unavailable primitives stay clearly unavailable or approximate; they are never marked exact merely because the UI can render a chart. Sellerlane retains its own auditable crawler classification, so bot/human agreement with Shopify is an explicit reconciliation item, not an assumed identity.
Captured-reconciled reports: none.
Controlled internal fixtures count as captured evidence: no.
| Status | Catalog entries |
|---|---|
| Executable Unreconciled | 99 |
| Needs Attribution Reconciliation | 15 |
| Partial Sales Components | 11 |
| Partial Gateway Scope | 7 |
| Requires Subscriptions | 5 |
| Needs Funnel Reconciliation | 4 |
| Partial Reversal Types | 4 |
| Requires Shop Channel | 4 |
| Missing Fields Or Preset | 3 |
| Unresolved Catalog Entry | 3 |
| Needs Close Reconciliation | 2 |
| Not Applicable No Label Purchase | 2 |
| Not Applicable Shopify Protect | 2 |
| Partial Acceptance Denominator | 2 |
| Partial Return Components | 2 |
| Partial Row Fields | 2 |
| Partial Shop Taxonomy | 2 |
| Requires Agentic Commerce | 2 |
| Requires Risk Provider | 2 |
| Requires Shop Pay | 2 |
| Not Applicable No Tip Capture | 1 |
| Partial Finance Components | 1 |
| Partial Low Engagement Threshold | 1 |
| Partial Semantics | 1 |
| Partial Sku Identity | 1 |
| Partial Taxonomy | 1 |
| Partial Tracking Presence | 1 |
| Proprietary Approximation | 1 |
| Requires Autopilot Marketing | 1 |
| Requires Historical Fx | 1 |
| Requires Managed Markets | 1 |
| Requires Markets | 1 |
| Reason | Reports |
|---|---|
| Requires Subscriptions | 5 |
| Requires Shop Channel | 4 |
| Missing Fields Or Preset | 3 |
| Not Applicable No Label Purchase | 2 |
| Not Applicable Shopify Protect | 2 |
| Requires Agentic Commerce | 2 |
| Requires Risk Provider | 2 |
| Requires Shop Pay | 2 |
| Not Applicable No Tip Capture | 1 |
| Requires Autopilot Marketing | 1 |
| Requires Historical Fx | 1 |
| Requires Managed Markets | 1 |
| Requires Markets | 1 |
| Report | Category | Status | Reason |
|---|---|---|---|
sessions_by_social_sourceSessions by social referrer | Acquisition | Missing Fields Or Preset | Unavailable for strict parity: analytics_visits.referrer_source only distinguishes 'direct' from 'referral', so no social-only population can be selected without fabricating it. All-referrer traffic must not be presented as social traffic. |
shop_campaign_roasShop Campaign ROAS | Behavior | Requires Shop Channel | This report requires Shopify Shop-channel impression, campaign, order, and attribution primitives. Market does not relabel online-store traffic or orders as Shop activity. |
managed_markets_taxesManaged Markets taxes | Finances | Requires Managed Markets | This report requires Managed Markets tax, duty, filing, and fee primitives. Market's ordinary tax ledger must not be presented as Shopify Managed Markets activity. |
shop_pay_paymentsShop Pay payments | Finances | Requires Shop Pay | This report requires Shop Pay's immutable checkout/payment classification. A generic gateway or wallet label is not a defensible Shop Pay substitute. |
shop_pay_transactionsShop Pay transactions | Finances | Requires Shop Pay | This report requires Shop Pay's immutable checkout/payment classification. A generic gateway or wallet label is not a defensible Shop Pay substitute. |
shop_channel_ordersShop channel orders | Finances | Requires Shop Channel | This report requires Shopify Shop-channel impression, campaign, order, and attribution primitives. Market does not relabel online-store traffic or orders as Shop activity. |
shop_payments_by_typeShop payments by type | Finances | Requires Shop Channel | This report requires Shopify Shop-channel impression, campaign, order, and attribution primitives. Market does not relabel online-store traffic or orders as Shop activity. |
tips_by_staff_memberTips by staff member | Finances | Not Applicable No Tip Capture | Market has no tip capture path — no POS or checkout surface records a tip — so no tip amount or tipped-staff attribution exists to report. |
canceled_due_to_fraudCanceled due to fraud | Fraud | Requires Risk Provider | This report requires an authoritative order-risk provider: a per-order risk assessment with a levelled score, and a fraud-attributed cancellation decision. Market persists neither, so every field would be a permanent zero. Chargebacks are a different primitive and remain available from provider payment disputes. |
high_risk_orders_rateHigh risk orders rate | Fraud | Requires Risk Provider | This report requires an authoritative order-risk provider: a per-order risk assessment with a levelled score, and a fraud-attributed cancellation decision. Market persists neither, so every field would be a permanent zero. Chargebacks are a different primitive and remain available from provider payment disputes. |
orders_covered_by_shopify_protectOrders covered by Shopify Protect | Fraud | Not Applicable Shopify Protect | Shopify Protect is a Shopify product primitive and is not represented as a Market metric. |
orders_protected_by_shopify_protectOrders protected by Shopify Protect | Fraud | Not Applicable Shopify Protect | Shopify Protect is a Shopify product primitive and is not represented as a Market metric. |
performance_by_autopilot_marketing_activitiesPerformance by Autopilot Marketing Activities | Marketing | Requires Autopilot Marketing | This report requires Shopify Autopilot marketing-activity identity and spend/performance facts. Market has no equivalent source and does not infer it from campaigns with similar names. |
shop_channel_product_impressionsShop channel product impressions | Marketing | Requires Shop Channel | This report requires Shopify Shop-channel impression, campaign, order, and attribution primitives. Market does not relabel online-store traffic or orders as Shop activity. |
shipping_labelsShipping labels by order | Orders | Not Applicable No Label Purchase | Market has no shipping-label purchase flow, so no label cost is recorded anywhere. Carrier and tracking coverage for shipped orders is reported by "Orders with tracking included". |
shipping_labels_over_timeShipping labels over time | Orders | Not Applicable No Label Purchase | Market has no shipping-label purchase flow, so no label cost is recorded anywhere. Carrier and tracking coverage for shipped orders is reported by "Orders with tracking included". |
active_subscriptions_over_timeActive subscriptions over time | Sales | Requires Subscriptions | This report requires a subscription contract, recurring-order lineage, interval, activation, cancellation, and one-time-versus-subscription sale snapshots. Ordinary repeat orders are not subscriptions. |
agentic_total_sales_by_channelAgentic total sales by referring channel | Sales | Requires Agentic Commerce | This report requires an authoritative agentic-commerce referring channel and order classification. Market does not guess agentic sales from user agents, referrers, or free-form source labels. |
agentic_total_sales_over_timeAgentic total sales over time | Sales | Requires Agentic Commerce | This report requires an authoritative agentic-commerce referring channel and order classification. Market does not guess agentic sales from user agents, referrers, or free-form source labels. |
average_profit_margin_by_marketAverage profit margin by market | Sales | Requires Markets | This report requires an immutable sale-time market identity and market-specific pricing/currency semantics. Shipping country or transaction currency is not substituted for a configured Market. |
canceled_subscriptions_over_timeCanceled subscriptions over time | Sales | Requires Subscriptions | This report requires a subscription contract, recurring-order lineage, interval, activation, cancellation, and one-time-versus-subscription sale snapshots. Ordinary repeat orders are not subscriptions. |
new_subscriptions_over_timeNew subscriptions over time | Sales | Requires Subscriptions | This report requires a subscription contract, recurring-order lineage, interval, activation, cancellation, and one-time-versus-subscription sale snapshots. Ordinary repeat orders are not subscriptions. |
sales_by_discount_codesSales by discount codes | Sales | Missing Fields Or Preset | Unavailable for strict parity: combinable discounts can affect the same line, but current refund and order-adjustment facts retain only a combined discount reversal, not an immutable per-reversal/per-discount-application allocation. Market also lacks a canonical sale-time taxonomy that distinguishes percentage, fixed, free-shipping, buy-X-get-Y, and app discounts. Proportional allocation or taxonomy guessing would fabricate results. |
subscription_vs_one_time_salesSubscription vs one-time sales | Sales | Requires Subscriptions | This report requires a subscription contract, recurring-order lineage, interval, activation, cancellation, and one-time-versus-subscription sale snapshots. Ordinary repeat orders are not subscriptions. |
subscriptions_sales_over_timeSubscriptions sales over time | Sales | Requires Subscriptions | This report requires a subscription contract, recurring-order lineage, interval, activation, cancellation, and one-time-versus-subscription sale snapshots. Ordinary repeat orders are not subscriptions. |
total_sales_by_currencyTotal sales by currency | Sales | Requires Historical Fx | Shopify groups rows by checkout currency but converts Total sales to the store currency. Market can expose native-currency rows, but cannot reproduce Shopify's value without historical order-time FX rates. |
sales_by_social_sourceTotal sales by social referrer | Sales | Missing Fields Or Preset | Unavailable for strict parity: analytics_visits.referrer_source only distinguishes 'direct' from 'referral', so no social-only population can be selected without fabricating it. All-referrer traffic must not be presented as social traffic. |
The displayed counts are not maintained in this page. The server derives them
from the manifest, writes
marketing/src/data/shopify-analytics-parity-summary.json, and CI verifies the
snapshot byte-for-byte with:
cd backend/sellergo run ./cmd/analytics-parity-summary \ -check ../../marketing/src/data/shopify-analytics-parity-summary.jsonTo refresh the snapshot after an intentional manifest change, replace -check
with -write. The generated capturedReconciled count includes only passing
cases backed by both a captured Shopify output and a captured production
Sellerlane output from the same scenario. Controlled Sellerlane fixtures prove
internal financial contracts but never increase that count.
Work down this list. The first five explain most disagreements.
Then align: store and channel scope; date range and timezone; currency; test/deleted/bot/staff/preview exclusions; order, payment, fulfillment and refund status; the metric’s denominator; location type; attribution model and lookback window.
Finally, compare fact rows before rollups. A rollup can be rebuilt; an immutable financial or identity fact should be corrected only through its audited source event.
Analytics and reports
Use dashboards, reports, cohorts, exports, and Live View in Analytics and reports.
Financial semantics
Read the monetary and ledger contract in Financial semantics.
Marketing attribution
Compare models and campaign credit in Marketing attribution.
Locations and inventory
Configure operational locations in Locations and inventory.