Happy hours, nights out (trivia, karaoke, live music), specials, discounts and gift cards, read from the business websites Doozer already holds and kept only as verbatim, dated quotes. Feeds The One, Doozer Town's "What's on", doozer.deals and API v1.
Jon wanted The One to be the place's hub: "karaoke every other Tuesday", "Happy Hour starts at 3". The facts were already on our disk. business_sources holds the markdown of 3,595 business websites; in October 2026, 124 mentioned a happy hour, 413 specials, 144 trivia, karaoke, live music or open mic, and 461 a discount. Happenings turns that text into things a person can act on tonight, without Doozer ever saying something the business did not.
extraction call per website (the job pin, gpt-5.6-luna,$0.0003 to $0.002), fed only the windows around keyword hits.
happeningsNorm() stripsmarkdown marks, plain-izes dashes and quotes, collapses whitespace, then a substring test).
happeningsIsSpecific()). "Our daily specials"and "Looking for the best happy hour in town? We've got you covered!" are dropped.
not in the quote is erased (happeningsWhenFits()).
linked to the source page. Offers leave after 45 days, everything else after 180.
happeningsIsNoise()): a chain's promotion (a name on 3+ of ourbusinesses), offers from kinds whose offers are advertising (car dealers, banks, insurance), wholesale pricing, and one-time dates already past.
happeningsIsBrandSite())is skipped: Petco's "25% OFF Halloween Collection" was showing on four branches.
town-page.php).discounts; filters by kind and town (filtered views noindex). includes/doozer-deals.php. Waiting on a Plesk alias; doozer.work/__deals-preview renders it with the dev token.
At a glance; no section when there is nothing. happeningsForBusiness($id) is the single call. The contract with API v1 is one variable: $happenings (a plain array of those rows) inside theOneAssemble(); the API serializes its variables, so GET places/{id} carries happenings with the same field names, provenance from happeningsProvenance() and src "w", the quote verbatim.
one_learn job reads the page's website when it changed since the lastread, capped by happenings_daily_cap (default 150 a day).
dz happenings batch=8 do=1 (one batch at a time), dz happenings id=<biz> to lookat one (dry run still costs the call), dz happenings recheck=1 to apply today's rules to stored rows for free, dz happenings list=1 kind= state= city=.
business_happenings_runs remembers a website that had nothing, so it is not asked again untilbusiness_sources.fetched_at moves.
happeningsDays()) reads ranges ("Mon-Fri", "Monday through Friday", wrapping"Fri-Mon"), "weekdays", "weekends", "daily", "7 days a week", "Thurs". A quote that names no day goes to "Any time", never to a guessed day.
Related: Common knowledge, Alice, The One Page, Doozer Games and Shop.