
Running the Odoo sales cycle in Egypt: quotation to collection
What is the difference between invoicing what is ordered and delivered? Odoo 20.0 documents the cycle: quotation validity, delivery, down payments, and the ETA-linked invoice.
Executive summary
- The current version of Odoo is 20.0 (released September 2026); its documentation sets out a five-stage sales cycle: Quotation, Sales order, Delivery, Invoice, and Payment.
- A quotation's Expiration date is calculated automatically from the Default Quotation Validity setting or from the template's validity period, and can be edited before sending; Confirm turns the quotation into a Sales Order.
- Two invoicing policies at product level: Ordered quantities, invoiced on order confirmation, and Delivered quantities, invoiced once the quantity is actually delivered, even partially.
- A down payment, a percentage or a fixed amount, is created from the confirmed sales order itself and appears as its own line on the invoice. A validated invoice is not edited directly: in Odoo it is cancelled, refunded or modified through a credit or debit note.
- The customer invoice reaches the ETA through the l10n_eg_edi_eta module configured on the sales journal; the Odoo 20.0 release notes state that sending is now built into the Send wizard, and that Point of Sale submits sale and refund receipts to the ETA as e-receipts.
- Credit control in the documentation is a warning, not a block: no documented setting stops a sale that exceeds a customer's limit.
From quotation to sales order
A quotation is created in the Sales app with an Expiration field that sets its expiry date, and its Preview, as the customer sees it in the portal, shows clearly when the offer expires. The default date comes from the Default Quotation Validity setting (a number of days at company level, in Sales ‣ Configuration ‣ Settings) or from the Quotation Validity field on the template used, and it can be overwritten before sending. Confirm changes the status to Sales Order, the confirmation from which delivery and invoicing begin; Lock Confirmed Sales locks the order against further edits after that. The matching purchase cycle, from request for quotation to payment, is covered in a separate guide.
Delivery from stock and the invoicing policy
The default setting for the Inventory app is one-step delivery: a Delivery smart button appears once the sales order is confirmed and opens the delivery order, validating it (Validate) moves the product from stock to the customer directly, and the Delivered quantity on the sales order updates accordingly. Odoo also documents two-step and three-step routes (pick, then pack, then ship) for businesses that need these stages kept separate.
| Policy | When invoiced | Documentation note |
|---|---|---|
| Ordered quantities | As soon as the sales order is confirmed | Has no impact on the basic sales flow |
| Delivered quantities | Once the quantity is actually delivered, even partially | A Backorder can be created for the rest of a partial delivery, and invoicing before the delivery is validated returns an error |
The Delivered quantities policy prevents activating Automatic Invoicing (invoicing generated automatically when an online payment is confirmed). A new product takes on the policy active in Settings automatically; existing products are updated manually on the General Information tab.
The down payment
From the Create invoice(s) window after a sales order is confirmed, either Down payment (percentage) or Down payment (fixed amount) can be selected. The down payment appears as a line on the draft invoice, and once confirmed it is listed in a separate Down Payments section on the sales order lines. A 100% down payment is not a full payment: the Create Invoice button remains visible because a second invoice is still required to complete the order. The income account the down payment is posted to can be changed on the draft only, and cannot be modified once posted. If the product's policy is Delivered quantities, the down payment cannot be deducted on the final invoice until the product is delivered, because Odoo does not allow an invoice with a negative total; if nothing has been delivered, a credit note is created that cancels the draft invoice created after the down payment.
Returns and credit notes
Before invoicing, a return is handled with a return transfer alone (the documentation's Reverse Transfer), created with Return on the delivery order linked to the sales order; once it is validated, the Delivered quantity updates by the difference, and the next invoice covers only what the customer kept. After invoicing, the return transfer alone is not enough because a validated or sent invoice cannot be changed; it is used together with a Credit Note: from the invoice, the Credit Note button, a reason, a journal and a reversal date, then either Reverse (an editable draft, suited to a partial refund) or Reverse and Create Invoice (automatically validated and reconciled against the original, opening a new draft invoice). A credit note's sequence starts with R, and its journal entry reverses the original invoice's entry; a validated invoice is cancelled, refunded or modified through a credit or debit note. The Odoo 20.0 release notes state that the return wizard has been removed and the process simplified, while the returns page of the documentation still describes the former Reverse Transfer pop-up.
The e-invoice and the link to the ETA's system
The customer invoice generated from a sales order is the document that passes through the l10n_eg_edi_eta module, on top of the base l10n_eg localisation package. Each branch needs its own Sales-type journal, with a Company-type contact whose address and Tax ID are complete, and with ETA Activity Code and ETA Branch ID settings. Customer and product data (Tax ID, a GS1 or EGS barcode, or an ETA Item code) must be set before an invoice is issued from the sales order, not after. Under the Odoo 20.0 release notes: a branch's activity type can now be selected by its code and its Arabic description together; sending to the ETA is now part of the Send wizard, with pre-check validation banners, and a demo mode for testing the workflow internally without any credentials; and Point of Sale submits sale and refund receipts to the ETA as e-receipts — none of which had yet reached the detailed Egypt localisation documentation page at the time of writing. The legal mandate for e-invoicing is covered in E-invoicing in Egypt. Configuration errors in this link and the full technical integration with the invoice and receipt systems are covered in two separate guides.
Payment follow-up, reconciliation and credit control
Follow-up levels (Follow-up Levels, under Accounting ‣ Configuration) trigger by the number of days an invoice is overdue, automatically or manually, by email, WhatsApp, SMS or post; from a customer's record, a reminder is sent manually with Send in the Invoice follow-ups section, and a Customer Statement or Follow-up Report can be produced; for several customers at once, Process Follow-ups is run from the customer list. The Odoo 20.0 release notes state that the workflow for automatic and manual reminders has been simplified, that a reminder can now also be sent via a Send button on the invoice form itself, and that automatic reminders are enabled and managed in the Accounting settings. In bank reconciliation, if no invoice exists yet, the Sales action on a transaction opens the same partner's sales orders, so the invoice can be created with Create Invoices before the transaction is reconciled with Reconcile. Credit control is a warning, not a block: Sale Warnings shows a message for orders involving a specific customer or product, and in Point of Sale a maximum credit on the customer account turns the customer selector orange with a warning icon once reached, but this does not prevent the sale from proceeding, as the documentation states explicitly.
What this requires
- Set the Default Quotation Validity and check the Expiration date on every quotation before sending it.
- Choose the invoicing policy on each product to match how it is actually delivered, not by default.
- Set the down payment's income account on the draft, since it cannot be changed once posted.
- Handle any return after invoicing with a return transfer from the delivery order together with a Credit Note, and never edit a validated invoice directly.
- Set up a separate sales journal with its own ETA settings for each branch, with the activity code and its Arabic description, and verify customer and product data before the first invoice.
- Configure Follow-up Levels and reconcile bank transactions promptly, so reminders are not sent for invoices already paid.
The firm's ERP Consulting Department configures invoicing policies and quotation templates, links branch journals to the e-invoicing system, and follows up the setup of collection reminder levels.
Mahmoud Nassef — Chartered Accountant (Egyptian Register), Founder Partner
Member, Egyptian Society of Accountants & Auditors
Member, Egyptian Tax Society
Member, Egyptian Society for Public Finance and Taxation
Partner profile · Book a consultation
Disclaimer: This bulletin is prepared for general information on the legislation in force at the date of its publication. It does not constitute a professional opinion or tax or legal advice on any particular matter, and it should not be relied upon in place of advice based on an examination of the circumstances of each case. Nassef & Partners International accepts no responsibility for any action taken, or refrained from, in reliance on its contents. The positions stated remain subject to subsequent legislation and decisions.
