Skip to main content
Hotel POS & Room-Charge (Folio Post) — Post hotel F&B, bar & spa POS charges to the guest's room folio for one clean checkout — 1/1Illustrative preview

Post hotel F&B, bar & spa POS charges to the guest's room folio for one clean checkout settlement.

Built for Odoo 17/18/19.

What is Hotel POS & Room-Charge (Folio Post)?

Post hotel F&B, bar & spa POS charges to the guest's room folio for one clean checkout settlement. Built for Odoo 17/18/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

Room Charge tender on the POS payment screen — cashier posts an order to a guest folio instead of taking cash or card at the outlet
In-house guest and room lookup directly at the POS (search by name, room number, or booking reference) with only currently-checked-in guests selectable
Outlet tagging on every charge (restaurant, bar, spa, room service, minibar) so each line is attributable to its revenue center
Live folio balance via computed fields (@api.depends) that roll up all posted charges, payments, and adjustments in real time
One-tap checkout settlement at the front desk — every outlet charge is pre-posted, so the guest pays one balance across all payment methods
Per-outlet revenue posting: each outlet maps to its own income account / analytic tag, so room-charged sales land in the correct ledger for night audit
Itemized folio statement as a QWeb PDF report the front desk can print or email at checkout, grouped by outlet and date
Charge transfer and split between folios (e.g., move a bar tab to a group master folio, or split a table across two rooms)
Record-rule security so bartenders/servers can post but only front-desk / night-audit roles can settle, void, or transfer folio charges
PMS folio push over XML-RPC / JSON-RPC (or your PMS REST API) with idempotent posting and a retry queue to prevent double-charges on network drops
Credit-limit and posting guardrails per rate/guest type — block or warn when a room charge would exceed the allowed folio limit
Automated actions and audit logging that stamp who posted, voided, or transferred each charge, with an immutable trail for night audit
Configurable posting date rules (business date vs. calendar date) so late-night charges land in the correct audit day
Multi-outlet, multi-currency, and multi-company aware, aligned to how Odoo POS sessions and companies are already structured
Optional tip / service-charge handling that flows through to the folio and the correct payroll or income account

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

Your restaurant, bar, and spa are earning money all day — but if every outlet settles on its own POS terminal, the guest ends up paying five times and your night auditor reconciles five reports by hand. Hotel POS & Room-Charge (Folio Post) closes that gap. It extends the standard Odoo Point of Sale so a cashier can look up an in-house guest, pick their room, and post the order straight to that guest's folio instead of tendering cash or card at the outlet. At checkout, every F&B, minibar, and spa charge is already sitting on the folio, ready for a single settlement.

This is a build-to-order Odoo module — not an instant download from apps.odoo.com. ECOSIRE designs, builds, installs, and supports it against your property's workflow: your outlets, your PMS or folio model, your posting accounts, and your Odoo edition. Typical delivery is one working week from a scoped kickoff.

Under the hood we add a "Room Charge" payment method to pos.payment.method and a new folio-posting flow built on Odoo's ORM. When a cashier selects Room Charge, an OWL screen extension lets them search in-house guests and rooms; on order validation the module writes a folio line (a custom hotel.folio.line model, or a mapped record in your existing PMS model) linked to the pos.order, stamped with the outlet, the guest, the room, and the posting date. Compute fields (@api.depends) keep the running folio balance live, and a QWeb folio report gives the front desk and the guest an itemized statement at checkout. Access is locked down with ir.model.access.csv plus record rules so a bartender can post to a folio but can't reopen a settled one, and only front-desk or night-audit roles can settle or transfer charges.

Per-outlet revenue posting keeps your accounting clean: each outlet (restaurant, bar, spa, room service) maps to its own analytic tag / income account, so room-charged revenue lands in the right ledger and your night audit balances without spreadsheet gymnastics. Where you run a separate PMS, we wire the folio push over XML-RPC / JSON-RPC (or your PMS's REST API) with idempotent posting and a retry/queue so a dropped network call never double-charges or silently loses a check. Everything is delivered as clean, upgrade-safe module code you own, tested on Odoo 17, 18, and 19, Community or Enterprise.

What you get

  • Complete, upgrade-safe Odoo module (source code you own) with __manifest__.py declaring Odoo 17/18/19 compatibility and correct dependencies (point_of_sale + your PMS/folio module)
  • Configured Room Charge payment method, outlet-to-account mapping, record rules, and ir.model.access.csv security tuned to your property's roles
  • PMS / folio integration wiring (XML-RPC, JSON-RPC, or REST) with idempotent posting, retry queue, and a mapping document for your booking and folio models
  • QWeb folio statement report and any POS receipt tweaks, styled to your brand and itemized per outlet
  • Installation and deployment on your Odoo environment (staging first, then production) with a smoke-tested end-to-end charge-to-settlement run
  • Admin and cashier documentation plus a recorded or live training session for front-desk, F&B, and night-audit staff
  • A defined post-go-live support window (bug fixes and adjustments) with an SLA, plus a compatibility check when you upgrade Odoo versions
  • Handover package: technical README, test checklist, and a config export so your team can re-deploy or extend the module

Who this is for

F&B / Outlet Manager

Runs the restaurant, bar, and spa POS outlets. Wants staff to post guest charges to rooms in seconds without leaving the POS, and wants each outlet's revenue to show up cleanly under its own center — not lumped into a single anonymous cash drawer.

Front-Desk & Night Audit Lead

Owns checkout and the daily balance. Needs every outlet charge already sitting on the folio so checkout is one settlement, and needs an itemized, tamper-evident statement and a night audit that ties out without manual reconciliation across five POS reports.

Hotel IT / Systems Manager

Responsible for the Odoo and PMS stack. Wants a maintainable, upgrade-safe module that integrates over documented APIs, respects role-based security, and won't double-post or lose charges when the network hiccups between the outlet and the PMS.

Hospitality Group Controller / Owner

Oversees revenue and margins across properties. Wants accurate per-outlet revenue posting into the right ledgers, credit-limit guardrails on room charges, and a clean audit trail for every posted, voided, or transferred charge.

How Hotel POS & Room-Charge (Folio Post) Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
Posts POS charges directly to the guest room folioYes — Room Charge tender writes a folio line linked to the pos.order, guest, room, and outletPossible, but you design and maintain the whole flow yourselfSometimes, but tied to that vendor's folio assumptions and rarely to your PMSNo — Odoo core POS tenders cash/card/customer account, with no room-folio concept
Per-outlet revenue posting to the correct ledger/analytic accountYes — each outlet maps to its own income account / analytic tag for clean night auditOnly if you build the mapping and posting logicOften one generic POS account; per-outlet mapping usually not configurableNo — POS revenue posts without hotel outlet segmentation
Fits your exact PMS / folio model and workflowYes — scoped to your outlets, folio objects, roles, and posting accounts before we buildYes, but you own all the analysis, build, and reworkNo — you adapt your process to the module's fixed designNo
Role-based security (post vs. settle/void/transfer)Yes — ir.model.access.csv + record rules split outlet-staff and front-desk/night-audit rightsYou must design and test every rule yourselfBasic groups only; rarely folio-lifecycle awareGeneric POS access groups, no folio settlement controls
Safe PMS posting (idempotent, retry, no double-charge)Yes — idempotent posting with a retry queue over XML-RPC/JSON-RPC or RESTYou build and harden the integration and failure handlingVaries; failure modes often undocumentedNo PMS posting exists to make safe
Ownership, upgrade-safety across Odoo 17/18/19, and supportYou own the code; built and tested on 17/18/19 with a support window and upgrade checksYou own it but carry all maintenance and version risk aloneVendor-controlled; upgrades and fixes depend on their roadmapMaintained by Odoo, but the feature simply isn't there
Delivery modelBuild-to-order — ECOSIRE builds, installs, trains, supports (one working week)In-house or agency project you manage end to endInstant install, but as-is and genericAlready installed, but no room-charge capability

Frequently Asked Questions about Hotel POS & Room-Charge

How long does delivery take, and what's the process?

This is a build-to-order module, not an instant download. Typical delivery is one working week from a scoped kickoff. We start by mapping your outlets, folio/PMS model, posting accounts, and roles; build and test on a staging environment against Odoo 17, 18, or 19; then install to production with an end-to-end charge-to-settlement smoke test and staff training. Complex multi-property or custom-PMS integrations may extend the timeline, which we confirm in writing before we begin.

What support and updates do I get after go-live?

Every build includes a defined post-go-live support window with an SLA for bug fixes and adjustments. Because you own the module source, you're never locked in. When you upgrade your Odoo version, we provide a compatibility check and, if needed, a migration pass. Ongoing enhancements and extended support are available under a maintenance agreement that we scope with you.

Does this work with my existing PMS, or only with Odoo's folio?

Both. If you manage folios inside Odoo, we post to a native folio model. If you run a separate PMS, we push charges over XML-RPC / JSON-RPC or your PMS's REST API, with idempotent posting and a retry queue so a network drop never double-charges or loses a check. During scoping we map your booking and folio objects; if your PMS lacks a usable API we'll tell you up front rather than promise an integration we can't deliver.

Which Odoo versions and editions are supported?

Odoo 17, 18, and 19, on both Community and Enterprise. The module extends the standard Point of Sale app, so it works with Odoo's core POS on Community and with Enterprise POS features where you run them. We build and test against your exact edition and version, and the __manifest__.py declares the supported series so upgrades stay predictable.

How do you stop staff from charging the wrong room or posting to a settled folio?

Guest and room lookup at the POS only lists currently checked-in guests, so a cashier can't post to an empty or checked-out room. Security is enforced with ir.model.access.csv and record rules: outlet staff can post charges, but only front-desk and night-audit roles can settle, void, or transfer them, and a settled folio can't be silently reopened. Optional credit-limit guardrails block or warn when a charge would exceed the allowed folio balance, and every action is stamped in an audit log.

How does per-outlet revenue actually post to accounting?

Each outlet (restaurant, bar, spa, room service, minibar) maps to its own income account and/or analytic tag during setup. When a POS order is room-charged, the folio line carries that outlet tag, so revenue lands in the correct ledger and analytic reporting — not in a single undifferentiated POS account. This lets your night audit tie out per revenue center and gives your controller accurate outlet-level margins without spreadsheet cleanup.

Can charges be split or transferred between rooms and group folios?

Yes. The module supports transferring a charge from one folio to another (for example, moving a bar tab onto a group master folio) and splitting a single check across two rooms. Transfers and splits are restricted to authorized roles and are recorded in the audit trail, so the movement of any charge is always traceable at night audit and checkout.

Request a quote

Hotel POS & Room-Charge

Post hotel F&B, bar & spa POS charges to the guest's room folio for one clean checkout settlement. Built for Odoo 17/18/19.

  • Room Charge tender on the POS payment screen — cashier posts an order to a guest folio instead of taking cash or card at the outlet
  • In-house guest and room lookup directly at the POS (search by name, room number, or booking reference) with only currently-checked-in guests selectable
  • Outlet tagging on every charge (restaurant, bar, spa, room service, minibar) so each line is attributable to its revenue center
  • Live folio balance via computed fields (@api.depends) that roll up all posted charges, payments, and adjustments in real time

Request a Quotation

Tell us about your Hotel POS & Room-Charge 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.