Help
ProfitRoot reconciles your commerce data into a source-backed margin ladder. This page is task-oriented: find the thing you are trying to do. For why we verify rather than estimate, see the methodology.
Getting started
ProfitRoot starts by reconciling Net Sales to your Shopify orders — it ties our computed total back to the source before anything else is built on top of it.
Install ProfitRoot free from the Shopify App Store. Your orders sync nightly, and Net Sales is checked against Shopify's own total to the cent. Earlier history can be added on Connections with an orders export (Orders > Export in your Shopify admin).
The export must include these columns for the reconciliation to run: Name, Financial Status, Subtotal, Lineitem quantity, Lineitem price. Upload it on Connections; once it reconciles, Net Sales is marked Matches ShopifyReconciled: Matches Shopify. Added up and matched to the source, to the cent..
Net Sales = Shopify's Subtotal (already after discounts) minus refunds; it excludes tax and shipping. Subtotal is pre-tax and pre-shipping. A synced store's refunds are read pre-tax from Shopify's refund line items; an uploaded export carries only Shopify's Refunded Amount, which is tax-inclusive.
Uploading files
These are the sources ProfitRoot accepts today. Each one unlocks a further margin layer.
ProfitRoot uses your unit cost exactly as given — it does not prescribe a costing basis (product cost, landed cost, or fully-loaded COGS). State the basis you used; the margin is only as consistent as the basis behind it, and ProfitRoot cannot check which one you chose.
Cost coverage is capped by SKU maintenance in Shopify: a unit cost can only attach to an order line that carries a SKU, so any line exported without one cannot be costed no matter how complete your cost file is.
Gross Margin is Calculated, not Matches Shopify: a cost table has no in-file total to tie back to the way your Shopify orders do, so the figure is computed from your inputs with no external control. It becomes Checked to bill only when checked against an external control such as a GL revenue or COGS total.
Costs must be in the same currency as your Shopify orders. ProfitRoot cannot detect a cost-table currency, so you confirm it with a checkbox on Connections — until you do, a caveat names the assumed currency. This does not block Gross Margin.
Not accepted yet
ProfitRoot does not ingest these today. The readiness summary on Connections lists them so you can see what each would unlock, but there is no upload path for them yet — do not prepare these files expecting to import them: Accounting / GL (QuickBooks / Xero), and Inventory (an installed store's stock is read from Shopify nightly, so there is no file to upload). Ad Spend is different: it is accepted by upload, a Meta Ads Manager export or a Google Ads campaign report, one file per platform, checked against the bill you type in. A live connection to either is not available yet. The two file shapes are documented, not yet observed on a live export, so a file whose columns differ is refused naming the columns expected and found.
When something does not reconcile
The file did not tie (HARD-HALT)
If your Orders total does not tie to what we map from the file, the upload HARD-HALTs and is marked Does not match Shopify, showing the residual. No bridge or margin figure is rendered from an untied file — we will not build numbers on a source we could not verify. Fix the source file and re-upload.
Partial cost coverage
If some order lines have a matching cost and some do not, Gross Margin is computed on the covered portion only and the gap is named — a partial Gross Margin is never presented as a complete one. Add the missing costs to complete it. Order lines that carry no SKU at all cannot be costed (a cost table is keyed by SKU); assign SKUs to those products in Shopify and re-sync — adding costs alone will not cover them.
Costs that are not applying (unmatched SKUs)
Cost rows whose SKU matches no order line are applied to nothing, and ProfitRoot lists them. The SKU join is exact and case-sensitive, so this is usually a spelling or case mismatch between your cost table and your orders (for example ABC vs abc)— it is the most common reason costs are not applying. Check the SKUs shown as unmatched.
Wrong file shape
If a file is the wrong shape for the slot you dropped it in, ProfitRoot rejects it with a named diagnosis and computes nothing from it — nothing is silently zeroed. Two cases you may hit:
Payments. Shopify has two payments-side exports. If you upload the order-transactions export (it has Kind, Gateway and Status but no Fee column) to the payments slot, it is rejected: the payment-fee lane needs the payouts / balance-transactions export, which carries aper-transaction Fee, from Finance > Payouts > View transactions > Export.
Product Cost. A cost table needs a SKU column and one of the accepted cost columns (Unit Cost, Cost per item). If you upload an Orders export into the cost slot, ProfitRoot recognizes the Orders columns, names the mismatch, and computes nothing from it.
Why a margin layer is locked
Margin is a ladder: each layer unlocks when its source is present. When a layer is locked we name the missing source rather than estimate the number — ProfitRoot refuses fake precision (see the methodology).
Excluded orders
Not every order counts toward the Net Sales we match to Shopify. When an order is excluded, ProfitRoot names the reason, its dollar value, and its kind — the kind tells you whether it is correct, whether it will change later, or whether it needs your attention. There are four kinds:
Your data
Two paths, handled differently. CSV files you upload are parsed in your browser and are not sent to us unless you save a workspace. Orders synced from a connected Shopify store are transmitted to and stored on our servers so they can be recomputed on later visits.
Full detail is on the privacy page.
Connect your own AI assistant to read your store’s figures (read-only, free on every plan). Ask Root, a question box inside ProfitRoot, is coming.
Reference: status vocabulary
Every figure and lane in ProfitRoot carries a status. The six evidence statuses describe a figure's relationship to your source data. The four operational statuses describe the process— whether a lane could be produced, or failed — and are never an evidence claim about a number.