ARCHIT ROY / TECHNICAL NOTES / 002 / JUL 2026 / 12 MIN
Pricing: making Goa boring
How base fares, product guardrails, asset controls and operational overrides became one manageable ecosystem.
There is no single pricing model
The live price is assembled from several layers: an asset's base hourly value, duration and lead-time behaviour, slot-level demand and supply, product-specific adjustments, feedback from conversion and revenue, and deliberate business interventions. Reliability comes from understanding how those layers meet.
I inherited services with different schedules, stores and ownership histories. The job was not a clean rewrite. It was to make the active system safer while preserving behaviours that hosts, guests and downstream services already depended on.
This is a public-safe account of the work. Internal identifiers, proprietary thresholds, prompts, infrastructure details and operational commands are intentionally omitted.
Rebuilding the Goa basefare path
Goa basefare changes previously depended on downloading a file, moving it to the correct machine and running a specialised publisher. A refresh could take weeks. I separated Goa's computation inside the main basefare service, merged the result back into the regular India publishing path and added a daily table refresh.
The main incremental process now picks up the latest Goa state during its normal half-hour cycle. A narrow ad-hoc command supports an approved one-car-group correction without requiring a new file workflow. That combination reduced the operating loop from weeks to under 30 minutes while preserving an emergency tool.
Asset multipliers and product promises
A base fare cannot express every asset-level decision. I added a bounded per-car multiplier with an audit trail and a controlled bulk loader for approved changes. The default remains neutral; exceptional multipliers are explicit rather than hidden in unrelated pricing logic.
Long-duration and limited-kilometre products required separate care. Host recommendations are expressed as ranges built from city, duration, product and flexibility context. Hosts retain bounded control of the minimum. Long-duration minimum fares are guarded against expected earning levels so a discount product does not accidentally violate the economic promise behind supply.
Dynamic pricing needs off-switches
Demand spikes during a sale can cause a dynamic system to raise prices and defeat the sale itself. Very small markets may not have enough activity for dynamic movement to be meaningful. Peak events may require a time-bound premium. These are not edge cases outside the model; they are part of the operating system.
I formalised static-city handling, timed sale overrides, approved premiums, cohort updates and asset changes as explicit change types. Each follows discussion, approval, execution, independent validation and an audit entry.
Operating the ecosystem
The hardest failures in a pricing stack are often between services: a producer that did not run, a topic pointed at the wrong environment, a stale range feeding a current recommendation or an incremental path described as deprecated while still active. I mapped active schedules and dependencies before moving anything.
The result is not a magical unified model. It is a system with clearer entry points, narrower interventions, auditability and known fallbacks. Making pricing boring to operate is a meaningful technical outcome because the marketplace experiences every operational surprise as a price.