Freebee Ads docs

Product docs

Freebee end-to-end flow

Last updated Oct 23, 2026 · @praveen · 12 sections

Who does what, in what order, from an advertiser signing up to the report the next morning. After the main flow: the links and logins, the metrics we collect, the booking flow, bidding for busy windows, what happens when something fails, OTP and coupons, upload rules, where AI fits, the native player for Android, Windows and Mac, and how we talk to the advertiser. Anything marked proposed is not built yet.

The flow

An ad is made, approved, booked, played on the wall and countedFour lanes, top to bottom in time. Highlighted boxes are the game itself, in the mall.ADVERTISEROPS (ADMIN)SCREEN: WALL + KIOSKSHOPPERSign upemail and passwordCreate an advideo, image or gameBook a screenscreen, date, hoursCampaign reportplays, watchers, costAdd a screenmall, zone, screenPair the wallenter the player codeApprove the adplay test, approveToday and metricsall screens, all adsWall plays loopcricket ad shows QRKiosk: enter coderoll dice, wall playsCamera countsplays and watchersScan the QR codename, face, get codeWin a prizecoupon on the phoneapproved
end-to-end flow · 4 lanes, 13 steps

Ops can add and pair screens at any time; an ad only reaches the wall once it is approved and booked. The highlighted boxes are the Hit for Six loop in the mall: the wall shows a QR code, the shopper gets a code on their phone, enters it at the kiosk, rolls the dice ball by ball, and a prize lands in their phone wallet. The camera and the play record count everything, and both the advertiser's report and the ops Today page fill in the next morning.

Everything runs at https://freebeeads.com. The demo campaigns are booked on the screen "Escalator Court — North Portrait".

PageLinkWho
Sign inhttps://freebeeads.com/logineveryone
Sign up with your own emailhttps://freebeeads.com/signupadvertisers
Advertiser Home, Campaigns, Creatives, Reports, Book/dashboard · /campaigns · /creatives · /reports · /bookadvertisers
Create a game adhttps://freebeeads.com/creatives/game/newadvertisers
Ops Today, Screens, Bookings, Approvals, Footage, Devices/ops · /ops/screens · /ops/bookings · /ops/approvals · /ops/footage · /ops/pairops
The wall (player, shows a pairing code)https://freebeeads.com/playerone laptop or TV per screen
Kiosk beside the wallhttps://freebeeads.com/kiosk/ba1be657-dab3-4281-94ac-29a3c512e084a tablet
Phone join page (what the wall's QR opens)https://freebeeads.com/play/ba1be657-dab3-4281-94ac-29a3c512e084any phone
Shopper's coupon wallethttps://freebeeads.com/wany phone

Logins: demo advertiser demo@dooh.local / demodev123; ops ops@dooh.local with the ops password shared one to one. Friends can also sign up with their own email (password of 8 characters or more, plus a business name). There is no password reset yet.

Metrics we collect

Every number comes from one of three sources: the play record written by the screen, the camera on the screen, or the game itself. Nobody is identified; the camera keeps counts only and the phone number of a wallet user is stored encrypted and never shown to an advertiser.

MetricComes fromShown whereWhen it is missing
Playsthe screen writes a play record when an ad finishesDelivery band on Home, campaign report, ops Today and Metricsscreen off or unpaired: plays stop; the Delivery band shows 0 and ops Today raises an "offline" alert
Opportunity to see (walked past)camera on the screen, person count while the ad playedAudience band, attention funnelcamera off: the band shows clearly labelled sample numbers and says the screen is not counting yet
Watcherscamera, faces turned to the screen for 1 s or moreAudience band, watchers by day and by hoursame as above; a face-only camera counts watchers but not passers-by, so the attention rate shows a dash with a note
Attention (seconds)camera, how long each watcher kept lookingAudience band, by-creative tablesame as above
Age bands and gendercamera, estimated on the screen itself, counts onlycampaign reportsame as above
Scans, codes, innings, balls, runs, prizesthe cricket game: phone page, kiosk, wallEngagement band, Hit for Six funnel, innings CSVno game ad in the range: the band collapses to one line with "Create a game ad"
Rounds, completions, QR code scansspin, wheel and catch gamesEngagement band, game funnelsame
Coupons issued, claimed, redeemedthe phone walletEngagement band, ops Wallet pagenone issued: dashes
Spend and revenue bookedbookingsValue band, ops Value band, Bookingsnone: ₹0
Last check-in, held batchesthe screen's status call and the play record uploadops Screens health, ops Today alertsnot reported: "Not seen lately", then "Offline"

Numbers land in the dashboards the next morning for the previous day; Live right now and Playing now update every 5 seconds.

Booking flow

A booking reserves slots the moment it is confirmed; the wall plays once the ad is approvedBuilt today. The two side boxes are where a tester will see a message instead of the next step.Pick an advideo, image or game ad; preview it firstPick a screen and the datesrate per slot per day is shown on the cardPick the hoursgrid of 30 or 60 min blocks, 10:00 to 22:00Window free?Taken by another brandwho holds it and the next free oneSee the price, confirmrate × slots × days × share of the dayBooked, payment pendingslots reserved now; ops marks it paidAd approved?Waiting for ad approvalslots stay held; ops approves within a dayScheduled on the wallplays in the loop inside the hour windowReport fills the next morningplays, watchers, scans, cost per playnoyesnot yetyesonce approvedpick again
booking flow · 7 steps, 2 decisions

There is no bidding: every screen has a fixed rate per slot per day set by ops, and an hour window costs its share of the day. A game ad holds its window exclusively (one brand on the wall at a time); a video or image ad shares the loop. The booking can be cancelled before it starts and future dates are freed; a booking that has already played cannot be cancelled from the portal.

Bidding for busy windows

On a busy day a main-screen window goes to the highest bid above the floorProposed. Ops switch bidding on per screen and day; every other window stays first come, first served.Advertiser picks a windowmain screen, a day ops marked as busyBidding on for this day?Book at the fixed ratefirst come, first served, as todayPlace a bidfloor or more; a max auto-raises for youBidding closes48 hours before the window startsHighest bid?Not won, nothing chargedoffered the next free window or screenWinner pays the bida tie goes to the earlier bidScheduled on the wallthe ad must be approved by the closenoyesoutbidyes
bidding for busy windows · proposed

Today every window is first come, first served at the fixed rate, which is right for most screens and most days. On a main screen on a busy day (weekends, Diwali week, a mall event) several brands will want the same evening hour, and the first click should not decide it. The proposal keeps the fixed rate as the floor and adds a short, sealed bidding round only where ops turn it on.

RuleProposed settingWhy
Where it appliesops flag a screen plus a date range as "busy"; one toggle on the screen's pagekeeps the rest of the network simple
Floorthe screen's fixed rate for that windownobody pays less than today
Bidsone per advertiser per window, at or above the floor, in steps of 10%; an optional maximum that auto-raises in steps when outbidfair, no bid wars in real time
Visibilitythe current highest bid is shown; who placed it is notpressure without poaching
Close48 hours before the window starts; late entries are not acceptedleaves time for approval and a make-good
Awardhighest bid wins and pays its bid; a tie goes to the earlier bid; the ad must already be approved, otherwise the next bidder winsno empty wall on the busiest hour
Everyone elsepays nothing; offered the next free window on that screen or the same hour on another screen in one tapa loss still ends in a booking
Video and image adsa bid buys extra slots in the loop (share of voice) instead of exclusivity, since loop ads share the hourthe wall is only exclusive for game ads
Guard railsone brand may hold at most three consecutive busy windows on a screen; ops can cancel a round and fall back to the fixed rateprotects variety for shoppers and the mall

What the advertiser sees: the hour grid marks busy windows with the floor and the current high bid, and the booking summary rail shows "Bid ₹X, closes Fri 18:00" instead of a fixed price until the round closes. Ops see the open rounds on the Bookings calendar with the bidder count. Messages on close go out through the channels in "How we talk to the advertiser".

When things fail

Each failure is noticed, shown to both sides, and has a next stepBuilt today unless marked proposed. Read each row left to right.WHAT GOES WRONGHOW WE NOTICEADVERTISER SEESOPS SEESTHENScreen offpower, wifi or theplayer tab closedNo check-infor 10 minutes;plays stop arrivingLive right nowshows the screen as"Nothing playing"Today alert"2 screens offline"plus the health tabProposedWhatsApp to ops;missed plays creditedCamera offor blocked, or aface-only cameraPlays arrivewith no audiencecounts attachedSample numbersin the Audience bandwith a clear noteMetrics tabdashes for watcherson that screenProposedops alert after aday without countsRecords helda batch fails checks,e.g. clock driftHeld for reviewnever silentlyaccepted or droppedNothing yetplays count oncethe batch is releasedHealth tab"held for review"count per screenOps reviewsreleases or dropsthe batchWindow takentwo brands want thesame wall hourClash at confirmthe second bookingis refusedGrid shows holderand the next freewindowBookings calendarboth brands on theweek gridPick anotherwindow or day;nothing is charged
failures · 4 cases, who sees what

The rule behind all four rows: a number that was never measured shows as a dash or a labelled sample, never as zero, and a play that was never recorded is never billed. The gap today is reach, not detection: ops only learn about an offline screen when they open Today, and the advertiser only when they open Home. The proposed push messages in "How we talk to the advertiser" close that gap.

OTP and coupons

A win becomes a coupon in the phone wallet after a one-time codeBuilt today, except the code delivery: in test mode the code is shown on screen; WhatsApp or SMS delivery is proposed.Win on the wallruns reach a prize band;a claim QR showsPhone opens the claimone-time link, shows theprize before sign-inEnter phone numberstored hashed and encrypted;never shown to advertisers6-digit code arrivesvalid a few minutes; 5 tries;rate-limited per hourType the codewrong code: "That codedidn't match, try again"Coupon in the wallettitle, code, expiry; allcoupons at /wShow at the counterthe shop types the codein the advertiser portalRedeemed oncea second use is refused;counted in the report
OTP and coupons · 8 steps

The one-time code is the only moment we ask a shopper for anything personal, and only because the coupon has to live somewhere they can find again. The number is kept as a hash plus an encrypted copy, used for nothing else, and a shopper can erase their wallet from the /w page. Codes are minted on the server and expire in minutes.

What is not connected yet: the SMS or WhatsApp sender. On the test site the code is shown on the page itself so testers can continue. Before launch, delivery goes through WhatsApp Cloud API with SMS as the fallback, and the test shortcut is switched off. Daily prize budgets per tier ("max wins per day") already cap how many coupons a campaign can hand out.

Upload rules

A file is checked the moment it is uploaded, before anyone sees it. A wrong file is refused with one plain sentence and nothing is saved; a file that passes goes to our team for approval.

WhatWe acceptWhat we say when it is wrong (built today)
Video admp4 (H.264), up to 50 MB, up to 10 seconds, portrait or square preferred"video exceeds 50MB limit" · "video duration 14.0s exceeds 10s limit" · landscape is accepted with the warning "landscape orientation; portrait or square preferred"
Image adjpg or png, up to 10 MB"image exceeds 10MB limit"
Anything else (pdf, gif, mov, webm, pptx)refused"unsupported file type '.mov': allowed jpg/png images, mp4 video"
Game ad images (logo, product shot, symbols, packs)png or jpg, up to 5 MB; png with transparency for logos and symbols"Image exceeds 5MB." on the slot; the slot shows an example of a good file
Game ad clips (background loop, win clip, ad break)mp4, up to 20 MB"Video exceeds 20MB." on the slot

Proposed, not built: convert common mistakes instead of refusing them. A .mov or .webm is transcoded to mp4; a 15 s video is offered a 10 s trim with a preview; a landscape video is offered a portrait crop; an oversized image is resized. The message then reads "We converted your file to the screen's format; check the preview" with a side-by-side before and after.

AI in the flow

AI sits between the upload and the human approval, and between a typed name and the wallGreen = built today. Blue = proposed. A person still approves every ad.AD IMAGES AND COPYNAMES SHOPPERS TYPE FOR THE WALLUploadvideo, image, logo,product shot, packsFormat checktype, size, length;plain refusal messageAI enhanceupscale, cut background,fit 9:16, fix low lightAI preview + copywall mock-up clip;3 headline suggestionsOur team approvesplay test, approve orreject with a reasonShopper typesa name on the phonepage, any scriptBlock listleet, look-alikes,Telugu, Hindi, EnglishAI checkslang, mixed script,brands, real peopleAllowed or blocked"Please use your realname, no foul language"On the wallname band, scorecard,never stored with a phone
AI in the flow · 2 lanes, built vs proposed

What AI would do for an advertiser: take a phone photo of a product and return a clean, upright, 9:16 image with the background removed; turn a 10 second video into a mock-up of how it looks on the wall; suggest three headlines from the brand name and the product. Each suggestion is shown beside the original and the advertiser picks; nothing is applied silently, and our team still approves the final ad.

What AI would do for the wall: catch the names the block list misses, such as slang spelt in English letters, a brand or a real person's name used as a joke, or a mixed Telugu and English phrase. The block list stays as the first, instant check; the AI check runs in under a second behind it. A blocked name always gets the same message as today, and nothing typed is kept beyond the innings.

The game footage itself (bowling, batting, the dice) is generated once by us and shared by every cricket campaign; sponsors add their packs and logo on top. A proposed extension is a per-brand pack render, so a new sponsor's pack appears on the shelf without a designer.

Native player instead of a browser

One player app for Android, Windows and Mac: same engine, counts on the device, syncs when onlineProposed. Today the wall is a browser tab; the app wraps that same engine so nothing on the server changes.Player app on the screen's deviceAndroid box or TV, Windows mini PC, Mac mini; installs once, starts on bootKiosk shellfull screen, auto-start, watchdogPlayback enginetoday's web engine, embeddedLocal cacheads, footage, schedule on diskVision modulecamera to counts, on the deviceSync agentpairing, check-in, upload queueKiosk and phone linksame pages, same screen idOffline modekeeps playing; records waitSelf-updatenew engine pulled from the cloudFreebee cloudunchanged from todaySchedule and assetswhat to play, when, with whatPlay record + audiencebatches checked, then countedGame servercodes, dice rolls, prizesDashboardsadvertiser and ops, as todayrecords up, schedule down
native player · app on the device, cloud unchanged

A browser tab works for a demo but fails in a mall: it needs someone to open it, it can be closed or navigated away, it cannot start on boot, it loses the camera permission after a reboot, and a wifi drop stops the loop. The app wraps the same web engine (one codebase, the same play record format), so the server and dashboards do not change and the browser player keeps working for tests.

PlatformDevice in the mallPackagingCameraNotes
AndroidAndroid TV box or a signage box behind the wall, or an Android tablet as the kioskAPK, side-loaded or via a managed store; device-owner kiosk modeUSB or built-in camera; counts on the devicecheapest hardware; first to build
Windowsmini PC driving the LED wallMSI installer, runs as a service, assigned-access kiosk modeUSB webcamcommon for LED controllers
MacMac mini driving the wallDMG, launch agent, auto-loginUSB webcamyour test setup today

What the app does that the browser cannot: start itself after power loss, keep playing from its cache for hours offline and upload the queued play records afterwards, restart the engine if it stalls, pull engine updates in the night, and report its health (temperature, disk, camera) in the check-in. Pairing stays the same six-character code shown on the screen and entered in Ops, so nothing changes for the ops person. Build order: Android first (one app covers the wall box and the kiosk tablet), then Windows, then Mac.

How we talk to the advertiser

Today every message lives inside the dashboard: a status badge, an alert strip, or a note under a number. Nothing is sent to the advertiser's phone or email yet, so an advertiser who does not open the site does not hear about an approval or an outage. The proposed channels add WhatsApp first (the market's default) and email as the record.

EventBuilt today (in the dashboard)Proposed (push)
Ad approved or rejectedbadge on Creatives and Campaigns; rejection reason on the cardWhatsApp: "Your ad Diwali Sale is approved and will play from 2 Nov" or the rejection reason with a link to fix it
Booking confirmedsuccess card with three next stepsWhatsApp plus an email receipt with the invoice
Payment pending or receivedbadge on the campaignWhatsApp reminder two days before the start; receipt on payment
Screen offline during your windowLive right now shows "Nothing playing"; ops Today raises the alertWhatsApp to ops immediately; to the advertiser after 30 minutes with the make-good (plays credited or extended)
Camera not countingAudience band shows sample numbers with a notenothing to the advertiser; ops alert only
Your campaign started, ended, report readybadges; report fills next morningmorning WhatsApp with the four headline numbers and a link
Prize claimed by a shoppercounts in the Engagement bandnone (shopper gets the coupon; see OTP and coupons)

Ops are told the same way today: alerts on Today and badges on Approvals. The proposed ops channel is a WhatsApp group fed by the same alerts, with offline screens first.

What is still missing

The flows above are the product. A mall-screen business needs the pieces below too, and most of them are not started. Ordered by what blocks a real paying launch first.

AreaGapStatusNeeded for
Paymentsno online payment; ops marks bookings paid by hand; no invoice with GST; no refund or credit for cancelled or missed playsNot startedfirst paid campaign
Secrets and launch switchesrotate the Railway database password, secret key and ops password; switch off the test OTP mode; set a real domain and email senderNot startedlaunch
Account basicsno password reset, no team members or roles, one ops account for everyone, no company profile beyond a nameNot startedfriends testing, first customers
Advertiser messagesapprovals, confirmations, outages and reports are shown only inside the site; WhatsApp and email sending not builtProposedfirst customers
Legal and privacyno terms, privacy policy or camera notice in the mall; DPDP consent wording for the wallet; data retention and delete-my-dataNot startedlaunch
Content policyno written rules for what ads are refused (alcohol, tobacco, political, medical claims) and no mall sign-off stepNot startedfirst customers
Prize fulfilmentprizes are coupons; no stock count, no expiry reminder, no check that the counter honoured the coupon, no fraud limits per phoneProposedfirst game campaign
Proof of playno camera snapshot or signed log an advertiser can audit; counts are trusted from the screenNot startedlarger advertisers
Mall partner sideno mall login, revenue share report, holiday hours or maintenance mode per screenNot startedsecond mall
Device reliabilitybrowser player only; no auto-start, offline cache, remote restart or health report (see Native player)Proposedany unattended screen
Support and incidentsno support inbox, no runbook for a screen down at 7 pm, no uptime alerting on Railway or VercelNot startedlaunch
Languagesportal and phone page are English only; Telugu and Hindi for the shopper pages firstNot startedshoppers
Accessibility and soundno audio on the wall yet; kiosk has no large-text or colour-blind modeProposedlater
Scaleone time zone, one currency, one city; screens have no group or regionNot startedsecond city
Analytics on ourselvesno funnel on sign-up to first booking; no error tracking in the browserNot startedgrowth
BackupsRailway Postgres backups and media-volume backups not confirmed; no restore drillNot startedlaunch
End-to-end flow · Docs