Your invoice is the most-seen document your company produces. Customers read it, accountants file it, auditors check it. So it’s genuinely irritating when Odoo’s default version is almost right — the logo’s fine, but your payment terms are buried, a field you need is missing, and the layout wasn’t built for your longest orders.
The good news: fixing this rarely needs a project, a developer, or a custom module. Odoo’s PDFs are more editable than most people realise. Here’s how they actually work, what you can do yourself, where people trip up, and when it’s worth handing over.
How Odoo’s PDFs really work
Every printed document in Odoo — invoice, quotation, delivery slip, purchase order — is a QWeb template. QWeb is Odoo’s templating language, and the key thing to understand is this: these templates are data stored in your database, not files locked away in the software. (Odoo’s report docs walk through the editor.)
That single fact is why so much is possible without a “project.” You’re not rebuilding Odoo. You’re editing a record — the same way you’d edit a customer or a product. The template pulls live data (customer name, line items, totals) into a fixed layout, and every time you print, Odoo renders the current template against the current record.
This is also why the important myth needs busting: you do not need a custom module — or even self-hosting — to change your invoice. QWeb templates are editable on Odoo Online too. The templates live in your database regardless of where Odoo runs, so the “we’d have to build something” reflex simply isn’t true for most report changes.
What you can do yourself
For a large share of real requests, the built-in tools are enough.
The document layout settings cover the basics across every report at once: your logo, company details, colours, font, and the overall header/footer style. If your goal is “make all our documents look like us,” start here — one change, applied everywhere.
Odoo Studio’s report editor goes further, per report. With Studio you can insert dynamic fields (a PO reference, a custom note, delivery details), edit headers and footers, adjust text, formatting and tables — directly on invoices, quotations, and delivery slips.
One caveat worth naming: Studio is an Enterprise-only app. If you’re on Odoo Community, you don’t have the visual report editor — but you’re not stuck. Reports are still QWeb records, and they can be edited in developer mode. It’s more technical than Studio’s drag-and-drop, but it needs no custom module. (This developer-mode route is the path for self-hosted Community setups — on Odoo Online, Studio is the sanctioned report editor.)
The one rule that saves you pain: duplicate the standard report before you change it. Odoo’s own docs recommend editing the copy, not the original — so that the next Odoo upgrade doesn’t quietly overwrite your work. It takes ten seconds and prevents the most common way people lose an afternoon.
The traps that catch people
Report editing is approachable, but a handful of predictable things go wrong. Knowing them in advance is most of the battle.
Layout that breaks under real data. A template that looks perfect with a three-line invoice falls apart with forty lines, a long address, or a product name that wraps. Page breaks land mid-table; a total floats onto a lonely second page. The fix is designing for the messy case, not the demo case — and actually testing with your longest, ugliest real order.
The field that isn’t there. You want to show a value that the invoice doesn’t currently carry — a custom field, or data that lives on a related record (the sales order, the customer, the delivery). Placing a field the report can reach is easy; surfacing data from elsewhere sometimes means the field has to be made available to the template first. This is where a lot of “why can’t I find my field?” frustration comes from.
Multi-language and multi-company. Odoo prints documents in the customer’s language, not yours. Hard-code an English label into the template and your French customer gets a French invoice with one stubbornly English line. Labels need to go through Odoo’s translation layer, not be typed straight in. Same care applies if you run multiple companies with different legal footers.
Paper size and margins. A4 versus Letter, header height, print margins — small settings that cause cut-off content or awkward whitespace. Usually quick to fix once you know it’s a layout configuration issue and not the template itself.
Editing the original instead of a copy. The upgrade trap again, because it’s the one that hurts most: change the standard report in place and a future update can silently revert it. Always work on the duplicate.
When it’s worth handing off
Plenty of invoice changes are a fifteen-minute job you should absolutely do yourself — a new field, a reordered block, your branding. Do those.
It’s worth handing off when the document has to be right rather than merely different: conditional sections that appear only for certain order types, precise multi-page behaviour, dynamic tables, legal or tax layouts where a wrong number is a real problem, or multi-language and multi-company output that has to be correct in every case. These sit in the QWeb/XML layer, and getting them robust — tested against the long orders, the edge cases, the next upgrade — is exactly the kind of work that looks simple and isn’t.
There’s also the practical calculus of your own time. If you’re an afternoon into fighting a table that won’t stay on one page, that afternoon was the expensive part — not the fix.
The difference between an invoice that works in the demo and one that holds up across every real order, language, and upgrade is mostly experience: knowing where these templates break before they break. That’s the part worth getting right the first time.