Cutting ADM Penalties with an Automated Booking Cancellation Service
A background service that automatically cancels un-ticketed bookings before the last ticketing time, saving ~$23K-$27K across 6 OTA clients.
The Problem
Airlines charge Agency Debit Memo (ADM) penalties when a travel agency holds a booking past the last ticketing time without issuing a ticket. Across the OTA platforms I supported, un-ticketed bookings were slipping past their deadlines because there was no automated way to catch and cancel them in time — someone had to notice and act manually, and that didn't scale across 6 client platforms.
The Solution
I built a background service using ASP.NET Core and Hangfire that continuously monitors bookings approaching their last ticketing time. When a booking is still un-ticketed as the deadline closes in, the service automatically cancels it — removing the ADM exposure without requiring manual intervention. The job scheduling and retry behavior are backed by SQLite for lightweight, reliable persistence across restarts.
Key design points:
- Runs as a recurring Hangfire job, independent of the main booking API's request/response cycle
- Idempotent cancellation logic so re-runs or retries never double-cancel or corrupt booking state
- Configurable per-client thresholds, since each OTA's ticketing deadlines and airline agreements differ slightly
The Results
- Reduced ADM penalties by $4,500–$6,400 per month per OTA
- Total savings of ~$23,000–$27,000 across 6 client platforms
- Removed a manual, error-prone monitoring step from the operations workflow entirely
Related Case Studies
Jan 13, 2026
Building an Airline Fare Intelligence Platform Across Multiple GDS & NDC Suppliers
An airline fare intelligence platform integrating multiple GDS and NDC suppliers to aggregate, normalize, and analyze competitor pricing — turning scattered market data into data-driven fare recommendations.
Jul 23, 2026
How a Redis Stampede (Thundering Herd) Hit Our OTA Search Ranking Engine — And How We Fixed It
When 30 integrated suppliers and 40-50 unique airlines per search met an uncached rank lookup, concurrent cache misses stampeded the database in unison — here's how negative caching and locking around retrieval broke the herd.
May 24, 2026
Progressive Search: Showing Flight Results Before All 30 Suppliers Answer
Flight search used to wait on all 30 suppliers before showing anything — one slow responder meant everyone waited. Here's how Server-Sent Events let us stream results the moment each supplier answers.