Blog ยท Use-cases

Schedule DOOH Ads With Foot Traffic Forecasts

Plan digital out-of-home ads by the forecast busyness of venues around each screen, hour by hour, without cameras or POS integrations.

Updated October 20, 2026 5 min read
Large digital billboards above a busy shopping street
Photo by Chris Kursikowski on Unsplash

Digital out-of-home (DOOH) ads are worth the most when the most people walk past the screen. You can plan for that with venue busyness forecasts: pick the venues around each screen, combine their hourly 0-100 busyness into one index per screen, and weight your ad schedule and floor prices toward the busy hours.

This guide covers why foot traffic matters for DOOH, how to build a screen-level signal from nearby venues and what the data can and cannot tell you.

Why DOOH needs a foot traffic signal

Most programmatic DOOH platforms already use simple signals such as time of day and weather. Those miss the main question: how many people are around this screen at this hour?

The common ways to answer it are expensive:

  • Cameras with computer vision on each screen. Every display needs hardware, and cameras raise privacy questions.
  • Point-of-sale integrations for in-store screens. They work, but each retailer needs its own integration.
  • Panel audience data from large location data providers such as Placer.ai or Veraset. Useful, but usually priced through annual contracts.

Venue forecasts are a lighter option. You integrate one API once and get hourly patterns for screens anywhere you have venues nearby. You can start free and see published prices before you commit.

BestTime map of New York City with a heatmap of busy venues and a list of attractions with their daily busyness curves

What the forecast gives you

BestTime forecasts how busy public venues are for every hour of the week. The forecasts come from anonymized, aggregated phone location data combined with other real-world signals such as weather, events and holidays.

For each venue you get:

  • Hourly busyness from 0 to 100, Monday through Sunday. 100 is the venue's own busiest hour of the week.
  • Peak, busy and quiet hours per day.
  • Dwell time: how long people usually stay.

The scale is relative to each venue. A 60 at a large mall and a 60 at a small cafe do not mean the same number of people. That matters for how you combine venues, as shown below.

Build a busyness index per screen

A screen rarely sits inside one venue. A useful signal combines the venues people pass on their way to and from the screen.

  1. List the venues near each screen. For a mall screen, that is the mall itself. For a street screen, it is the train station, supermarket, gym and restaurants within a short walk.
  2. Get a forecast for each venue. Send the name and address once, then store the venue_id.
  3. Combine the hourly values. Take a weighted average for each of the 168 hours of the week. Give a higher weight to the venues closest to the screen or the ones with the most visitors.
  4. Rank the hours. The top hours become your premium slots. The quiet hours get lower floor prices or longer, cheaper flights.

Here is a short Python example. It forecasts two venues near one screen and averages their hourly busyness:

import requests

API_KEY = "YOUR_PRIVATE_KEY"
venues = [
    {"name": "Westfield World Trade Center", "address": "185 Greenwich St, New York, NY 10007", "weight": 2},
    {"name": "9/11 Memorial & Museum", "address": "180 Greenwich St, New York, NY 10007", "weight": 1},
]

index = {}  # (day_int, hour) -> weighted busyness
total_weight = sum(v["weight"] for v in venues)

for v in venues:
    r = requests.post(
        "https://besttime.app/api/v1/forecasts",
        params={"api_key_private": API_KEY, "venue_name": v["name"], "venue_address": v["address"]},
    )
    data = r.json()
    if data.get("status") != "OK":
        continue
    print(v["name"], data["venue_info"]["venue_id"])  # store this ID for refreshes
    for day_int, day in enumerate(data["analysis"]):  # 0 = Monday ... 6 = Sunday
        for i, value in enumerate(day["day_raw"]):  # 24 values, starting at 6 AM
            hour = (6 + i) % 24
            key = (day_int, hour)
            index[key] = index.get(key, 0) + value * v["weight"] / total_weight

top = sorted(index.items(), key=lambda kv: kv[1], reverse=True)[:10]
for (day_int, hour), score in top:
    print(day_int, f"{hour}:00", round(score))

The forecast response also includes busy_hours, quiet_hours and peak_hours per day if you prefer ready-made windows over raw values. See the API documentation for the full response.

A first forecast by name and address costs 2 credits per venue. Every refresh or query by venue_id costs 1 credit.

Find venues around a screen with the Venue Filter

If you do not have a venue list yet, use the Venue Filter. Send the screen's coordinates, a radius and the venue types you care about:

curl -X GET "https://besttime.app/api/v1/venues/filter?api_key_private=YOUR_PRIVATE_KEY&lat=40.7115&lng=-74.0110&radius=500&types=SUPERMARKET,RESTAURANT,BAR,PARK&day_int=4&foot_traffic=both&limit=50"

This returns venues within 500 meters with their Friday forecast (day_int=4). Add busy_min, hour_min and hour_max to find which screens sit near busy venues at a chosen time. The Venue Filter searches venues that already have a forecast, so in a new area run a Venue Search first.

Hour-by-hour busyness for the Colosseum on Saturday with a peak at 12 PM, plus a week heatmap Hour-by-hour and week patterns for one venue. A screen index combines several of these.

Plan by venue category, day and hour

Different venue types peak at different times. That helps you match campaigns to screens:

Venue near the screen Typical busy window Fits campaigns for
Train stations Weekday commute hours Commuter services, coffee, news
Supermarkets Late afternoon and weekends Food and household brands
Malls and shops Weekend afternoons Retail and fashion
Gyms Early morning and after work Sports and health
Bars and restaurants Evenings, Thursday to Saturday Drinks, entertainment, ride apps
Museums and parks Weekend late mornings and afternoons Tourism and leisure

These are general patterns. The forecast for the real venues around each screen will show where your locations differ, and that is where the value is.

Use the index in three ways:

  • Scheduling. Run your highest-value creative in the top hours for each screen.
  • Pricing. Set floor prices by hour band, for example quiet, normal and busy.
  • Planning. Show advertisers a weekly heatmap per screen, so they can buy the hours that match their audience.

What the data cannot tell you

Be clear about the limits so your sales team does not overpromise:

  • No counts. BestTime does not return visitor numbers or impressions. The 0-100 value is relative to each venue's own peak.
  • Venues only. Forecasts cover public venues, not custom areas such as a street or city block.
  • Typical weeks. Forecasts describe the expected pattern for each hour of the week. Use them for planning and scheduling, and combine them with your own measured impressions where you have them.

Costs

  • Free test account, no credit card.
  • Basic Usage: $29 per month including 1,200 credits, then $0.04 per credit.
  • Pro Venues, for a fixed venue list with unlimited forecasts: $96 per month for 50 venues, $119 for 100, $149 for 500 and $249 for 1,000.

A screen network with a stable set of nearby venues usually fits a Pro Venues plan. See the pricing page.

Next steps

Questions

How can foot traffic data improve DOOH advertising?

It shows which hours the places around a screen are busy. You can then weight ad schedules and prices toward the hours when the most people are likely to pass.

Does BestTime provide audience or impression counts for screens?

No. BestTime returns relative busyness from 0 to 100 for each venue, where 100 is that venue's busiest hour of the week. Use it as a timing signal next to your own impression data.

Which venue types work as signals for a screen?

Any public venue near the screen, such as malls, supermarkets, train stations, airports, gyms, restaurants, bars, museums, parks and beaches. Streets and city blocks are not covered.

How much does it cost to get forecasts for my screen locations?

You can start free without a credit card. Pro Venues plans give unlimited forecasts for a fixed list, from $96 per month for 50 venues to $249 per month for 1,000.

BestTime heatmap of busy areas across New York City

BestTime in 47 seconds

See how busy any place gets, hour by hour

BestTime forecasts how busy a venue gets for every hour of the week, from anonymized, aggregated phone location data combined with weather, events and holidays. Look up one venue, compare a whole city, or use the API.

Try BestTime for free

Create a free account without a credit card, forecast a few venues you know, and see their busy and quiet hours for every day of the week.

Start free See pricing