In Odoo 19 a customer invoice moves from draft to posted when you click Confirm. It goes out through the Send dialog and is paid once a payment is registered and matched to the bank. Payment terms, online payment through providers such as Razorpay or Stripe, credit notes and Indian e-invoicing (IRN) are all in Community. Automated payment follow-ups are Enterprise.
How an invoice moves through Odoo 19
Invoices come from a sales order, a subscription, a timesheet or directly from Customers › Invoices. Whatever the source, the lifecycle is the same:
- Draft. Editable, no accounting impact, no invoice number yet.
- Confirm. The invoice is posted, gets its number from the journal sequence, and the receivable and GST lines hit the ledger.
- Send. One dialog emails the PDF, attaches any e-invoice file and, for Indian B2B invoices, submits to the Invoice Registration Portal.
- Pay. Registering a payment moves the invoice to "In Payment". It becomes "Paid" only when that payment is matched to a bank statement line, or straight away if the payment method has no outstanding account.
The difference between "In Payment" and "Paid" matters. "In Payment" means someone said the money arrived. "Paid" means the bank agrees. Collections staff should work from the second.
Payment terms that match your contracts
Odoo 19 installs ten payment terms, from Immediate Payment to "30% Now, Balance 60 Days" and "2/7 Net 30". You manage them under Configuration › Invoicing › Payment Terms. Each term is made of lines: a percentage or fixed amount, due a number of days after the invoice date, after the end of the month, or on a given day of the following month.
Terms can also carry an early payment discount (the Early Discount option, with a percentage and a number of days). You choose whether the tax is reduced only on early payment, never, or always on the invoice. For GST-registered businesses, agree the treatment with your CA before switching it on. It changes what the tax lines say.
Set a default term on each customer, not per invoice. Sales orders and invoices pick it up from there, and the aged receivables report reflects what you actually agreed.
Getting paid online: providers, links and QR codes
In Settings › Customer Payments, the option to let customers pay invoices online installs account_payment (Community). Customers can then pay from the invoice in their portal. Providers are set up under Configuration › Online Payments › Payment Providers.
For India, the Razorpay provider enables card, netbanking and UPI payments by default. Stripe, PayPal, Adyen and others are also in the 19.0 source. A payment confirmed through a provider is registered against the invoice automatically, so it needs no manual entry.
- Payment links. The "Generate a Payment Link" action on an invoice produces a URL you can send over WhatsApp or email when a customer won't log into a portal.
- QR code. The same setting can add a QR code on the PDF that links to the online payment page.
- Batch payments for grouping deposits (such as a day's cheques) are an Enterprise option.
Payment follow-ups (Enterprise)
Follow-ups come from account_followup, which is Enterprise-only. You define Follow-up Levels under Configuration › Invoicing: each level fires a number of days after the due date (it can be negative, to remind before the due date). Each level can send an email with the invoices attached, send an SMS, and schedule an activity for the follow-up responsible, the salesperson or the account manager. A level can run automatically or wait for someone to trigger it.
Odoo creates two levels to start with, at 15 and 30 days. Each customer is set to automatic or manual reminders, and the customer list has "Overdue Invoices" and "Requires Follow-up" filters to work from.
Our default: keep the first reminder automatic and polite, and make the second one an activity for a person to call. Put key accounts, where a relationship manager should decide the tone, on manual.
Credit notes and debit notes
On a posted invoice, the Credit Note button opens the reversal dialog. You give a reason, a journal and a date, then either Reverse (a credit note that offsets the invoice) or Reverse and Create Invoice (credit the original and open a corrected draft). The second option is the clean way to fix a wrong price or tax after posting.
Debit notes, for charging more on an existing invoice, come from account_debit_note. The Indian localisation depends on it, so it is always there for Indian companies. Both documents keep a link to the original invoice. GST reporting needs that link, and it makes the customer's statement readable.
E-invoicing in Odoo 19, including India's IRN
Indian e-invoicing is in l10n_in_edi (Indian - E-invoicing, LGPL, so it works in Community too). Turn on E-Invoicing in the Indian Integration block of Settings, save, then enter the API username and password you created on the e-invoice portal and click "Verify Username and Password". Odoo connects through a GSP partner and uses IAP credits.
From then on, the Send dialog offers an "E-invoicing" option on eligible invoices. It sends the JSON to the Invoice Registration Portal and stores the response, including the IRN, on the invoice. Eligibility follows the GST section of the lines: B2B, exports, SEZ, deemed exports and the matching credit and debit notes. B2C invoices are not sent. Cancellations take one of the portal's reasons (Duplicate, Data Entry Mistake, Order Cancelled, Others) plus remarks. If you also use e-way bills, l10n_in_ewaybill_irn generates the e-way bill from the IRN.
Outside India, account_edi_ubl_cii exports and imports UBL and Factur-X invoices, and account_peppol sends them over Peppol where that network is used. Both are Community.
Settings › Invoicing › Indian Integration [x] E-Invoicing → save, then set credentials Username / Password → Verify Username and Password Invoice › Send [x] E-invoicing → IRN stored on the invoice
Get payment terms and follow-up levels right before go-live. Everything else can be tuned once real invoices are flowing. Next: vendor bills and accounts payable, and for the GST side in depth, GST compliance in Odoo 19.
Questions we get asked
Does Odoo 19 support e-invoicing (IRN) in India?
Yes. The Indian - E-invoicing module (l10n_in_edi) is LGPL, so it works in Community and Enterprise. After you enable E-Invoicing in Settings and verify your e-invoice portal API credentials, the invoice Send dialog submits eligible B2B, export, SEZ and deemed-export invoices to the Invoice Registration Portal and stores the IRN on the invoice. It uses Odoo IAP credits for each transaction.
Can customers pay Odoo invoices by UPI?
Yes, through a payment provider. Enable online invoice payment in Settings, then configure a provider such as Razorpay under Configuration › Online Payments › Payment Providers. In the 19.0 source, Razorpay enables card, netbanking and UPI by default. Customers pay from the invoice portal or from a payment link, and the payment is registered against the invoice automatically.
Are payment follow-ups available in Odoo Community?
No. Automated follow-ups come from the account_followup module, which is Enterprise-only. It adds Follow-up Levels that trigger a number of days after the due date and can send emails with invoices attached, send SMS and schedule activities. In Community you can still filter overdue invoices and send reminders by hand, but there is no scheduled follow-up engine.
Why does an Odoo invoice show "In Payment" instead of "Paid"?
"In Payment" means a payment has been registered but not yet matched to a bank statement line. The payment sits on an outstanding receipts account until reconciliation confirms the money reached the bank. Once it is matched in bank reconciliation, the invoice changes to "Paid". Payment methods configured without an outstanding account mark invoices paid straight away.