Ecommerce
Orders, what was in them, and what the shop actually kept.
Until now an order was a few extra columns on a lead, which meant three things were impossible: telling a shipping change from a change in what people bought, seeing which products drove a day, and — the expensive one — recording money going back. Revenue could only ever rise.
Where orders come from
The WordPress plugin, and only the WordPress plugin. Orders are reported server-to-server using your site's secret API key.
There is deliberately no way for a browser to report an order. The script-only install authenticates by the page's origin, which is enough for error and analytics data but not for money: anyone able to read a public key out of a page could otherwise invent revenue in your dashboard.
So a site running the loader script alone — including a Shopify store — collects everything else and shows a sentence here instead of a row of zeros.
An order with no visit says why
Most orders sit on the checkout they came from, with the visit one click away. When StorePilot could not tie an order to any visit, the order carries one of three words under its status, on the list and on its page:
- Opted out of tracking — the buyer's browser sent Global Privacy Control. StorePilot records no visit and no checkout for that buyer, by the promise in the privacy policy; the order itself is kept because it is your shop's record of a sale, not a record about the visitor.
- Visit not tracked — the collector never ran in that buyer's browser (a content blocker, a browser the collector judged automated, a checkout it does not read), and the order arrived through your server alone.
- Reported late — StorePilot first heard of the order more than 48 hours after it was paid, so no checkout could be tied to it.
Orders from before this was recorded carry no word, which is not the same as a tracked visit. These orders are counted in every money figure; what they cannot do is credit a campaign or a route on the Analytics page, where they appear under Never seen.
Days are your shop's days
Every figure on this screen is counted on your shop's own calendar — the time zone your WordPress site is set to, the one WooCommerce's order list uses. An order paid at 8 pm in Los Angeles counts on that day, even for someone reading the dashboard in Europe, where it is already the next morning. Order and checkout times on this screen are printed in that zone, with its name beside them (for example 20:00 PDT), and a line under the tabs says which zone it is.
The zone comes from your shop automatically. If it has never reported one, days here are UTC and the screen says so — set the shop's time zone in Settings → Monitoring to match your order list.
Two things to know when you compare with WooCommerce:
- Revenue counts paid orders. WooCommerce's order list also shows quotes, pending and failed orders on the same day; those are not money the shop took, so a sum over the whole list is larger than our revenue.
- Traffic figures (visits, the conversion chart's visits) stay on UTC days. The conversion chart says this in its own note.
The four tabs
| Tab | What it answers |
|---|---|
| Overview | How the shop did: revenue, orders, average order value, cart abandonment and the money left in carts; revenue over time; the largest unfinished carts and the products people viewed but never bought; the checkout journey; payments by method; coupons; new against returning buyers. This is where the screen opens. |
| Orders | Every order, with the status your shop gives it. |
| Checkouts | People who reached the basket and did not buy — blocked by an error (a real fault they met on the checkout page itself), or changed their mind. The ones who paid are orders, and they are on the Orders tab. A checkout that asked for a quote rather than paying is its own card, not an abandoned cart. |
| Products | Which products get looked at, which get bought, and which do neither. |
The date range at the top of the page applies to Overview, Checkouts and Products. Orders lists every order you have ever taken, so it takes no window — a list of money is one you scroll rather than one you narrow to the last thirty days without being asked.
Watching the visit behind an order
Every order row has a Play button when the visit that produced it was recorded, and the order page has Watch session beside its status. It opens the order's own visit, or — when the shopper came back to finish the checkout later, for example after signing in — the most recent visit that checkout was filled in from. Once you have watched it the button reads Replay, exactly as it does on the Checkouts list.
A dash means there is nothing to play: the visit was not recorded, or its footage has passed the retention window.
The same customer, on the page you already opened
An order page and a checkout page both carry This customer — their other orders, their other checkouts, chats they started, recorded visits, and errors that fired in those visits.
There is no separate Customers screen, and that is deliberate: what is useful is the context beside the row you are looking at, not another list to search. Each group says what it found or, in words, that it found nothing — «no other orders from this customer» and «this row carries no email, visitor or session» are different facts, and an order reported by a Blocks checkout often is the second.
Nothing here claims two rows are the same human being. An email is shared in a household and a visitor id is a browser. It says these rows name the same customer as far as your shop can tell — the same standard the recovery list already works to.
Order states
StorePilot shows your shop's own word for a status. WooCommerce ships seven statuses and your shop may register more — "Pending approval", "Pick up", "Shipped" and anything a payment gateway adds are all real statuses that mean something specific to you. Your site publishes its list and this screen prints from it, so an order reads here exactly as it reads in WooCommerce.
Underneath, StorePilot tracks one thing about an order: whether the money arrived. That is all its revenue and conversion figures need, and it is why a status it has never seen before still counts correctly.
| Underlying state | Meaning |
|---|---|
| Awaiting payment | The order exists; the money has not arrived. Not a sale, and cart recovery still counts this shopper. |
| Paid | The money arrived. |
| Payment failed | The gateway declined. |
| Cancelled | The order was cancelled. |
| Refunded / Partly refunded | Paid, then some or all of it given back. |
:::note Orders from before the update Orders placed before you installed StorePilot are not imported. Reading a shop's back catalogue costs the shop, not us — on a real store it measured thousands of database queries a minute — so StorePilot does not do it. Every order from the update onwards is recorded as it happens, through WooCommerce's own hooks, and the numbers here grow from that day. :::
A refund does not reduce your order count. It moves the amount, not the conversion — the checkout did convert, and the shop later gave money back. Both numbers are shown, so neither hides the other: Total is what was charged, Refunded is what went back, and the money view shows what was kept.
Revenue is what the shop kept. The Revenue tile, its chart, the morning digest and the Home widgets all print paid orders after refunds; when anything was refunded in the window the tile says how much of what was charged went back. The average order value divides that same kept revenue by the paid orders whose amount is known — an order that reported no total is counted as an order and said so under the tile, never averaged in as zero.
A quote is not an abandoned cart. When a request-a-quote plugin turns a checkout into an order that nobody is meant to pay at checkout — the order's status is quote, or the payment method is named like «Save as a Quote Only» — the checkout sits under Quotes on the Checkouts tab and stays out of abandoned carts, the abandonment rate and «left in carts». A quote that is later paid is an order like any other. The payment-method half reads the method's name, so renaming that gateway to something without the word «quote» sends its checkouts back to abandoned.
Money counts from the day order collection began. WooCommerce reports an order every time it is saved, so an order paid long before you installed StorePilot still arrives the day you edit it — and it would land on its real payment date, months back. Revenue, orders and the average are counted only from the moment collection began; days before it are a gap in the chart rather than a zero, and a period is not compared with one that started before it.
An order placed before you added the site is history, whenever it is paid. If an old order is completed today — a bulk status change, an unpaid order finally settled — WooCommerce dates its payment today, so it would otherwise read as this morning's sale. It stays in the Orders list and still makes its customer a returning buyer, but it is not revenue, not an order in the totals and not a «New order» notification. The same applies to Cash on Delivery placed before the site was added and paid after.
Line items
Products, quantities and prices are visible to admins and owners only. A list of what somebody bought says more about them than a form submission does, and form submissions are already restricted the same way.
They are kept on the visit that produced the order rather than on the order itself, which has two consequences worth knowing. An order that could not be matched to a visit has no line items — nothing was lost, there was simply nowhere to keep them. And when somebody asks you to erase their data, what they bought goes with them while the order's money stays, anonymous: your revenue history is a fact about your business, not their personal data.
Orders that predate the plugin version which began collecting line items say so explicitly — that is not the same thing as an order with nothing in it.
What sold on the Overview ranks those lines. A basket counts once however many orders paid for it, an order your own team placed is not a sale, and each line is worth what it cost when it was bought — a refund is recorded on the order, not on a line, so this panel reads before refunds while the revenue tile beside it reads after them.
Products
For each product: how many people viewed its page, how many orders contained it, and the conversion between the two. Search by name or SKU; twenty per page.
The finding worth opening this tab for is the one with no numbers. A product nobody viewed and nobody bought appears in no other report by design. The No attention card counts them.
Your product list is not imported either — a product joins it the first time somebody opens its page, buys it, or you save it in WordPress. So the list of dead products fills in as traffic arrives, while the share of your catalogue that saw nothing works immediately: your shop reports how many products it publishes, and that costs it nothing to answer.
Two things this screen says out loud rather than leaving you to assume:
- Views are counted from the day your plugin learned to report them. Before that no page view recorded which product it was, so history begins at that date and the screen states it.
- Conversion is a floor, and the screen says by how much. A purchase is only counted per product when its order could be matched to a visit; views are counted for everybody. The share of paid orders that were matched is printed under the table, so you can see how much of the picture these rates cover.
- Conversion can exceed 100%. Somebody who buys from a category page never opens the product page, so their purchase is counted with no view behind it. That figure is not clamped, because hiding it would be worse than explaining it.
A product with views and no purchases shows a conversion of 0%. A product with no views at all shows a dash — nobody looked is a different fact from nobody bought.
Adding to the cart is deliberately not counted: it is a third number between the two that matter, and it would need a collection decision nobody has asked for.
Leads and Ecommerce
They used to be one list. They answer different questions now:
- Leads — people who told your shop something through a form.
- Ecommerce — money: orders, what was in them, checkouts, and products.
StorePilot decides which screen a capture belongs to once, when it arrives, and both screens read that one answer. Anything that touched a cart or carries an order number is a checkout, whatever the form it came through was called — so the two lists cannot show the same row and cannot both miss one.
An abandoned cart is a checkout with no paid order behind it. That is the same definition everywhere in StorePilot — the analytics screen, the funnel and the morning digest all read it from one place, so they cannot disagree about it.