Solidshop → Reports is the screen for numbers you hand to someone: a revenue figure for a date range your accountant can rely on, a per-product sales breakdown, a tax summary for a filing period, and a payment-method reconciliation you can check against your provider statement. Every report is a plain table for a date range — and every one downloads as CSV.

The four reports

Report One row per Use it for
Sales by period Day, ISO week, or month Revenue, orders, units, discounts, shipping, tax and fees over time — the reconciliation source for the other reports
Sales by product Product + variant combination What actually sold, by units and gross revenue
Tax collected Distinct tax (name + rate) Filing-period totals, split into product tax and shipping tax
Sales by payment method Payment method Totals and payment fees per provider — match against your PayPal/Stripe statement

Which orders count — the payment status scope

By default a report counts orders whose payment status is Paid, Partially paid, or Partially refunded — money that arrived and has not fully gone back. Pending, authorized, due, unpaid, voided and fully refunded orders are excluded by default. The scope is a visible filter you can widen at any time, the applied scope is always shown above the table, and it is echoed as the first line of every CSV export — so a file found on disk six months later still says what basis its numbers rest on.

Refunds are gross, not net — a partially refunded order reports its full original total; refund amounts are not subtracted. Fully refunded orders are excluded from the default scope instead. Net-of-refunds reporting is planned for the commercial reports extension.

Date basis and timezone

Reports bucket orders by their creation date (accrual-style), matching the orders list and the dashboard. Cash-basis reporting by payment date is a known request and is on the roadmap. Days, weeks and months are computed in your site timezone (Joomla’s global server timezone setting), so a sale at 11pm local time lands on the local day — the one edge is a range spanning a daylight-saving switch, where rows within an hour of the switch can land on the neighbouring day.

Currencies are never summed together

If your store took orders in more than one currency during the range, each currency gets its own table section with its own totals row, and CSV rows carry a currency column. Adding dollars to euros would produce a meaningless number, so Solidshop never does — and there is no exchange-rate conversion in the free reports. Single-currency stores simply see one table.

CSV export

The Export CSV button downloads exactly what the table shows. The file is UTF-8 with a BOM (Excel-safe), money values are raw decimals (1234.56, never $1,234.56), dates are ISO, and every row carries the store id and name. The first line is a comment recording the applied payment-status scope.

Per-product revenue and order-level discounts

Line-level discounts are included in the Sales by product report. But an order-level discount — a cart-total coupon — cannot be attributed to individual products, so per-product revenue is before order-level discounts. The report says so in a footnote; when totals must reconcile to the cent, use Sales by period, which includes every discount.

Why doesn’t the dashboard match my report?

Since 1.2.0 they agree by construction: the dashboard’s revenue tile and sales chart run through the same report engine with the default payment scope (paid, partially paid, partially refunded), your site timezone, and your store currency. Two things can still differ: the dashboard shows store-currency revenue only (orders in other currencies are flagged under the tiles — the report lists every currency), and the report’s scope filter may be set wider or narrower than the default. When numbers go to an accountant, use the report — it states its scope and exports it into the CSV.

Who can see reports — the Reports screen and its CSV export require the Manage order (or admin) permission on Solidshop, the same family as the Orders screens.