Analytics and reports
Verified
In short
Section titled “In short”The Analytics group (Sales → Analytics) answers one question: where the money goes and what is left. It joins revenue with costs, so you see the real result, not just turnover.
The group has four screens:
| Screen | What it answers |
|---|---|
| Revenue | How much you sold, how many orders and where the revenue came from — a quick view without tabs. |
| Reports | How the business is doing. |
| Tracking | How much you can trust those numbers, and where orders came from. |
| Settings | VAT, order statuses, connections, diagnostics. |
Reports have the tabs Overview · Costs · Export · History.
How the result is calculated
Section titled “How the result is calculated”Since 22 Aug 2026 the Overview separates three figures that used to be merged into a single “Profit”.
| Figure | Formula | What it says |
|---|---|---|
| Gross profit | revenue excl. VAT − cost of goods sold | What is left from sales before operating costs. |
| Gross margin | gross profit / revenue excl. VAT | The same as a percentage. |
| Management result | gross profit − shipping and packaging − recorded company costs | The result after costs recorded in the app. |
The management result is not accounting net profit — which is why, since 25 Aug 2026, it is no longer called that. Recorded costs may include items that are not accounting expenses — loan principal repayments, for instance — and the app may not know depreciation, interest or income tax. Take figures for your accountant from Documents.
The purchase price is taken as at the time of sale, from the individual orders, not from today’s stock card.
When the purchase price is unknown for part of the goods sold, gross profit and the result stay empty and the card shows a dash. A missing price would behave like zero and profit would come out higher than it is.
Shipping and packaging
Section titled “Shipping and packaging”Shipping and packaging is a separate item in the calculation and each store configures it itself. Until 24 Aug 2026 it was a fixed 2.7% rate written into the application — an estimate nobody asked for, which every new store received as fact.
It is set in Reports → Export → Management result calculation:
| Source | What it means |
|---|---|
| Actual costs | The real cost of shipments. MitoOps does not know them yet; until the source is connected, shipping is not counted and no estimate is substituted for it. |
| Estimate as % of revenue | A percentage of revenue including VAT. The report row is labelled as an estimate, with the rate. |
| Custom amount | An amount for the period that you enter yourself. |
| Do not count | Shipping does not enter the calculation and the row is not printed at all. |
A new store starts at “Do not count.” A store that was already running on the 2.7% rate has it stored as its own setting, so its figures did not change.
If you also track shipping among company costs, mark that item as shipping and packaging (Advanced settings). The report then warns you so the same amount is not deducted twice. What decides is the marking, not the item’s name.
Costs when several shops are selected
Section titled “Costs when several shops are selected”A report for one shop counts that shop’s costs plus all company-wide costs (without a shop). When several but not all shops are selected, the same applies: the costs of the selected shops plus all company-wide costs, never the costs of the other shops. Company-wide costs are not split between shops. The cost list, KPI, Monthly summary, Result, Multi-period, the preview and the automatic report all use this same rule.
Revenue change against the comparison
Section titled “Revenue change against the comparison”The last column of the Visits and revenue sheet is Δ revenue (%): how much the revenue of that same row changed against the comparison period. It is (current period revenue − comparison period revenue) ÷ comparison period revenue × 100, so it compares revenue, not visits. Growth is a soft green, a drop a soft red; a negligible shift is not coloured at all.
When a row had no revenue in the comparison period, the column shows NEW: a percentage from zero does not exist, but “new” is true information. A row with no revenue in either period shows =, a channel that lost its revenue shows −100 %. A dash remains only when no comparison period is available. A negative base is divided by its absolute value, so the sign always shows the direction. The AI / LLM total subtotals and the MitoOps own-source families behave the same way.
It is a derived figure: it changes no attribution, no order counts and no revenue.
What the app decides
Section titled “What the app decides”The app builds the report the same way for everyone. Custom templates can no longer be uploaded (since 5 October 2026): appearance, sheets and their order, channels, cost layout and notes are all set directly in Analytics.
| What is compared | How the change is shown |
|---|---|
| Amount or count (revenue, orders, costs, MER, ROAS) | percent: (now − before) ÷ absolute value of before × 100 |
| Share in percent (margin, conversion rate, PNO) | percentage points (pp): now − before |
| Zero before, more now | NEW |
| Result or profit: zero before, now positive or negative | TO POSITIVE or TO NEGATIVE |
| Zero before and now | = |
| Figure unknown | — |
Example from September 2026: the management result going from −€1,436.37 to +€7,594.19 is +628.7 % (from loss to profit the change is positive), and the result relative to revenue going from −12.4 % to 29.0 % is +41.4 pp.
The colour shows whether the change is good for the business: growing revenue and margin is green, growing costs and PNO red. Marketing spend, VAT and cost of goods are not coloured, because their growth on its own is neither good nor bad. The explanation is also in the report’s Glossary under Change.
AI and language models in one block
Section titled “AI and language models in one block”Visits from ChatGPT, Perplexity, Gemini, Copilot, Grok and Claude sit together under a shared “AI / LLM” heading in the report, directly above their subtotal. This is presentation only: attribution, channel selection and the figures are unchanged. When no AI channel is among the displayed ones, neither the group nor the subtotal is printed.
Subtotals of MitoOps own sources
Section titled “Subtotals of MitoOps own sources”Rows that MitoOps attributed to its own tools stand together in the report, followed by their subtotal. For example MitoOps AI Mailing · BACK12, MitoOps AI Mailing and MitoOps AI Mailing · VIP15, and below them MitoOps AI Mailing total (of which). The same applies to MitoOps Affiliate, MitoOps Newsletter, MitoOps Automation scenario and MitoOps Newsletter sign-up.
Whether a row belongs to the group is decided by the evidence MitoOps used to attribute the order, not by the text of its name: a coupon MitoOps itself assigned to AI Mailing, a click from an e-mail of that module, a code or link of a MitoOps Affiliate programme partner, a coupon from the newsletter sign-up form. A code you marked as “affiliate” in the code list that does not belong to a programme partner is not part of the group. Neither is a custom category for another tool.
The subtotal is a derived row: it is not added to the shop total, to TOTAL ALL or to any indicator. A group with no orders in either period is not printed. The Tracking sheet and the channel tables on screen have no subtotals: their rows add up to 100% and an “of which” row would distort the sum.
Marketing indicators (KPI sheet)
Section titled “Marketing indicators (KPI sheet)”| Indicator | How it is calculated |
|---|---|
| Marketing costs | costs with a marketing category (Marketing, Google Ads, Meta Ads) or tagged marketing or reklama |
| MER | revenue incl. VAT ÷ marketing costs |
| Marketing costs / gross profit (%) | marketing costs ÷ gross profit × 100 |
| Paid advertising spend | costs in the Google Ads and Meta Ads categories |
| Paid advertising revenue excl. VAT | revenue excl. VAT that the report attributed to the Paid Google and Paid Meta channels |
| Paid advertising ROAS | paid advertising revenue excl. VAT ÷ paid advertising spend |
| Paid advertising PNO (%) | paid advertising spend ÷ paid advertising revenue excl. VAT × 100 (= 100 ÷ ROAS) |
| Paid advertising CPA | paid advertising spend ÷ orders from the same platforms |
ROAS and PNO compare the same platforms on both sides, and both sides exclude VAT. A platform with no recorded spend is not counted with its revenue either. Company-wide spend (without a shop) counts only when all shops are selected; for a partial selection it is not split by an estimate, and ROAS and PNO show a dash. A dash means the value is unknown, not zero.
Advertising spend comes from Costs: record it in the Google Ads and Meta Ads categories under the shop it belongs to. Office software with “Google” in its name (such as Google Workspace) is not marketing; the category and tag decide.
The report does not calculate CAC, CPC or CPM: for CAC there is no reliable way to separate acquisition costs from caring for existing customers, and CPC and CPM need clicks and impressions from advertising platforms, which are not connected. Analytics sessions are not clicks.
Glossary
Section titled “Glossary”The report ends with the Glossary sheet. The app builds it and it contains only terms that actually appear in the report: for example, when you turn KPI off in the export, ROAS, PNO, MER and CPA disappear from the glossary. The term Change explains the change column against the comparison period, including percentage points. Recommendations give no universal thresholds. The sheet can be turned off in the export layout; the report then never refers to it.
Automatic Google Ads costs
Section titled “Automatic Google Ads costs”Reports → Costs has a panel Automatic advertising costs. You switch it on with one button and choose the month it applies from. From the first day of that month, the Google Ads costs of each store are taken from GA4 linked to Google Ads:
- The manually entered Google Ads item of the store (for example Google Ads SK) is no longer counted from that month, but it stays saved and is labelled Automatic from 10/2026 in the list. Months before the switch do not change.
- Costs are loaded right after switching on, including the whole chosen month backwards, and then every 6 hours (always the last 3 days and today, because GA4 fills in costs with a delay). The Load now button loads immediately.
- The report (including the PDF, Word and Excel export), ROAS, cost of sale, MER, CPA, the Dashboard and the Advertising screen all use the same automatic amounts. In the report the amount sits in the same row as the manual item did.
- A store that could not be loaded (no GA4, or GA4 returned an error) keeps using the manual amount. The panel shows the reason.
- A company-wide item (no store) is not replaced, because it cannot be assigned to one store.
- Accounts in CZK and PLN are converted by GA4 at its own daily rate, so the amount may differ from the Google Ads invoice by the exchange rate.
Switching it off brings back the manual amounts; nothing is deleted. Meta Ads are still entered manually; automatic loading will follow once a Meta account is connected.
You stay where you are after generating
Section titled “You stay where you are after generating”When the report finishes, a panel appears right in the Report generation section with the report number, period, stores and download buttons for exactly the formats that were created. The links point at that specific report, not at “the newest one”. The selected formats stay selected, and Open in History highlights that row.
A recurring cost is a rule
Section titled “A recurring cost is a rule”Since 25 Aug 2026 a recurring cost is recorded once, as a rule: you enter the amount of a single occurrence, the frequency (monthly, quarterly or yearly) and Valid from. Valid to is optional — until you fill it in, the cost keeps counting in future periods. The app computes the occurrences for the selected period itself: an accountant at €200 monthly since January is one row in the list, showing €2,400 for This year and €200 for a single month. Ending a recurring cost with Valid to never removes it from past reports — it simply stops counting from the following period. Older monthly records created before this change stay in history unchanged.
Below the Overview there is a compact strip of five figures — Visits, CR, AI/LLM visits, AI/LLM CR and Order coverage — with an “i” bubble next to the abbreviations. CR is the conversion rate (orders ÷ visits × 100), AI/LLM visits are visits attributed to AI/LLM sources (e.g. ChatGPT, Perplexity, Gemini, Claude, Copilot or Grok) and AI/LLM CR is their conversion rate. Missing measurement shows a dash, not a zero.
Amount history and plan
Section titled “Amount history and plan”When a recurring cost changes price, you do not create a second cost. Open it and add the change in the Amount history and plan block: the new amount and the date it takes effect.
Google Ads SK therefore stays one cost, and its price is a time series:
| Amount | Effective |
|---|---|
| €150 | 1 Jul 2026 – 31 Oct 2026 |
| €300 | 1 Nov 2026 – 31 Dec 2026 |
| €250 | 1 Jan 2027 – 31 Jan 2027 |
| €150 | from 1 Feb 2027 |
What follows from that:
- A change can be scheduled ahead. In August you set marketing to €500 from November, and the November automated report uses it with no further action.
- The previous period closes itself, the day before the new one starts.
- Periods must not overlap. A change reaching into an existing period is rejected, naming the period it collides with.
- Backdated changes are allowed. They rewrite only the period from their own start; earlier months stay as they were.
- Reports already generated never change. They are historical snapshots — the figures stay as they were on the day of generation.
- The amount of an existing period can be corrected directly in its row. For example, replace the September advertising budget with the actual invoice: only September changes; October and later planned months stay, as do the dates and the cost’s history.
The plan can be prepared when creating the cost. Add future changes before the first save and everything is stored at once. If any change is rejected, the cost is not created either — you never end up with a cost whose plan does not match it.
A cost with no changes is calculated from its base amount, exactly as before. The block appears only for recurring costs.
For the period and All costs
Section titled “For the period and All costs”Two buttons sit above the list:
- For the period is the default view. It shows what counts towards the selected report period.
- All costs ignores the report filter and lists every cost exactly once, including ones that only start in the future. A status filter appears: active, upcoming, ended.
Duplicating a cost or a tag
Section titled “Duplicating a cost or a tag”Every cost has a Duplicate action. It opens the Add cost form prefilled from the original. Nothing is created until you press Save, so a monthly cost cannot be doubled by a single click. The new record gets its own number. The same applies to tags, including the colour.
Showing figures with and without VAT
Section titled “Showing figures with and without VAT”The filter bar has a View: Excl. VAT | Incl. VAT switch. The choice is remembered and carries over to Tracking.
- VAT payers default to Excl. VAT — the tax is not their income.
- Non-payers do not see the switch; both amounts are the same for them.
- When the VAT status of a shop is not set, the switch is replaced by a link to Settings. MitoOps never guesses tax status.
- With several shops in different regimes it shows Mixed VAT regime.
The switch changes only revenue and what derives from it. Order counts, visits, order coverage and SEO do not change. Gross profit, margin and costs are always net of VAT.
Order documents live in Orders → Documents; purchase suggestions in Stock | Products → Purchase planning. Analytics has two menu items: Reports (working views and report generation) and Analytics settings (connections, templates, sync runs).
Channels
Section titled “Channels”Traffic and revenue are broken down by marketing channel. Known classes are recognised automatically; a referring site outside them gets its own row named after its domain. Rows are never dropped: the MARKET SPOLU total always adds up.
Choosing channels for the report
Section titled “Choosing channels for the report”Which channels get their own row in the export is set in the Edit export layout editor (Export tab), in the Channels in the report section:
- Automatic: top N (default 15) — channels are picked by revenue; ties are broken by transactions, then sessions. The metric is written right on the screen.
- Custom selection — the channel list loads from connected sources for the chosen period; search and checkboxes, the selection is saved together with the export layout.
Unselected channels are folded into an Other channels row — nothing is lost and totals still add up. The Tracking sheet is not affected: its purpose is to show unattributed traffic too.
What the template decides and what the app decides
Section titled “What the template decides and what the app decides”The uploaded template supplies the report’s look: fonts, colours, column widths, company graphics.
Rows, order and totals are decided by the app from your data and your settings. A channel with no visit and no order in the period does not appear; a channel that shows up (a new referring site, a discount code, an affiliate partner) gets its own row on its own. The same goes for shops: the report renders exactly the ones you have connected — the number of them and their market codes are irrelevant.
Until 23 Aug 2026 it worked the other way round: figures were written into fixed template rows, so a row that was not in the template could never appear, and a row that stayed in it kept an old number.
Where VAT is configured
Section titled “Where VAT is configured”VAT registration and the rate are configured per shop: Analytics → Settings → VAT per shop. The quick way in is the Set VAT link in the Reports filter — it opens Settings, expands the section and scrolls to it.
VAT is derived primarily from the actual documents (the difference between the gross and net amounts). The setting is only used when a document carries no net amount.
This is a different thing from the VAT on your MitoOps invoice, which follows the VAT ID in your account, not this setting.
Expense layout in the report
Section titled “Expense layout in the report”The Expense layout in the report panel (Costs tab) decides how expenses are grouped and ordered in the report. The same layout is used by the preview, Excel, Word and PDF, and by the Scheduled report by e-mail automation.
- Create a group with Add group, rename it in place, reorder it with the arrows.
- Move an expense by dragging it, or with the Move to group… picker.
- A group is presentation only. It changes neither the expense’s category nor its amount; removing a group keeps the expenses and drops them into the unassigned section.
- Each group’s subtotal is derived by the report. It is never stored as another expense, so TOTAL EXPENSES is always the sum of the individual items, each counted exactly once.
- An expense with no group does not disappear — it appears under Other expenses with its own subtotal.
- An empty group is not rendered.
Until you save a layout of your own, MitoOps derives one from the expense categories. Once you save yours, yours applies — the automatic mapping never overwrites it again.
Report export
Section titled “Report export”Reports generate to Excel, Word and PDF from a single layout. Every main section starts on a new A4 page; wide tables (KPI, Multi-period) rotate to landscape so the numbers stay readable. Channels and Costs are portrait: since 5 October 2026 the shop is a heading above its channels and each channel name appears only once per row, so both periods and the revenue change fit on a portrait page. A long channel name wraps, a number never does. With five shops that is roughly a third fewer Channels pages. Since 6 October 2026, Word follows the same rules as the PDF: it rotates every sheet the same way (by content width), scales the font by the same factor but never below 7 pt, so amounts do not wrap, and a table that continues on the next page repeats its header there. Percentage differences between periods carry subtle colour coding by the meaning of the metric (revenue growth green, cost growth red; neutral items uncoloured), and a positive management result is shaded lightly green, a negative one lightly red.
The report is in the language you use the app in: labels, the glossary of metrics and the sheet names in Excel. When you upload a translated Excel back (cost import), the app finds the sheet under its translated name too.
Notes in the report
Section titled “Notes in the report”My notes on the Export tab is text that goes into the generated report. In Excel it gets its own Notes sheet; in Word and PDF its own labelled section. The export layout editor has a dedicated Sheet: Notes block, so it is clear where in the report it belongs.
An empty note creates no blank page. Leave the field empty and neither the sheet nor the section is produced at all.
The Periodic e-mail report automation has its own note field. That note also reaches the report, but as a separate section — it is text from the automation, not from you. Variables such as {{workflow}} or {{now}} can be used in the automation field; they are substituted when the report is sent.
Estimated purchase cost versus the real one
Section titled “Estimated purchase cost versus the real one”The Monthly summary sheet has a goods purchase row. Its label says where the number came from: (real purchase cost) is the sum of actual purchase prices of goods sold — the same number as on the Result sheet; (rate estimate) is a percentage of revenue and is used only when the real cost is unknown for a large enough share of goods; (entered manually) means you overrode the value, and a manual value always wins.
Optional Advertising sheet
Section titled “Optional Advertising sheet”Switch on the Advertising sheet in the export layout (Reports → Export). On the sheet card you choose the platforms: Google Ads, Meta Ads or both. The sheet is A4 portrait and takes one or two pages:
- Overview for the period: ad spend, ad revenue and orders, ROAS, cost of sale, CPA, average order value from ads, MER and marketing costs, next to the comparison period with the change.
- Google Ads and Meta Ads: each platform separately, with the cost source below the table (automatically from GA4 or from items in Costs).
- Last 6 months: a chart of ad revenue and spend and a table of months with cost of sale and MER. Column headers carry the colour of their series in the chart.
- By store for each platform you switched on. For Google Ads with automatic costs, clicks as well.
The figures are the same as in Analytics → Advertising. When there is no ad spend and no ad orders in the period, the sheet says so and tells you where to add the data. A platform without data shows “No data available” in the table.
Optional sheets: Shipping and Packing & warehouse
Section titled “Optional sheets: Shipping and Packing & warehouse”Besides the financial sections, the report can include two operational ones. They are not enabled — neither for new accounts nor for long-standing ones. Turn them on in Analytics → Reports → Export → Edit export layout:
- Sheet: Shipping
- Sheet: Packing and warehouse
They are enabled separately because they answer two different questions: the first, which carrier is worth shipping through; the second, how fast the warehouse packs. Each adds one or two pages, so neither turns itself on.
Ordering works like any other sheet and applies to all three formats at once.
Without the module permission the sheet can neither be enabled nor generated. A report is a second route to the same figures, so the permission has to protect the data, not the screen.
When there is nothing to report for the period, the sheet is not created. A blank page of zeros would look like a measurement that went badly, when nothing was measured at all.
Shipping
Section titled “Shipping”A management summary, a Share of shipments by carrier pie chart, and a per-carrier table. The colour swatch next to each carrier matches its slice, so the table doubles as the legend.
| Figure | Exactly how it is calculated |
|---|---|
| Shipments | Shipments created within the period. Archived ones are excluded. |
| Delivered | Shipments in the delivered state. |
| In transit | Shipments from the period whose outcome is not yet settled. |
| Delivery success rate | Delivered ÷ (delivered + returned + failed). The denominator counts settled outcomes only: a shipment still in transit is neither a success nor a failure. Cancelled shipments are excluded entirely — cancelling is our action, not the carrier’s failure. |
| Median delivery time | Measured from handover to the carrier until delivery, not from shipment creation. A shipment missing either point is not counted; an estimate here would be an invented number in a negotiating document. |
| 90% delivered within | Nine out of ten shipments were delivered within this many days. Rounded up — it is a promise, not an average. |
| Returned | The shipment came back to the sender. |
| Failed | A carrier error that still prevents dispatch. |
| Cancelled | A label was created, the parcel never belonged to the carrier. |
Where a figure cannot be stated, there is an em dash, not a zero.
With more than ten carriers the nine largest get their own slice and the rest merge into Other. Totals stay complete; the median is omitted for the merged entry because it cannot be derived from finished values.
Packing and warehouse
Section titled “Packing and warehouse”| Figure | Exactly how it is calculated |
|---|---|
| Handed over to carrier | The parcel physically left the warehouse. The shipment state decides, not a timestamp. |
| Items in shipments | Sum of items across non-cancelled shipments in the period. |
| Awaiting handover | Shipments from the period that have a printed label and are still in the warehouse. |
| Average time to dispatch | From the moment the order entered the ready to pack state until handover to the carrier — in warehouse working hours. The sample size is stated too: an average of three and an average of three hundred are two different claims. |
| Warehouse working hours | The setting from Shipping → Settings. |
Why the time is measured in working hours. An order that arrives on Saturday morning and leaves on Monday at ten waited fifty hours by the calendar and two by the warehouse’s work. Only the second can be improved.
Orders placed outside working hours therefore do not inflate the measured time. The same applies to weekends and non-working days. With no setting configured, 08:00–16:00, Monday to Friday applies.
Status as of today
Section titled “Status as of today”Two figures are not for the period and have their own section: Awaiting packing and In transit with the carrier. These are states, not throughput — a state cannot be bounded by a date without becoming misleading.
Weekly trend
Section titled “Weekly trend”A bar chart of created shipments by week, with an exact-value table underneath. Weeks cover exactly the selected period, so the first and last may be partial.
The series counts shipments by the week they were created, regardless of where they are now. Its total therefore need not match the Handed over to carrier row, which counts only parcels that have physically left the warehouse. The difference between them is what is still in the warehouse — for example 99 handed over and 2 waiting gives a series total of 101.
The sheet deliberately excludes individual staff performance.
Report footer
Section titled “Report footer”Every page of the PDF, the Word file and the printed Excel carries a discreet footer with the product name, the year and the domain. The year is always current. The footer sits below the content, so it changes neither pagination nor the figures.
Common problems
Section titled “Common problems”- I cannot see this group. Analytics is available from the manager role up; warehouse roles do not have it.