For Airline Retailing Teams

The rules engine for Modern Airline Retailing.

Airlines are moving from PNRs and EMDs to Offers and Orders. Every step in that journey — eligibility, pricing, ancillary fees, fare conditions, taxation — is a business rule. RuleForge is the open-source engine that runs them, designed for the JSON-shaped, sub-millisecond, airline-controlled world that comes next.

Aligned with IATA Modern Airline Retailing

The IATA Modern Airline Retailing programme — Offers & Orders, NDC, ONE Order — defines the request shape in JSON Schema. The Offer is JSON. The Order is JSON. The Service, Bundle, Pax, Journey, and Price are all JSON. RuleForge consumes them exactly as the standard defines them — no ORM, no shred-and-rebuild, no schema drift.

Filter on $.passengers[*].type. Iterate over $.bundles[*].products[]. Look up tax rates by $.journey.origin. Mutate $.bundles[0].products[0].price. The rule speaks the same language as the request — and as the response envelope your downstream systems already consume.

Why this matters operationally. When IATA evolves the schema next quarter, you add the field to your producer and your consumer. The rule keeps reading the path it always read; new paths get added through the editor, not a code-deploy. No ALTER TABLE. No engine upgrade. No vendor ticket.

Built for Offer Management

An Offer Management System has to do three things at the speed of a shopping cart: assemble offers from many components, apply the right rules to each component, and hold the offer long enough for the customer to act. Every one of those operations is a sequence of rule evaluations:

Built for Order Management

An Order Management System needs to evaluate rules at every state transition: order creation, payment, ticket issuance, change, refund, no-show. RuleForge runs each one as an isolated evaluation with full trace — every decision is explainable, every version is pinned, every result is signed by the engine.

Common rule patterns, ready to compose

PATTERN 01

Eligibility filter

Chain string + number + date filters into an AND logic node, route to a product. fail ⇒ skip; pass ⇒ apply with the product as the result. Hide a bag offer when tier ≠ GOLD and fareUSD < 200.

PATTERN 02

Reference-set lookup

Pull rate from a versioned reference set (price matrix, FX table, country code). Apply markup with a calc node. The reference set lives in DocumentForge; new rates are a write, not a deploy.

PATTERN 03

Per-passenger tax

Iterate $.passengers; sub-rule call computes per-pax tax stack; merge with mode collect. The per-pax sub-rule has its own immutable version — change it without touching the orchestrator.

PATTERN 04

Tier-based uplift

Constant node seeds a product shell; mutator stamps paxId from $pax.id; calc applies a tier-based markup. Three nodes, three responsibilities, all explainable in the trace.

PATTERN 05

Multi-jurisdiction taxation

Reference node returns every applicable tax row for the route; iterate the rows; product node emits one tax line per row; merge with mode sum on $.amount for the total.

PATTERN 06

Hierarchical fare conditions

Sub-rule per condition family (changes, refunds, baggage). Output mapping merges each family's verdict onto a single fare-conditions object the offer can carry verbatim.

Your data, your control

RuleForge is a single binary running in a process you own, on a machine you own, in a datacenter you control. The rule snapshots live in DocumentForge — also yours. There is no vendor cloud, no per-evaluation pricing, no opaque license audit risk, no hostage data. Open the rule file with our binary or any other tool you write — it is yours.

The same engine runs in your laptop sandbox, your staging environment, your production region, and your DR site. The same JSON rule that fires in dev fires byte-identical in prod. No drift between authoring tool and runtime; the engine evaluates the file exactly as it was published.

Governance & audit, built in

Every rule is an immutable versioned snapshot. The engine resolves endpoint + method → ruleId → version → snapshot at boot and on every change. Environment pinning is explicit — staging can run v8 while production stays on v7 until QA signs off.

A 5ms budget. We use 70µs.

The IATA MAR latency brief targets <5ms for a typical rule evaluation. RuleForge clears it by 70× on a single laptop:

WorkloadLatency p50Throughput
8-node rule, warm steady-state70µs73K eval/s @ 16 workers
Sub-rule call (in-process)+12µs per call
Cold path (rule fetch + parse)~2.5mscached after first call
Reference-set lookup (cached)<5µs

Production mode skips trace and duration tracking entirely. Sub-rule snapshots are cached indefinitely (immutable per version). Rule resolution is cached for the lifetime of the process — change a binding and the engine picks up the new version on next boot.

When RuleForge fits

Yes — strong fit

You own an Offer or Order System

You're building or running an OMS / ORM, an ancillary engine, a tax engine, a fare-rules engine, an eligibility engine. Anywhere business logic is a graph of filters / lookups / calcs / sub-rules — RuleForge is the runtime.

Yes — strong fit

You're replacing a closed engine

You're migrating off a proprietary rules / decision engine and you want to keep the rules in a format your team can read, fork, and extend. RuleForge ships the runtime; pair it with whatever editor you prefer (or build one).

Yes — strong fit

Your domain is rule-shaped

Rules engines aren't airline-only. Insurance pricing, mortgage eligibility, telco plans, content moderation, feature flagging — anywhere business logic lives in a directed graph, RuleForge runs it. Airlines are the canonical use case, not the only one.

Maybe — talk to us

You need a workflow engine

RuleForge is a runtime rules engine, not a long-running BPMN workflow. If your workload is "given a request, compute a verdict + result", that's us. If your workload is "wait three days for a customer signature", that's something else — though sub-rules + an external scheduler can compose.

Next step

The fastest way to know if RuleForge fits is to try it. Five minutes from binary download to first envelope:

Open the Quickstart