Reports & analytics
Once your Odoo is connected and synced, the dashboard is organized into a few sections you can reach from the top navigation: the Overview first for an owner or admin, then the order a rep works — Customers, Sales, Quotes — and the reports and Locations underneath them.
Customers
Where a member or viewer lands. Search any account and open its profile to see its history, what businesses like it buy that it does not, what it has quietly stopped reordering, and its notes from Odoo. Exportable like every other report.
Notes get their own panel below the numbers, with a version history. Odoo’s notes field loses lines — reps noticed before anyone else did — so Readout keeps its own copy of every version and shows each one as a line diff against the one before it. A line that vanishes over there is still readable here, and can be put back.
Locations
A big dealer is not one buyer. Every other report here rolls a customer’s branches into a single row on purpose, so the account counts once; Locations is the one screen that takes them apart again. Pick an account and see each ship-to address on its own line, with what it ordered and how that moved against the same length of time before it, then a grid of the biggest products across every branch. Branch gaps underneath is the part worth acting on: products most of the branches buy and one does not, with what the missing ones would be worth at the average of those already buying. One branch buying something is a preference; eight buying it and one not is a call.
Read from sales orders rather than invoices, because an invoice carries the billing party — the delivery address only exists on the order. A branch that has never been shipped to directly will not appear.
Sales
Two tabs. Calendar is a rep’s planned week of calls and visits — book an account and it feeds the call sheet that arrives by email at six each morning, carrying what that customer buys, what they have stopped buying, and what is on promotion for them. Promotions is where marketing sets one up; every rep can then pull the list of exactly which of their own customers to ring about it.
Quotes
One screen. Name the customer — an existing account, or just a name if they are still a prospect — then type or paste model numbers, and you have a customer-ready quote sheet priced from your own Odoo pricelists, as .xlsx or PDF. When they say yes, push it back to Odoo as a draft quotation; nothing is committed until you do.
The price book follows the customer. Pick an account and Readout looks up which of your companies last sold to them, then prefills that company’s default pricelist — so a rep quoting for one company’s account is on that company’s book without choosing it. Set which book is the default for each company under Settings → Quote price books. A workspace with only one book has nothing to pick.
Some customers cannot be placed with a company — nobody has invoiced them yet, or the company that did has no book configured. Those fall back to the book you marked as the default for customers of no company, and the screen says which book it landed on. Mark one: without it the fallback reaches for another company’s default, or for whichever book happens to be listed first, and which one you get is not something you can predict from the screen you are on.
One quote is one pricelist, because that is how Odoo writes the order. Change the book and every line already entered is repriced against it; a product with no rule in the new book falls back to catalogue list price and is marked with a *. A model number Odoo cannot price at all holds the download until you fix or remove that line, rather than letting a sheet reach a customer with a blank where a price should be.
What arrives by email
Four things send on a schedule, and none of them is a job you manage. The times below are UTC — the same clock the nightly sync runs on.
- The call sheet, 06:00 daily — the day a rep planned on the calendar: who they are seeing, what those accounts buy, what they have stopped buying, and what is on promotion for them. If nothing is booked, it says so and names accounts worth a call instead.
- The wellness check-in, 07:00 daily — the work nobody planned. Five of that rep’s own accounts that have not ordered in three months, picked at random rather than ranked, so the long tail comes up instead of the same five big names every morning. An account that has been sent is held back for a month. A rep who does not want it turns it off for themselves under Settings → Members.
- The sales summary, 17:00 daily — what sold and what was invoiced today, per selling company, to owners and admins. A company earns a row by having sold something, so nothing has to be maintained as a list.
- The POS summary, 08:00 on the 1st — last month at the point of sale, to owners and admins. Revenue and tax; it does not carry cost of goods, so it is not a margin statement.
The two rep-facing emails go only to a member linked to their Odoo salesperson — that link is what decides whose accounts are whose. A member with no link is silently not a recipient rather than a recipient of everybody’s customers, so if a rep is getting no mail, that is the first thing to check under Settings → Members. Nothing sends a page of zeroes: a day with nothing to report is a day with no email.
Saved reports
Under Reports, view your revenue grouped by a dimension — brand, trade, region, or channel — ranked, with returns and unit counts. When a classification map is incomplete, a coverage warning tells you how much revenue is still unclassified.
Ask
Requires the AI add-on, and sits next to Reports because that is what it is: type a question the way you would say it — “Who were my top 10 customers last quarter?”, “How many units did each brand sell last quarter?” — and it builds a report over the same numbers the Reports tab reads. It is not a chatbot, and it writes no prose about your numbers — the only sentence it may write is a short question back, when what you asked for needs narrowing.
Every answer opens with How this was read: the question restated as the report it became, the date window, how many invoice lines matched, and which parser read it. That card is above the numbers on purpose — a misread question is visible before anyone acts on a figure. It carries the Excel (.xlsx) export; under it, when the question matched anything, are a chart and the ranked table.
Most answers offer follow-ups under the reading — the next question or two worth asking, each one a click. Ask a product question that matches nothing and you are offered the closest sellers by revenue rather than an empty table, so you can tell a typo from a product you have genuinely never sold. Your recent questions sit under an empty question box, ready to re-run; they are kept in your browser rather than on our servers, so they do not follow you to another computer.
Your question is the only thing sent to the model. The model maps the words onto a fixed set of report options — it never sees and never queries your sales data, and it cannot invent a number, because every figure is computed the same way the Reports tab computes it. With no AI key configured, or on any question it cannot parse, a plain keyword parser reads it instead and the answer screen says which one did.
Overview
Your at-a-glance sales picture over a rolling window (adjustable up to 24 months): invoiced revenue and returns, month-to-date and year-to-date with a year-over-year comparison, a monthly revenue trend, and top customers, products and companies. A “Data as of…” line shows how fresh the numbers are, and Refresh enqueues an on-demand sync when you can’t wait for the next scheduled one.
Owners and admins only. It is the read of the whole business rather than of a rep’s day, so it is the first entry in the nav and where /dashboard lands for an owner or admin. Members and viewers do not see it, and land on Customers instead.
Product mapping
Mapping is setup rather than a report, so it lives in the workspace menu in the top right rather than beside the reports. Map products and customers into brands, trades and regions; set an override once and every report reflects it immediately — mapping is applied when a report is read, so there is no re-sync to wait for. This is what powers the grouped saved reports above.
Exports
Every report has an Excel (.xlsx) export so you can drop the numbers into a spreadsheet, a board deck, or a downstream system.
How syncing works
Readout reads your Odoo once a day, at 03:00 UTC; you don’t manage jobs. Reports read from the warehouse it fills, so they’re fast and consistent for everyone on your team. Sync now — on the Overview, and on Settings → Odoo connection — asks for that same job sooner. If one is already running it’s a no-op.
A sync only reads what has changed since the last one, which is what makes it cheap enough to run nightly. Two figures on the connection panel report on it, and they answer different questions:
- Last synced — when the job last ran.
- Data as of — the newest record Readout has. On a quiet week this sits further back than the last sync, and that is not a fault: the job ran and found nothing newer to read.
Re-reading everything
Because a normal sync asks “what changed since last time?”, it cannot see a change that the source does not report as one. Two cases do that: you point the workspace at a different Odoo database, or history is corrected upstream in a way Odoo does not mark as modified. No number of syncs will fix either.
Re-read everything, under the ⋯ menu on Settings → Odoo connection, discards the record of what has been loaded and reads your whole history again. It is owner/admin only and it asks you to confirm, because it runs for hours on a large database — and while it runs your warehouse holds a mix of old and new, so reports keep working but should not be trusted until it finishes.
Questions? See the FAQ →