DynaMo is a pilot console for CoolSip, an invented beverage brand, running twelve line items across Mumbai, Delhi, Bangalore and Chennai. Every city carries the same three creatives: “Beat the heat” for heat, “Rainy day pick-me-up” for rain and “Refresh anytime” for everything else. The premise fits in one sentence. Run the heat creative when it is hot, the rain creative when it is raining, and the generic one otherwise. Everything worth building is in what that sentence leaves out.
The working definitions I started from were “hot is 35°C” and “rainy is any precipitation above zero”. Both fall apart on contact with real weather. 35°C is an ordinary Delhi afternoon and a rare Bangalore one, so the threshold is set per city. “Any precipitation” is true for weeks of a Mumbai July, so rain needs an intensity floor in millimetres per hour, raised in Mumbai, and a drizzle no longer benches the heat creative. Every threshold has a second number under it. A city sitting on a single line would flip creatives every cycle, so switching on and switching off happen at different values, and a change then has to survive a 30 minute dwell window before it can reverse.
| City | Heat on | Heat off | Rain on | Rain off |
|---|---|---|---|---|
| Mumbai | 35°C | 33°C | 1 mm/h | 0.5 mm/h |
| Delhi | 35°C | 33°C | 0.5 mm/h | 0.2 mm/h |
| Bangalore | 32°C | 30°C | 0.5 mm/h | 0.2 mm/h |
| Chennai | 35°C | 33°C | 0.5 mm/h | 0.2 mm/h |
The decision engine is a pure function. Line items, weather signals, configuration, operator overrides, freeze state and a timestamp go in; decisions with a six step trace come out. No clock reads, no network calls, no randomness. That is what lets the scheduled server cycle and the browser Sim Lab run identical code, and what makes a past decision replayable from the signal snapshot stored beside it. Per city the engine picks one winning creative, with rain outranking heat, because a heat creative running through a downpour is the failure a CMO will remember. Per line item it walks a fixed order: operator override, campaign freeze, signal freshness, weather match, dwell guard, emit. The operator wins every time. Where an override breaks the one-active-creative-per-city invariant, the engine flags it and stands down rather than fighting it.
Freshness is the part I care about most. A reading older than 15 minutes is marked stale; past 45 minutes, or with a null temperature or precipitation, the city drops to the generic creative instead of guessing. Being wrong in public is worse than being generic. Every transition, including cycles where the engine decided to do nothing, is written to an append-only ledger with the exact reading it used and the rule it applied, in the same transaction as the observation, and a database trigger blocks UPDATE and DELETE on that table. The claim the build exists to support is narrow: an automated spend decision can be explained line by line months later, from the record rather than from memory.
↑ Independent product concept by Kaushal Khodifad. DynaMo is an independent product concept by Kaushal Khodifad; it is not a real company or a commercial product. It explores the context-aware advertising space. Not a live commercial product. Data is illustrative.