Skip to main content
POS Promotions & Discount Engine — A rule-based promotions and discount engine for Odoo Point of Sale — BOGO, mix-and-match,  — 1/1Illustrative preview

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.

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

`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
Quantity-tiered discounts (e.g. 5% at 3 units, 10% at 6) computed per line via `@api.depends` on order quantities
Category-level percentage or fixed-amount discounts driven by `product.category` membership
Bundle pricing that overrides the combined price of a defined product set below the line-item sum
Auto-apply resolver that selects the single best-value eligible promotion so cashiers never pick manually
Configurable stacking rules — exclusive, additive, or priority-ordered — to control coupon/voucher combination
Coupon and voucher stacking policy that governs interaction with existing `pos_loyalty` programs on Enterprise
OWL/JS POS front-end extension applying and re-pricing offers live on the order screen, offline-capable within the session
Applied-offer discount line rendered explicitly so QWeb receipts and Z-reports attribute every discount
`ir.model.access.csv` + record rules so managers author rules and cashiers only consume them
Optional `ir.cron`/automated action to activate and expire seasonal campaigns by date without manual toggling
Promotion records reachable over XML-RPC/JSON-RPC for external reporting or campaign automation

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your Odoo.

  3. 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

CriterionECOSIRECustom BuildCompetitorOdoo Native
BOGO / mix-and-matchCategory-scoped BOGO and mix-and-match built to your rulesPossible but you specify and test every case yourselfOften single-product BOGO only, limited category logicNo true BOGO; manual per-line discount only
Happy-hour / time windowsDay-of-week mask + start/end times, auto on/offBuildable, but scheduling logic is on youRarely time-windowed; needs manual price-list swapsNo native time-window pricing at the register
Best-offer resolutionDeterministic resolver applies the single best-value offerYou design and validate the tie-break logicOften first-match or manual selectionCashier decides manually, error-prone
Stacking controlExclusive / additive / priority rules you defineFully custom but unspecified until you build itLimited or all-or-nothing stackingNo structured stacking policy
Edition & version fitBuilt for your exact edition and Odoo 17/18/19Depends on your team's version expertiseMay lag new Odoo releases or edition gapsEnterprise loyalty gaps; Community even thinner
Security & auditRecord rules + explicit discount lines on receipts/Z-reportYou implement access rules and audit trailVaries; audit trail often shallowManual discounts are hard to audit
Support & handoverSource + git repo, training, post-go-live support windowOnly what your team documentsVendor support tiers, no bespoke fitCommunity help only, no tailored support
Total effort to youScope call, then we build/UAT/train — one working weekFull dev, QA and maintenance burden in-houseInstall fast but bend your process to the moduleFree 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.

Request a quote

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

Request a Quotation

Tell us about your POS Promotions & Discount Engine requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.