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 $249.00 USD; request a quote for a scoped proposal.
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.
No DIY setup — a working app, built, installed and supported by ECOSIRE.
Start with a one-time build price. We scope it with you at kickoff.
ECOSIRE builds, configures and installs it on your Odoo.
You go live in about 2–4 weeks, with a post-launch support window.
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 2 to 4 weeks: 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.
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.
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.
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.
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.
| 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 — 2-4 weeks | Full dev, QA and maintenance burden in-house | Install fast but bend your process to the module | Free but manual workarounds daily |
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 2 to 4 weeks. We develop and UAT on a staging copy of your database before 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.
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.
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.
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.
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.
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.

A build-to-order Odoo localization that loads Algeria's full wilaya and commune hierarchy with bilingual French and Arabic names, wired into partner addresses and reporting. ECOSIRE builds, installs, and supports it after your quotation.



A build-to-order Odoo module that lets you render any accounting report — P&L, Balance Sheet, aged reports, journals, trial balance — in a currency of your choice, with automatic conversion at the rate you define. ECOSIRE scopes, builds, installs and supports it for your Odoo 17/18/19 environment.
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.