Running an HVAC business with Odoo
Can I accept online invoice payments in Odoo?

Test Odoo online invoice checkout with the official Demo provider, one error and successful retry, exact invoice/receipt links and no real charge.
Stock Odoo provides a demo checkout that can simulate an online invoice payment. Alex uses it to test the customer journey before considering a real processor. An Error attempt creates no receipt; a Successful retry creates one simulated $55.12 receipt and clears the deposit invoice. This verifies the shipped demo flow, not live card processing, fees, payouts or bank settlement.
Alex Rivera and Demo Air HVAC are fictional training examples. Prices, dates, quantities and business situations in this guide are illustrative.
Before you begin
Tested in stock Odoo 20.0-20260926 Community as the demo owner administrator, with official modules and standard configuration. Use a training database only. The owner administrator installs the official payment_demo module; a separate signed-out customer browser opens the native private invoice link. H27 supplies unpaid INV/2026/00002, the $55.12 deposit request on S00001, with Billing Office H08. Its $220.48 final invoice stays Draft/on hold. Reuse H73’s bank journal. H54’s $171.72 invoice has already been paid in H56 and is preserved. All checkout details below are invented test strings. No real card, processor account, credentials or live payment is used. Private invoice-link parameters stay out of public examples. Invoice Online Payment is already enabled in Invoicing settings in this example; the later native settings check confirmed it without changing the setting.
Step-by-step workflow
Stock Odoo 20 Community. Fictional Demo Air HVAC uses the official Demo provider in Test Mode: one Error creates no receipt; one Successful retry creates one simulated USD 55.12 receipt. No real money or bank settlement is demonstrated. The USD 220.48 final invoice stays Draft and held for review.
Step 1. Install the official Demo provider
Open Apps, remove the default Apps filter and wait for the list to refresh. Search payment_demo, apply the Module search and locate Payment Provider: Demo. Click its Activate once and wait for installation. The selected module is supplied by Odoo S.A. under LGPL-3; it is not an Enterprise upgrade or a third-party module. The existing official Payment Engine and Payment - Account modules were already installed.





Step 2. Inspect the actual test settings
Open Invoicing → Configuration → Online Payments and select Demo Test Published. The provider form shows Test Mode, Published and an unchecked Live box. Its Demo payment method is checked. In Configuration, the inherited Payment Journal is Demo Operating Bank H73. These were the module’s saved defaults in this runtime; no Live activation or processor credentials were needed. The final record remains Test Mode.











Step 3. Open the unpaid deposit as a customer
Open INV/2026/00002 and verify Posted, $55.12 due and the correct billing contact. Click Preview, then open its resulting private invoice link in a separate signed-out browser. The customer page offers Sign in and Pay Now and identifies the $55.12 invoice. This test uses the genuine preview link; it does not establish invoice-email delivery. Keep the private URL private.







Step 4. Review the native Pay dialog
Click Pay Now. Check Amount: $55.12, Reference: INV/2026/00002 and the selected Demo method. The form has Payment Details (test data) and Payment Status, with Successful, Pending, Cancelled and Error choices. Save my payment details is unchecked; leave it unchecked. This provider accepts synthetic test input for its simulation, not a real card charge.



Step 5. Run the identified Error case first
Enter DEMO-H76-ERROR-001 in Payment Details (test data), choose Error in Payment Status and click Pay once. Wait for the return to the invoice before judging the outcome. The deposit remains unpaid at $55.12. The saved transaction reference INV/2026/00002 has Error status and the explicit demo error message, with no linked receipt. Its existence is an attempted transaction, not a successful payment.






Step 6. Retry once with the Successful case
On the same unpaid invoice, click Pay Now again. Enter DEMO-H76-SUCCESS-002, choose Successful, retain the unchecked save-details option and click Pay once. Wait for completion; the first screen or an intermediate read can precede the completed posting. The customer page returns with Paid, Your payment has been processed, and no Pay Now action. Reload the page and verify that result remains.









Step 7. Inspect both transaction attempts in the owner view
Return to the owner’s same invoice and reload. It now shows Paid Customer Invoice, Amount Due: $0.00, 1 Payments and 2 Payment Transaction. Open 2 Payment Transaction: the list retains INV/2026/00002 — Error and INV/2026/00002-1 — Confirmed, each for $55.12 with Demo as method/provider. The failed attempt remains in history; the retry did not overwrite it. Confirmed describes the successful demo transaction, not a real processor payout.









Step 8. Follow the successful transaction to its single receipt
Open INV/2026/00002-1, then Accounting and its payment link PBNK1/2026/00004. Check type Receive, amount $55.12, customer Demo Property H08, journal Demo Operating Bank H73, method Demo, memo/reference INV/2026/00002-1 and status Reconciled. The transaction/invoice uses Billing Office H08; the generated receipt uses its parent commercial customer. The generated payment Date is October 15, 2026, while the deposit Invoice Date remains October 14. Inspect the saved date rather than assuming it matches the invoice date.











Step 9. Check the accounting and retry boundary
The successful transaction links to exactly one receipt and the same deposit invoice; the Error transaction has no receipt. Saved checks after the customer reload still show two attempts, one new receipt and zero saved payment tokens. The receipt matches the invoice receivable but leaves $55.12 in Outstanding Receipts unmatched. The Demo method’s native account mapping points there. No Bank-account entry or bank-statement reconciliation was created. Do not add a manual payment for this same simulated receipt.











Step 10. Preserve the final draft and its review hold
Reopen H27’s $220.48 final draft. Its original lines and single deposit deduction remain unchanged. Update its note to label H27’s earlier unpaid state as historical and record the later Demo-only paid result; retain the hold pending actual work/commercial review. Save pending changes and wait for the save to settle. The final stays Draft/unpaid and is neither posted nor sent. Earlier customer/supplier invoices and payments are preserved. A real provider would need its own separately verified configuration and operating process.










Check the result
The official Demo provider is installed, Published in Test Mode with Live off and the existing bank journal. The $55.12 deposit has two retained online transaction attempts: Error with no receipt, then Confirmed with one $55.12 Demo receipt. The invoice is Paid/residual zero and the receipt is Reconciled. Customer reload retains Paid without Pay Now and creates no extra attempt/receipt. Saved tokens remain zero. The receipt’s Outstanding Receipts debit remains unmatched and Bank has no entry. The $220.48 final draft retains its deduction, updated historical/demo context and review hold; the earlier $171.72 paid invoice and $37.24 supplier residual are preserved.
If your screen differs
This is a shipped Demo-provider test in unmodified Community, not a live-processing tutorial. Only Error and Successful were exercised; Pending, Cancelled, saved-token use, manual capture, refunds and another processor were not tested. Installation published Demo in Test Mode by default. Reopen/no-Pay checks established no new attempt on revisit, not protection against every possible duplicate request or network retry. The initial selected read briefly captured an in-flight draft transaction before later results finished; final completed-state/link checks resolve that timing. The generated receipt uses October 15 even though the invoice is October 14 and the local transaction list displays October 14 at 8:01 PM; keep date and timezone assumptions explicit. Provider checkout can create accounting records in a demo without moving real money. Live processor fees, payout timing, credentials and settlement require separate current verification.
Frequently asked questions
Can I test online invoice payments in Odoo without a real charge?
Yes, this native test installed the official Payment Provider: Demo module and retained Test Mode with Live off. A signed-out customer used the private invoice link and Demo’s test-data/status controls. Error created no receipt; Successful created one simulated receipt and cleared the same invoice. This does not verify a live third-party processor.
Does an Odoo demo payment mean the bank received money?
No. Demo changed the invoice to Paid and created a Reconciled payment record, but its $55.12 Outstanding Receipts debit stayed unmatched and Bank had no entry. No charge, payout or statement reconciliation occurred. Treat the accounting and customer-page result as a simulation.What should I check after an Odoo payment retry?
Inspect each transaction reference/status, its invoice and any linked payment. Here Error remained as INV/2026/00002 without a receipt; the Confirmed retry became INV/2026/00002-1 with exactly one $55.12 receipt. Check the zero invoice balance and reload before recording another payment. Revisit created no extra attempt or receipt; other retry/network cases were not tested.Continue building the business
The office grows next: IT01: What technology do I need to open an HVAC shop and office? (guide coming later). For the accounting boundary, continue with H75: What can I do for bank reconciliation in Odoo? (guide coming later). The demo’s unmatched Outstanding Receipts remains visible for that review; it is not actual bank evidence.
Talk to an Odoo partner
Bring your current process and the result you need to Onward to plan your Odoo workflow. Talk to an Odoo partner.