- Home
- Apps
- SaaS Tools
- POS Promotions & Discount Engine
Illustrative previewA rule-based promotions and discount engine for Odoo Point of Sale
— BOGO, mix-and-match, happy-hour, bundles and quantity-tiered pricing that auto-apply the best eligible offer at the register. Built, installed and supported by
ECOSIRE for your Odoo 17, 18 or 19.
What is POS Promotions & Discount Engine?
A rule-based promotions and discount engine for Odoo Point of Sale — BOGO, mix-and-match, happy-hour, bundles and quantity-tiered pricing that auto-apply the best eligible offer at the register. Built, installed and supported by ECOSIRE for your Odoo 17, 18 or 19. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.
Key Features
Built to order, done for you
No DIY setup — a working app, built, installed and supported by ECOSIRE.
- 1
You order
Start with a one-time build price. We scope it with you at kickoff.
- 2
We build & install
ECOSIRE builds, configures and installs it on your Odoo.
- 3
Go live + support
You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.
Technical Specifications
- Odoo Compatibility
- Odoo 17, Odoo 18, Odoo 19
- Editions
- Enterprise & Community
- License
- Licence confirmation required
- Python Requirement
- Python 3.10+
- Database
- PostgreSQL 12+
About this Product
Retail and F&B operators live and die by promotions, but the moment your offers get real — buy-2-get-1 on a specific category, a happy hour that only runs 4-7pm on weekdays, a mix-and-match "any 3 for the price of 2," a lunch bundle priced below the sum of its parts — Odoo's native tooling starts to fight you. Community POS ships basic price lists and a manual per-line discount button; even Enterprise's loyalty/promotions programs cover coupons and simple reward tiers but leave gaps around time-windowed pricing, category-scoped BOGO, deterministic "best offer wins" resolution, and clean stacking rules. The result is cashiers punching manual discounts (which nobody audits), promos that don't stop at their end time, and margin quietly leaking at the register.
This is a build-to-order module ECOSIRE develops and installs on your instance. At its core is a promotion.rule model (models.Model) that stores each offer as structured data: trigger conditions (product, product.category, minimum quantity, minimum subtotal), a time window (day-of-week mask plus start/end times for happy-hour), a reward definition (percentage, fixed amount, free-line, or override price for BOGO/bundle), and stacking flags. Eligibility is evaluated against the live order using computed fields (@api.depends on order lines and quantities), and a resolver applies the single best-value promotion — or the allowed combination when your stacking rules permit — so two competing offers never double-discount by accident. Everything runs inside the POS session so it works offline and re-syncs, with the reward reflected as an explicit discount line the receipt and Z-report can account for.
Technically, the module is a normal Odoo addon: a __manifest__.py declaring dependencies on point_of_sale (and pos_loyalty where we extend rather than replace it), server-side Python models plus OWL/JS extensions to the POS front-end so promotions apply on the screen in real time, and QWeb receipt templates updated to print the applied offer name and savings. Access is locked down with ir.model.access.csv and record rules so only managers create or edit rules while cashiers only consume them; an optional automated action (ir.cron/base automation) can auto-activate and expire seasonal campaigns by date. Because promotions are ordinary records, they're fully reachable over Odoo's XML-RPC/JSON-RPC API for reporting or external campaign tools. We build for your exact edition — Community or Enterprise — and target Odoo 17.0, 18.0 or 19.0, matching the POS framework version you actually run.
Delivery is build-to-order, not an instant download. It starts with a short scoping call where we capture your promotion types, category structure, stacking policy and edge cases (loyalty interaction, refunds, split payments), then we confirm scope and price in writing. From confirmed scope, typical delivery is one working week: we develop against a staging copy of your database, run UAT with your real product catalog, hand over installable source and a git repository, train your managers and cashiers, and stand by through a post-go-live support window. No fabricated benchmarks or borrowed testimonials — just a module engineered to your promotion rules and your Odoo version.
What you get
- Installable module source code targeting your exact Odoo edition (Community or Enterprise) and version (17.0/18.0/19.0)
- Installation and configuration on your staging environment, then production go-live
- Technical documentation: model schema, rule fields, resolver logic, security model and dependency notes
- Manager and cashier user guide plus a live training session on authoring and running promotions
- UAT on a staging copy of your database with your real catalog, plus a documented rollback plan
- Post-go-live support window for defect fixes and configuration adjustments
- Git repository handover with full commit history and tagged release
- QWeb receipt/report template updates reflecting applied promotions and savings
Who this is for
Multi-store retail operator
Runs frequent category-scoped BOGO and mix-and-match offers across several outlets and needs promotions applied consistently and auditably at every register, not via manual cashier discounts.
F&B / restaurant owner with happy hours
Needs reliable time-windowed pricing that turns on and off automatically for happy hours and daypart deals, printed clearly on receipts, without staff having to remember to switch price lists.
Retail operations / promotions manager
Designs the offer calendar and stacking policy and wants a single place to define rules, control which promotions combine, and expire campaigns by date without developer help.
Odoo administrator / IT lead
Owns the instance and cares about clean security via record rules, edition/version compatibility, source and git handover, and API access to promotion data for reporting.
How POS Promotions & Discount Engine Compares
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo Native |
|---|---|---|---|---|
| BOGO / mix-and-match | Category-scoped BOGO and mix-and-match built to your rules | Possible but you specify and test every case yourself | Often single-product BOGO only, limited category logic | No true BOGO; manual per-line discount only |
| Happy-hour / time windows | Day-of-week mask + start/end times, auto on/off | Buildable, but scheduling logic is on you | Rarely time-windowed; needs manual price-list swaps | No native time-window pricing at the register |
| Best-offer resolution | Deterministic resolver applies the single best-value offer | You design and validate the tie-break logic | Often first-match or manual selection | Cashier decides manually, error-prone |
| Stacking control | Exclusive / additive / priority rules you define | Fully custom but unspecified until you build it | Limited or all-or-nothing stacking | No structured stacking policy |
| Edition & version fit | Built for your exact edition and Odoo 17/18/19 | Depends on your team's version expertise | May lag new Odoo releases or edition gaps | Enterprise loyalty gaps; Community even thinner |
| Security & audit | Record rules + explicit discount lines on receipts/Z-report | You implement access rules and audit trail | Varies; audit trail often shallow | Manual discounts are hard to audit |
| Support & handover | Source + git repo, training, post-go-live support window | Only what your team documents | Vendor support tiers, no bespoke fit | Community help only, no tailored support |
| Total effort to you | Scope call, then we build/UAT/train — one working week | Full dev, QA and maintenance burden in-house | Install fast but bend your process to the module | Free but manual workarounds daily |
Frequently Asked Questions about POS Promotions & Discount Engine
How long does delivery take?
This is a build-to-order module. After a short scoping call we confirm your promotion types, stacking policy and edge cases in writing; from that confirmed scope, typical delivery is one working week. We develop and UAT on a staging copy of your database before go-live.
How do you handle support and updates after go-live?
Every engagement includes a post-go-live support window for defect fixes and configuration adjustments. Because you receive the full source and git repository, the module is yours to maintain; we also quote version-upgrade work (e.g. moving from Odoo 17 to 18/19) or new promotion types as a follow-on scope.
Does this work with Odoo Community, or do I need Enterprise?
We build for your exact edition. On Community we implement the promotions engine directly on `point_of_sale`; on Enterprise we can extend and interoperate with the existing `pos_loyalty`/promotions programs rather than duplicating them. We confirm which approach fits during scoping.
Will promotions apply automatically at the register?
Yes. The resolver evaluates all eligible rules against the live order and auto-applies the single best-value offer, so cashiers don't choose or key in manual discounts. Your stacking rules decide whether multiple offers may combine.
Can promotions run only during specific hours or days, like a happy hour?
Yes. Each rule supports a day-of-week mask plus start and end times, evaluated against the POS session clock, so a happy hour or daypart offer activates and deactivates on its own. An optional automated action can also open and close seasonal campaigns by date.
Which Odoo versions do you support?
Odoo 17.0, 18.0 and 19.0. Because the POS front-end framework differs across these versions, we build against the specific version you run and validate on a staging copy before production.
Can we get promotion data out for reporting?
Yes. Promotions and their applied discounts are ordinary Odoo records, reachable over the XML-RPC/JSON-RPC API, and each applied offer is rendered as an explicit discount line so receipts, Z-reports and BI tools can attribute every discount.
Related Modules

POS Pharmacy Management
A pharmacy-specific Odoo Point of Sale that enforces batch and expiry selection, captures prescription and doctor details, flags controlled substances, and handles insurance co-pay lines. ECOSIRE builds, installs, and supports it for Odoo 17.0, 18.0, and 19.0.

POS Product Multi Barcode
A build-to-order Odoo module that lets a single product carry many barcodes — supplier packs, legacy SKUs, unit and case codes — all resolving to the same product across POS, Sales, and Inventory. ECOSIRE builds, installs, and supports it after you request a quotation.

POS Quick Login & Keyboard Shortcuts
A build-to-order Odoo POS extension that adds PIN/direct cashier login, fully configurable keyboard shortcuts, and one-tap quick-action buttons to shave seconds off every transaction. ECOSIRE scopes, builds, installs, and supports it for you.
POS Promotions & Discount Engine
A rule-based promotions and discount engine for Odoo Point of Sale — BOGO, mix-and-match, happy-hour, bundles and quantity-tiered pricing that auto-apply the best eligible offer at the register. Built, installed and supported by ECOSIRE for your Odoo 17, 18 or 19.
- `promotion.rule` model storing trigger conditions, time windows, rewards and stacking flags as structured records — no hard-coded offers
- Buy-X-get-Y (BOGO) with the reward scoped to a specific product or entire `product.category`, including 'cheapest line free' resolution
- Mix-and-match promotions ('any 3 for the price of 2') evaluated across eligible lines rather than single products
- Time-windowed happy-hour pricing with a day-of-week mask plus start/end times, evaluated against POS session time
