All posts

Odoo Revenue Attribution: Confirmed Orders Are Not Collected Cash

By Rajesh Kumar, Founder, Attribi ·

Odoo revenue attribution becomes misleading when a won opportunity, a confirmed sales order and a paid invoice are treated as the same event. Choose which commercial outcome your marketing report measures, preserve the corresponding record and currency, and reconcile the other stages separately.

Three distinct commercial stages: opportunity forecast, confirmed sales order and collected payment. Different stages answer different business questions. Original editorial illustration, not a product screenshot.

A campaign can produce a promising opportunity without producing an order. An order can be confirmed before the customer pays. A payment can arrive in a different reporting month from the marketing interaction that started the relationship.

None of those differences automatically means attribution is broken. They mean the report needs a clearer definition. This guide helps marketing and operations teams agree what their Odoo outcome represents before comparing advertising costs with commercial value.

Start with the question, not the dashboard label

There are four useful questions:

  1. Which campaigns create opportunities that sales considers worth pursuing?
  2. Which campaigns lead to confirmed orders?
  3. Which customers have been invoiced?
  4. How much customer cash has actually been collected?

Each supports a different decision. Pipeline planning might use the first. Demand-generation evaluation might use the second. Finance reconciliation may require the third and fourth. Trouble starts when a report answers one question but its heading suggests another.

A dashboard titled "Paid customer revenue" should not quietly use the total of confirmed orders. Equally, an acquisition report based on order confirmation should not be dismissed simply because collections occur later. It can be useful if its definition is explicit.

Write a short measurement statement before implementing anything: "We evaluate this campaign against confirmed order value, in the order's original currency, using the order-confirmation period. This is not collected cash or accounting revenue recognition." Adapt that statement to the outcome your organisation actually needs.

What order confirmation means in Odoo

Odoo's documentation describes a confirmed quotation becoming a sales order, which can then be invoiced and paid. Confirmation is therefore not a universal assertion that the full amount has already reached the bank. Odoo also supports workflows in which online payment contributes to order confirmation, so the business configuration matters. See Odoo's quotation workflow and online payment confirmation.

Do not infer the payment state from an order label alone. Inspect the relevant invoice and payment evidence when the business question is cash collection. For marketing reporting, it is often better to preserve several clearly named totals than to force everything into one ambiguous revenue number.

One customer, three different totals

The following example is illustrative, not an Attribi customer result.

A European agency acquires a customer through a paid campaign. An opportunity carries an expected value of €15,000. A quotation for €12,000 is accepted and confirmed. An initial invoice of €4,000 is paid. Remaining billing and payment depend on the agreed project schedule.

One illustrative customer has a €15,000 forecast, a €12,000 confirmed order and €4,000 collected; the amounts measure different stages. Illustrative amounts only. These are different views of one relationship, not additive revenue.

The campaign has not produced €31,000 by adding those amounts together. A pipeline report might show €15,000 of expected opportunity value. An order report might show €12,000 of confirmed value. A collections report might show €4,000 received so far.

If the ad platform receives the confirmed-order amount, describe it as that signal. Do not call it €12,000 in collected cash. For a US customer, the same discipline applies in dollars. When combining US and European results, preserve original amounts and currencies before applying a separately documented reporting-currency conversion. Never add €12,000 and $12,000 as though they were the same unit.

The documented Attribi boundary

Attribi's Odoo integration is documented as read-only. It imports confirmed or done sales orders and uses nominated CRM stages for qualification. Odoo write-back and creating attribution fields inside Odoo are not live capabilities described by that page.

The Odoo setup guide describes daily polling, email-based matching and order total plus currency as the closed-won signal. A won lead without a confirmed order does not provide that revenue signal. The guide also warns about overlapping Shopify/Odoo order sources and says later order edits do not automatically correct previously sent values.

These are reasons to validate the fit of the workflow, not reasons to rename its output as paid revenue. If your required business outcome is invoice payment, do not assume an order-based integration observes it.

Build a small reconciliation ledger

Before evaluating a month of campaigns, work through a manageable sample of real records with authorised access. For each commercial relationship, record:

  • Opportunity identifier and qualification decision.
  • Confirmed order identifier, amount, currency and confirmation date.
  • Invoice and payment references, where relevant to the question.
  • Marketing identity or source evidence.
  • Destination conversion evidence, if an upload is part of the workflow.
  • An explanation for exclusions or unmatched records.

This is a proposed operational worksheet, not a claim that Attribi automatically exports every field in this list. Use record identifiers wherever they exist. A customer name alone is not a dependable unit of counting: one organisation can place several orders, and people can share similar names.

Then ask three separate questions:

Was the intended commercial record eligible? Check the exact outcome your measurement definition requires.

Could the record be associated with the marketing journey? A valid order does not guarantee that the earlier visitor can be identified.

Was the intended value delivered to the chosen destination? An internal report and an ad-platform conversion feed are separate outputs.

Keeping these questions separate prevents a missing marketing match from being mistaken for missing commercial revenue.

Investigate differences before changing bids

Suppose the order report and marketing report disagree. Start with explanations that can be proved record by record:

  • Different date fields or reporting periods.
  • Excluded or unmatched buyers.
  • Several systems containing the same commercial sale.
  • Tax or delivery charges included in one total but excluded in another.
  • A changed or cancelled order.
  • Different currencies.
  • A subsequent purchase associated with an existing customer.

Do not fix the discrepancy by editing conversion values until you understand its source. That can make two reports look similar while making both less informative. A useful reconciliation note names the cause and affected amount. "€8,000 of confirmed orders were not yet paid" explains more than "finance and marketing disagree".

Check API eligibility before diagnosing authentication

For Odoo Online, verify the plan rather than assuming any paid subscription includes external API access. Odoo's official documentation says external API access is available on Custom plans, not One App Free or Standard. Self-hosted and Odoo.sh deployments require their own access and configuration checks. See Odoo external API documentation.

A successful sign-in to Odoo is not proof that an integration identity can read the required records. Have the administrator test the exact intended permissions without granting unnecessary access. Never place API keys in a reporting spreadsheet, article screenshot or shared troubleshooting note.

Make reconciliation an operating habit

Assign one owner to the commercial definition and one to the marketing pipeline. They may be the same person in a small business, but the responsibilities remain different.

At each review, record the definition, configuration changes, period and currencies, unresolved exceptions, and whether the evidence is mature enough to inform a budget decision. An attractive return figure is not automatically actionable if a few large orders explain most of it. Inspect those orders before treating the average as a repeatable result.

The objective is not perfect agreement between every dashboard. It is an explainable relationship between them.

A reliable Odoo attribution report starts with one explicit commercial definition. Preserve the order, invoice and payment distinctions, reconcile a sample, and only then use the results to assess advertising.

Frequently asked questions

Should marketing use orders or payments?

Use the outcome that fits the decision and label it accurately. Orders can provide an earlier demand signal; payments answer a different question. Neither should silently replace the other.

Can I treat a confirmed order as recognised revenue?

Not by default. This article concerns operational marketing measurement, not accounting recognition. Ask your finance owner which definition applies to the financial report.

What should I check before trying Attribi?

Compare your required outcome with the documented integration boundary, then test a small set of records. Review the current plans on the pricing page rather than assuming every revenue workflow belongs to the free tier.

See which touchpoints your CRM actually verified.

Attribi records every touchpoint, matches closed deals back to them, and shows platform claims next to CRM verified revenue.

No credit card. Free up to 500 visitors a month. New workspaces start with 30 days on Pro.