Polar Flow
Pricing one casino offer took several teams and a spreadsheet passed through many hands. I replaced it with an app that does the whole job.
The problem
Holland America comps cruises to casino guests. Before one of those offers can be sold, someone has to decide what every cabin on every sailing is worth under it, and get those numbers into the reservation system. Until that happens, the guest cannot book.
Getting there was a multi-team process. One file moved between groups, each adding the part they owned, and the pricing itself came out of an Excel workbook with around 130,000 formulas across 20 sheets and seven live database connections.
Every handoff is a chance to get a number wrong. Not because anyone is careless, but because that many hands on one file is what causes pricing mistakes, and the mistakes surface late, after the offer is already in front of guests.
What I built
Polar Flow is a Python app that pulls live pricing straight from Snowflake and builds a priced, sendable offer start to finish.
Filter the fleet to the sailings you want and pick the offer. Every pricing assumption behind it already lives in the warehouse, so that one screen is the whole input.
Calculate, and every cabin on every sailing is priced, next to what the reservation system holds right now, so the change is visible before anyone commits to it.
Send it, and the offer is bookable. One person, one screen.
What it brings
Fewer ways to get it wrong. The file stops changing hands, so the handoffs that caused mistakes are gone. The app also refuses outright rather than guessing: it blocks a send that would overwrite offers already loaded, and it blocks when it cannot reach the warehouse, because “the database is down” must never read as “nothing here is at risk.”
A record that survives. Every run is kept with its prices, its inputs and its receipts. The app re-checks what it sent and flags any offer that no longer matches what the reservation system holds, so we find out before a guest does.
Including when someone overrules it. Override the engine and the app keeps that decision permanently, next to what it would have picked, and offers it back the next time.
Anyone can run it. The knowledge is in the app now, not in one person’s head.
How it’s built
Python and Django with HTMX, reading live pricing from Snowflake, deployed to AWS with Terraform. The pricing engine is its own package, separate from the web app, and still runs from the command line. It is covered by 4,769 tests.
Next: HTTPS and per-person logins instead of the one shared account it runs on today, and turning on dollars-off offers, which are built and waiting behind a flag.