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.
ProfitRoot starts by reconciling Net Sales to your Shopify Orders export -- it ties our computed total back to your file before anything else is built on top of it. Export your orders from your Shopify admin: Orders > Export (export as CSV for the orders you want to analyze).
The export must include these columns for the reconciliation to run: Name, Financial Status, Subtotal, Lineitem quantity, Lineitem price. Upload it on the Sources tab; once it reconciles, Net Sales is marked Reconciled.
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 Derived, not Reconciled: a cost table has no in-file total to tie back to the way an orders export does, so the figure is computed from your inputs with no external control. It becomes Calibrated only when checked against an external control such as a GL revenue or COGS total.
Costs must be in the same currency as your reconciled orders. ProfitRoot cannot detect a cost-table currency, so you confirm it with a checkbox on the Sources tab -- until you do, a caveat names the assumed currency. This does not block Gross Margin.
ProfitRoot does not ingest these today. The Sources readiness panel 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: Ad Spend (Meta / Google Ads), Accounting / GL (QuickBooks / Xero), and Inventory (which is scenario-class, not a reconciled source).
If your Orders total does not tie to what we map from the file, the upload HARD-HALTs and is marked NOT RECONCILED, 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.
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.
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.
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.
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).
Not every order counts toward reconciled Net Sales. 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:
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.
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.