Home / Blog / Industria / Odoo airline loyalty
IndustriaLATAM

Odoo airline loyalty: an open-source frequent-flyer stack for LATAM

IBS iLoyal costs USD 2–8 million.
For LATAM LCCs and regionals (Wingo, JetSMART, Plus Ultra) Odoo covers 60–70% of the stack at 5–10% of the price.
Architecture, IFRS 15, PCI, GDS and a CIS case with +22% retention.

Sergei Filatov
Sergei FilatovFounder · data-metrics.pro · May 26, 2026
◷ 13 min read

Why airline miles are debt, not marketing

Frequent flyer programs are not a tiny rewards card. They are financial products with their own P&L, their own audit, and their own accounting trap. LATAM Pass, Smiles, LifeMiles and AeroMéxico Rewards together hold over 100 million accounts and contribute up to 40% of operating profit at their parent carriers. Anyone who books them as a marketing expense ends up with a broken balance sheet and a qualified opinion from the Big-4 audit.

American Airlines invented AAdvantage in 1981 to sell empty seats. Forty-five years later, miles are a financial instrument: airlines sell them in bulk to banks for co-brand cards, to hotels for reward redemption, and to retailers for cross-sell programs. The carrier no longer earns only by moving aircraft; it earns by managing a parallel currency with breakage rates, conversion tables and contractual liabilities.

The technical consequence is direct. Under IFRS 15, in force in every LATAM jurisdiction since January 2018, every issued mile must be booked as a contract liability. It is not a methodological choice; it is regulation. Carriers that ignore it learn what it costs: SAT, SUNAT, DIAN and AFIP reclassify revenue recognition and reopen entire fiscal years.

None of this is news for top-tier carriers. The interesting question sits one tier down: the LATAM LCCs, regionals and cargo operators that do not have a loyalty engine — what architecture do they use to comply? The short answer: open-source Odoo covers 60–70% out of the box and the rest gets built. The long answer fills this article.

The LATAM market: four big names, then nothing

Above the line, four programs concentrate roughly 90% of the miles issued in the region:

  • LATAM Pass (Chile, Peru, Colombia, Brazil, Ecuador, Argentina): about 40 million members. Moved to revenue-based accrual in 2022 — miles are computed on USD spent, not on distance flown.
  • Smiles (Brazil, inside GOL): listed as Smiles Fidelidade S.A. on the B3 in 2013, delisted and folded back into GOL in 2021. Fully operationally integrated after the group's restructuring.
  • LifeMiles (Avianca; legal domicile in Panama): around 12 million members. Sells miles to Citibanamex, Bancolombia and BCP, among others.
  • AeroMéxico Rewards (formerly Club Premier, rebranded after the 2020–2022 bankruptcy): about 7 million members. Main partners: American Express México and Banamex.

Below the top four, the landscape shifts. Viva Aerobus moves roughly 24 million passengers a year and launched Doters in 2022 — a basic program with no real CRM integration. Volaris runs V.Club, which is a discount subscription, not a classic FFP. Sky Airline in Chile launched Sky+ in 2023 with minimal functionality. JetSMART operates JetSMART Smart Club as a subscription, with no mileage-based earning. WingoPlus Ultra and Star Peru have no functional FFP. Aerolíneas Argentinas Plus still sits on Comarch with no public API.

Add up LCCs, regionals and cargo, and roughly 150 LATAM operators either have no loyalty program at all, or run a raw subscription with no accrual, no partner network and no member portal. That is the gap Odoo fills: implementations between USD 25,000 and USD 80,000 against the USD 1.5 million to USD 8 million price tag of enterprise platforms (IBS iLoyal, Sabre Loyalty, Comarch FFP, Loylogic).

#1. Regulatory timeline for 2025–2026

Five fiscal changes relevant to airline loyalty land in the next twelve months. Each one touches the miles ledger in a different way.

Date Jurisdiction Change Loyalty impact
2018-01 LATAM-wide IFRS 15 in force Mile = deferred revenue, not marketing expense
2024-09 Argentina (AFIP → ARCA) Resolución 5616/2024 Miles separated from sales revenue, dedicated ledger
2025-11 Colombia (DIAN) Factura electrónica v2.0 Mile redemption shown as separate line on the e-invoice
2026-01 México (SAT) CFDI 4.0 real-ops Partial mile payment booked as standalone descuento
2026-04 Perú (SUNAT) CPE under Resolución 000040-2025 Mile-redeemed ticket = CPE with a special concept código

The IFRS 15 core is brutally simple: when a ticket is sold, the transaction price splits between two obligations — transporting the passenger and providing miles for a future trip. The miles portion gets an estimated fair value — typically 0.8 to 2.5 USD-cents per mile, depending on the program and the redemption category — and is deferred on the balance sheet as a contract liability. When the mile redeems, that portion flows to revenue. When it expires unused, the actuarial breakage rate releases it.

!
A LATAM LCC that books miles as a marketing expense today is recognizing revenue it has not yet earned. The day the Big-4 audit notices — and it does notice — the retroactive adjustment can push deferred revenue on the balance sheet up by 4% to 11% of annual revenue. That is the moment the qualified opinion shows up, the bank covenants trip, and the conversation with the CFO stops being about Odoo and starts being about the year-end audit.

What Odoo covers out of the box, and what it does not

Odoo 18 — and version 19, released in October 2025 — ships a stack that covers most of an airline loyalty workflow. What is missing is the part that separates an airline from a retailer: route-based calculation, GDS integration, fiscal localization and actuarial revaluation of the liability.

#1. Base modules that ship by default

The loyalty module (Community and Enterprise) handles loyalty programs, cards, points, gift cards, ewallet, discounts, coupons and promo codes. Multi-tier is modeled with loyalty.rule plus condition expressions. Native reward types include percentage and flat discount, free product and free shipping. Multi-company and multi-currency are baked into the core.

The accounting stack (saleaccount) creates the sale order with a loyalty-card discount and records redemption as a journal entry. Deferred revenue runs on account.deferred.revenue (Enterprise module account_asset_management).

The member portal ships out of the box via websiteportal: balance, history, redemption, tier status, benefits. The member signs up through the website signup flow. Member profile lives in res.partner with custom fields for tier, anniversary and preferred airport. The hierarchy partner → corporate account → travel agency is the one Odoo already uses for B2B.

#2. Functionality that comes for free

  • Mile accrual on ticket sale through sale.order.line with a loyalty rule
  • Redemption on ticket purchase as a discount line
  • Tier progression based on qualifying miles, run by cron with a custom field
  • Cron-based expiration — no activity in X months, miles burn
  • Self-service portal: balance, history, tier benefits
  • Multi-currency with FX-conversion to USD for the global ledger
  • Multi-company for alliances where several legal entities share the program
  • Tier benefits via product.product records with conditional pricing

#3. Functionality that needs to be built

The following is not shipped and always — always — turns into the bulk of the project:

  1. Route × RBD × tier multiplier calculation. A custom flight_loyalty_calculation module, a lookup table for route distance (sourced from OAG, IATA or manually), a booking class (RBD) multiplier, plus tier and promo multipliers. Four to six weeks of development depending on fare matrix complexity.
  2. GDS and PSS integration. Amadeus Soaring (REST), Sabre Web Services (SOAP/XML), Travelport Universal API, Hitit Crane PSS (popular among LATAM LCCs), Navitaire New Skies (Accelya). The standard middleware is Kafka plus a dedicated worker for real-time accrual.
  3. PCI-compliant co-brand credit cards. Tokenization (Visa Token Service, Mastercard MDES), PCI DSS scope segmentation — PAN never touches Odoo — and daily settlement per issuer (Visa Direct, Mastercard Send).
  4. Fiscal localization for miles. l10n_pe for CPE under SUNAT Resolución 000040-2025 with a special mileage payment code; l10n_mx for CFDI 4.0 with discount as a separate line; l10n_co for DIAN with redemption as a separate item; l10n_ar for AFIP/ARCA with a loyalty comprobante.
  5. Actuarial revaluation of the deferred liability. Recalculate breakage rate quarterly, adjust fair value when the award chart changes, leave it all audit-ready for Big-4. Skip this and the qualified opinion is waiting.
  6. B2B partner settlement. Banks that buy miles in bulk for co-brand, hotels that buy miles for guest rewards, monthly settlement, invoice, FX-conversion. This is the first module regional airlines underestimate.
  7. RFM segmentation and propensity-to-churn models. Recency-Frequency-Monetary, ML models (XGBoost, LightGBM), integration with marketing automation (Mautic, ActiveCampaign, Mailgun). Usually left for phase 2, which is fine.

When Odoo works, and when it is out of its league

The simple rule: Odoo fits carriers up to about 5 million members and around 200 transactions per second. Above that, the choice is hybrid architectures or enterprise platforms.

#1. Yes — LCC and regionals up to 5M members

The typical architecture: Odoo Community or Enterprise plus four custom modules (flight_loyalty_calculationpnr_integrationdeferred_milespartner_settlement) plus PSS middleware (Kafka + worker) plus l10n_{cc} localization. Cost: USD 35,000 to USD 80,000 initial plus USD 1,500 to USD 3,000/month for support.

Carriers where this path is worth evaluating: Wingo Rewards (Colombia, ~5M passengers/year), JetSMART Loyalty (Chile, Argentina, Peru, ~9M) if they migrate from subscription to mileage, Plus Ultra Peru to build an FFP from scratch, and the cargo loyalty programs of Aerolíneas Cargueras Argentinas or LATAM Cargo. Supported throughput: up to 200 TPS, up to 5M members and 100M miles/year accrued — assuming PostgreSQL is tuned right (partitioning by member_id range, materialized views for daily aggregates).

#2. Hybrid — Odoo as back-office for mid-tier

For carriers between 5 and 20 million members (Avianca, Copa, AeroMéxico, Volaris once it matures), the sane architecture is hybrid. Odoo keeps HR, finance, partner relations and IFRS 15 deferred revenue accounting. The front-office loyalty engine is sourced externally: Comarch FFP (the legacy LATAM choice), PROS Loyalty (newer SaaS), Loylogic (premium) or Sabre Loyalty for carriers already on Sabre PSS. Integration via REST API. Cost: Odoo USD 60,000 to USD 120,000 plus loyalty engine license USD 200,000 to USD 800,000/year.

The cutoff is throughput and uptime: 500 to 2,000 TPS, 99.99% availability on the member portal 24/7, and contractual SLAs with partners that no longer tolerate maintenance downtime.

#3. No — top-tier 30M+

LATAM Group post-restructuring and AeroMéxico post-Delta JV are out of scope for Odoo as a loyalty engine: 30 million members or more, sustained throughput above 2,000 TPS, partner-accrual schemes cross-wired between alliances (SkyTeam, oneworld) with inter-carrier offsets, strict alliance-level SLAs, and 24/7 multi-region failover. IBS iLoyal, Sabre Loyalty, Lufthansa Systems FMS or Amadeus Altéa Customer Management Suite own this tier. Odoo can stay in finance — where IFRS 15 lives — but not as loyalty core.

Six mistakes that wreck an Odoo loyalty rollout

The mistakes below appear in order of frequency. The first three are accounting and break the balance sheet; the last three are operational and break trust with members or partners.

#1. Booking miles as marketing expense

What breaks. The balance sheet understates liabilities and the P&L overstates revenue. The Big-4 audit issues a qualified opinion. SAT, SUNAT, DIAN or AFIP, when they review, reclassify hidden revenue and apply the retroactive adjustment.

What works. On accrual: Dr Sales / Cr Contract liability at fair value (0.8–1.5 USD-cents typical). On redemption: Dr Contract liability / Cr Revenue. Quarterly revaluation of the contract liability against actuarially-calculated breakage.

#2. No segregation of miles by state

What breaks. Partner reporting lies. Citibanamex, Bancolombia and BCP pay for earned-not-redeemed. If the ledger does not distinguish earnedredeemedexpired and bonus, the calculation is wrong and 8% to 15% of monthly partner-channel revenue is left on the table.

What works. Add a status field on the loyalty.card line plus an audit log through mail.thread. All mile operations go through a service layer — no direct loyalty.card.write().

#3. Manual or missing tier downgrade

What breaks. A member who qualified for Premium a year ago and only flew twice this year should drop to Silver. With no cron, they keep seeing "Premium" in the portal while benefits fail at the gate — or the other way around. NPS drops 15 to 25 points on that cohort.

What works. A monthly cron: recompute qualifying-miles on a rolling 12-month window, compare against the threshold, execute upgrade or downgrade, fire a notification. Message to the member: "Dear [name], this year you flew X miles; your level for next year is [tier]". No surprises at the gate.

#4. Partner settlement in Excel

What breaks. Banks and hotels expect a monthly invoice for mile purchases. Manual calculation runs 5 to 7 days and leaves 8% to 12% error from FX conversion mistakes and cutover mismatches. Collections drag, and worse, partners stop trusting the numbers.

What works. A partner_mile_settlement module: month-end cron pulls every mile purchase per partner, generates the invoice via account.move, sends the PDF via mail.message. Time: 1.5 days instead of 5–7.

#5. PCI compliance broken on co-brand cards

What breaks. If Odoo handles a PAN directly, the airline lands in PCI DSS scope. Visa and Mastercard fines run from USD 5,000 to USD 100,000 per month, and severe cases lose the merchant agreement. Co-brand card issuance pauses and loyalty collapses with it.

What works. Token-based storage. Card data never touches Odoo: an external vault (Stripe, Adyen, Cybersource, Kushki, Mercado Pago) issues a token; Odoo stores token + last 4 + brand only. Daily settlement arrives as a batch import of journal entries.

#6. No expiration policy

What breaks. Legacy carriers sometimes "forget" to burn inactive miles. That inflates the deferred revenue liability — and when Big-4 audits the actual breakage rate, it reclassifies revenue to the current period and blows up the close.

What works. Explicit policy: a mile expires after 36 months of inactivity and reactivates on ticket purchase. Cron job plus notifications at 60, 30 and 7 days from expiry. No surprises for the member, no surprises for the audit.

A CIS airline case: +22% retention, –68% on settlement

Anonymized client: flag carrier in a CIS market, around 10 million registered members, legacy program on Comarch FFP through 2017. Q4 quarterly churn: 15%. Partner settlement: manual, 5 to 7 days. IFRS 15 misaligned with local GAAP. A qualified opinion from the audit hanging in the air.

The project ran from 2017 through 2019 across five parallel workstreams.

The core member ledger migrated to Odoo with a custom loyalty_miles module. PostgreSQL partitioning by member_id range; materialized view for daily aggregates; a covering index on (member_id, accrual_date) that pushed portal queries to under 80ms p95.

The IFRS 15 deferred revenue stack ran on account.deferred.revenue with a custom rule. On accrual: Dr Sales at a fair value near USD 0.012/mile, Cr Contract liability. Quarterly breakage revaluation against an actuarial model fed by years of history.

The RFM segmentation came from three materialized views — Recency (days since last flight), Frequency (flights in 12 months), Monetary (USD spent) — with a Champion-to-Lost sieve across seven buckets. Those segments fed a behavioral triggers layer: e-mail + push after 30 days of inactivity (win-back), 90 days (personalized award), tier downgrade detected 60 days out (retention bonus). The propensity-to-churn model ran on XGBoost under Airflow, refit weekly.

Finally, partner settlement was automated: monthly cron, REST API into banks and hotels, invoice generated on the first of the month.

Results, twelve months after go-live:

  • +22% in retention Q1–Q4 against the prior fiscal year
  • 68% in settlement time (5–7 days → 1.5 days)
  • IFRS 15 compliant, qualified opinion removed at the next close
  • Mile redemption rate rose from 12% to 18% — the mile shifted from ballast to live currency
The fight was not building the ledger. The fight was convincing planning that the mile was a liability, not a marketing lever.

The architecture ports to LATAM mid-tier with three adaptations: real multi-currency (USD primary plus COP, MXN, PEN, CLP, ARS, BRL running in parallel), full fiscal localization (CFDI 4.0, CPE SUNAT, DIAN factura electrónica, AFIP comprobante), and PCI scope for co-brand cards. For LCCs and regionals (Viva, JetSMART, Wingo, Plus Ultra, Star Peru) the architecture simplifies — fewer partners, fewer tiers, lighter RFM — but the base stack (Odoo + deferred revenue + RFM + retention triggers) is exactly the same. Conceptually adjacent to the QIC data warehouse case: an analytical layer over a well-partitioned transactional core.

Closing and where to dig deeper

The conclusion is uncomfortable for legacy carriers and obvious for regionals: airline loyalty is a financial product with its own P&L, and most of the LCC LATAM market is treating it like a brochure. The top tier has already spent millions on IBS, Sabre and Comarch. In the Viva, Wingo, JetSMART, Plus Ultra, Star Peru and cargo tier — most of LATAM's operators — there is a gap that open-source Odoo closes at 5% to 10% of the enterprise platform cost.

The CIS case shows the Odoo + PostgreSQL + RFM + IFRS 15 architecture lifts retention by 22% when it is tuned right. The principles port to LATAM with corrections for multi-currency and fiscal localization.

To go deeper:

If you are a CFO, Head of Loyalty or CIO at a regional LATAM carrier and you want a specific read on your deployment, request a 30-minute Odoo audit or read the author profile first.

Frequently asked questions

Can Odoo replace IBS iLoyal at a top-tier carrier?

No. IBS iLoyal handles more than 5,000 transactions per second, ships native integrations with every GDS, and includes built-in actuarial models for liability revaluation. Odoo fits up to about 5 million members and 200 TPS. For LATAM Group or post-bankruptcy AeroMéxico the read is: stay on iLoyal, Sabre Loyalty or Comarch and use Odoo only as accounting back-office for IFRS 15 deferred revenue.

How does Odoo integrate with Amadeus or Sabre?

Through REST API for Amadeus Soaring and Travelport, and legacy XML for Sabre Web Services. Real-time accrual is possible but not native — middleware is required, typically Kafka plus a dedicated worker. For LCCs running Hitit Crane or Navitaire New Skies the REST integration is simpler, usually four to eight weeks of work depending on fare matrix complexity.

How do you configure IFRS 15 deferred revenue in Odoo?

On top of account.deferred.revenue (Enterprise module account_asset_management) plus a custom rule: on accrual, the deferred entry is created at the estimated fair value of the mile. Typical fair value runs 0.8 to 2.5 USD-cents per mile depending on the program. Quarterly breakage revaluation lands around 15% to 25% for LCCs and 8% to 12% for top-tier carriers. No actuary, no signed close.

Is Odoo PCI DSS compliant for co-brand cards?

Only in out-of-scope mode: card data must never touch Odoo. Tokenization runs in an external provider (Stripe, Adyen, Cybersource, Kushki, Mercado Pago) and Odoo stores only token + last 4 + brand. For co-brand with Visa Token Service or Mastercard MDES the token vault sits on the issuer side. Any other architecture pushes you into full PCI scope, with everything that costs.

What does an Odoo loyalty rollout cost for an LCC?

Between USD 35,000 and USD 80,000 initial plus USD 1,500 to USD 3,000/month for support. For comparison: Comarch FFP starts at USD 250,000 to USD 500,000 initial plus USD 40,000 to USD 80,000/month; Loylogic and PROS Loyalty between USD 400,000 and USD 1.5 million; IBS iLoyal between USD 2 million and USD 8 million initial plus around USD 500,000/year in license. The delta pays for the custom development several times over.

How do you configure tier benefits in Odoo?

With loyalty.rule plus a custom loyalty_tier module that runs auto-upgrade and auto-downgrade by cron. Benefits are modeled as product.product records with tier-conditional pricing — free upgrade for Premium, lounge access for Gold, extra baggage for Silver. The monthly cron recalculates qualifying-miles, updates the tier and fires the notification.

How do co-brand credit cards integrate?

Through issuer APIs (Visa Direct, Mastercard Send) for real-time mile crediting. Token storage runs in a PCI-compliant external vault. Daily settlement arrives as a batch import of journal entries into Odoo. Typical LATAM partner banks: BCP in Peru, Citibanamex and Banamex in Mexico, Bancolombia in Colombia, BBVA cross-country, Itaú in Brazil, Santander cross-country.

How often should breakage rate be revalued?

Quarterly, aligned with the fiscal close. The Big-4 audit expects an actuarial model fed by at least 24 months of history, with confidence bands and a sensitivity analysis on award-chart changes. Any material pricing or rules change — for example, a mile-value devaluation in a market — triggers an off-cycle revaluation.