Put your brand in front of people who are actually looking
On ISN-powered free WiFi a guest watches your ad to earn their data. Full screen, on their own phone, with nothing else competing for their eyes. You choose where, to whom and for how much, and you get a report that proves it happened.
How to get startedSee formats and pricesI run a WiFi network
Who sells the ad space, and who is ISN?
ISN Free WiFi is the platform. The people who run the WiFi, such as a shopping centre, a taxi fleet, a school, an ISP or a municipality, each run their own branded network on it and sell the ad space on their own networks. That means you deal directly with the venue you want to reach, you agree the price with them, and ISN never sits between you and takes a cut.
Every venue has its own advertiser page and its own prices. The numbers on this page are the platform defaults that a venue starts with.
How a guest meets your ad
A guest connects to the WiFi and picks a free data bundle. To unlock it they watch a short run of ads, normally 15 to 30 seconds each. Your ad plays full screen on their phone while the clock runs, so it is seen, not scrolled past. When they have watched enough, the internet switches on.
Because the viewing is tied to something the guest wants, completion is high and attention is real. The player reports each second of viewing back to the platform, and the platform, not the browser, decides what counts as a view.
Formats and per-view prices
You pay per view and set a total budget. These are the platform defaults; the venue can change them.
| Plan | Default price | What your viewer sees |
|---|---|---|
| Standard | R0.20 / view | Your ad, with a skip button after 15 seconds |
| Skip Disabled | R0.30 / view | Your ad cannot be skipped |
| Homepage Takeover | R0.32 / view | Your ad on the full homepage, no skip |
| Aggressive | R0.35 / view | Shown about twice as often as Standard |
| Aggressive + Skip Disabled | R0.45 / view | Shown about twice as often and cannot be skipped |
| Customizable | Your own rate | You set the price per view; a minimum campaign spend of R15,000 applies by default |
Your budget divided by the price gives your goal number of views, and the builder shows you that figure before you pay. The campaign stops by itself when the budget is used, and you get an email as it passes 50%, 75%, 90% and 100%.
What you can set on a campaign
- The ad itself: a video (up to 500 MB) or an image gallery of up to 15 pictures with a slideshow time of 5 to 300 seconds, plus a headline of up to 160 characters and the name shown on the ad.
- A button that does something: visit your website, call you, message you on WhatsApp (with a ready-typed message), email you, get directions to your shop, or no button at all.
- Where it shows: every location, or only the ones you pick, for example just the branch with the lunch special.
- Who sees it: a minimum and maximum age. A guest whose age is unknown is left out, never guessed.
- When it shows: chosen days of the week and an hour range in South African time.
- How often: an optional limit on views per person per day, week or month.
- How long: from a day to a year. When it ends it pauses, and it is removed 14 days later unless it is switched on again.
- Priority: Low, Normal, High or Top, which changes how often your ad is picked among eligible campaigns.
- A whole day to yourself: a Brand Takeover Day makes your ad the only one on a venue's network for a full calendar day. Each venue can sell one takeover per day, and you see a clash straight away if a date is taken.
Proof that it ran
Every campaign has a Proof of play report you can download as a branded PDF or a CSV file for any date range of up to 400 days. It shows how many times your ad played, how many different people saw it, and how many watched to the end, skipped or clicked, split by location, by day and by hour in South African time.
The report counts viewers but never identifies them, and nothing in it is personal information. Your dashboard also shows each campaign's progress against its budget, and a spend tracker for what you have been billed.
Your own login, and only your own data
Your advertiser account works on the venue's own dashboard but is restricted: you see your campaigns, your results and your spend, and nothing about the venue's other advertisers, its settings or its guests. Two-step sign-in is available for your account.
If a venue assigns you survey questions, the answers to your own questions appear in your account as well.
Sponsors and banks
A sponsor, such as a bank or a national brand, can pay for one campaign to run across several venues at once and get a read-only report of how each venue performed. That multi-venue option, and the sponsor login that goes with it, is switched off for now while we finish a fix. A sponsor can still advertise today as an ordinary advertiser on any single venue. If you want a multi-venue sponsorship, email us and we will tell you when it is back.
How to get started
- Pick the venue or network you want to reach and agree the price and minimum spend with them.
- Ask them for an advertiser login. They add you with Add Business on their Captive Dashboard (your business name and an email address, no card needed). You get an invite email and set your own password, then sign in at their address, which looks like
https://their-captive.isnfreewifi.co.za/dashboard. - Sign in, build your campaign and preview the goal views before you commit.
- Pay the venue by the method you agreed, and watch your results come in.
Your ad must follow South African advertising standards and the venue's own content rules. Misleading claims and unlawful content are not allowed. Not sure which venue to start with? Email us and we will point you to a network that fits.
Common questions
Who do I pay to advertise?
The venue or company that runs the WiFi network. ISN Free WiFi is the software they use and is never a party to the payment, so there is no ISN fee on your campaign. The venue invoices you directly, by EFT, invoice or cash, whatever you agree with them.
How do guests see my ad?
A guest who wants free WiFi picks a data bundle and watches a short ad, usually 15 to 30 seconds, to unlock it. Your ad is shown full screen while they wait, so it gets attention that a banner never gets.
Do I get any personal details about the people who watched?
No. Reports count views and viewers and break them down by place, day and hour, but they never identify anyone. No personal information is shared with advertisers.
What does an ad cost?
You pay per view. The platform defaults run from R0.20 per view (Standard) to R0.45 per view (Aggressive with no skip), and each venue can set its own prices. You set a total budget and the campaign pauses by itself when it is spent.
Can I limit who sees my ad?
Yes. You can choose which locations show it, set a minimum and maximum age, pick days and hours, and cap how often one person sees it. Anything the system cannot confirm about a guest is left out, so your ad is not shown by accident.
How do I get an advertiser account?
Ask the venue whose WiFi you want to advertise on. They create your login from their dashboard with just your business name and an email address. You then build and fund your own campaigns and see only your own results.
Add your advertisers in your Captive Dashboard, not by hand
If you run a network on ISN Free WiFi, you do not have to collect ad numbers and email reports to each advertiser. Add the advertiser once and the system does the rest automatically: it counts every view, tracks the budget, pauses the campaign when the money is used, emails the advertiser at 50%, 75%, 90% and 100%, and produces their proof-of-play report whenever they want it. Each advertiser gets their own login, sees only their own campaigns, and never sees your other advertisers, your guests or your settings.
- Sign in to your Captive Dashboard at
https://your-captive.isnfreewifi.co.za/dashboard(replaceyour-captivewith your own captive name). - Click Add Business. Type the advertiser's business name and the email they will log in with. Contact person, phone and website are optional. No card is needed. The account type is Business (normal advertiser).
- The advertiser gets an invite email and sets their own password. Until they do, they show as Pending invite in your list and you can press Resend Invite.
- They sign in at the same address,
https://your-captive.isnfreewifi.co.za/dashboard, and build their own campaign. You set the per-view prices once under ISN Portal, Ad revenue, Ad pricing. - From then on everything is automatic. They watch My Campaign Performance and My Ad Billing & Spend themselves and download their own Proof of play reports, so you stop reporting to them by hand. You can still see every advertiser's revenue on your own dashboard.
Advertisers can also read about your prices and ask to advertise on your own advertiser page, https://your-captive.isnfreewifi.co.za/business, which every captive gets automatically.
Advertisers can pull their own numbers into any tool
Every advertiser login also gets API Integration in its Settings. They can create a key and connect their own reporting tools (a spreadsheet, Power BI, Zapier, their own software) so their campaign figures arrive on their own, with no emailing and no exporting. The keys are read-only: an advertiser can look at its own campaigns, views and spend, and cannot change anything or see anyone else's data.
The advertiser signs in, opens Settings, then API Integration, and presses Generate Key. They give it a label (for example "Power BI") and keep the Read scope. The full key starts with psk_live_ and is shown once, so they copy it straight into a password manager. If it is lost they revoke it and make a new one; nobody can retrieve it.
https://your-captive.isnfreewifi.co.za/api/v1
Replace your-captive with the captive the advertiser belongs to. Send the key on every request in a header, never in the web address:
X-Api-Key: psk_live_your_key_here
curl -H "X-Api-Key: psk_live_your_key_here" \ "https://your-captive.isnfreewifi.co.za/api/v1/keys/me"
A working key answers with {"ok":true, ...} and the key's label and scope. It never shows the key itself.
GET /api/v1/keys/me | Details about the key being used, handy for testing the connection. |
|---|---|
GET /api/v1/analytics?period=7d | Totals for all the advertiser's campaigns: views and clicks in the period, click-through rate, lifetime views delivered against required. period is 1d, 7d (default), 30d or all. |
GET /api/v1/campaigns | Every campaign with its status (active, paused, budget_exhausted or expired), budget, views delivered, price per view, days left and end date. |
GET /api/v1/invoices | Spend per campaign (views delivered times the price per view) and the total spent in rand, so the advertiser knows what is due. |
JavaScript (Node 18 or newer)
const BASE = "https://your-captive.isnfreewifi.co.za/api/v1";
const KEY = process.env.API_KEY; // keep the key out of your code
async function get(path, params = {}) {
const url = new URL(BASE + path);
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
const res = await fetch(url, { headers: { "X-Api-Key": KEY } });
if (!res.ok) throw new Error("API " + res.status + ": " + (await res.text()));
return res.json();
}
const analytics = await get("/analytics", { period: "7d" });
console.log("Views:", analytics.summary.views_in_period);
const { campaigns } = await get("/campaigns");
campaigns.forEach((c) => console.log(c.name + ": " + c.status + ", " + c.budget_percent + "% used"));
const { total_spent_zar } = await get("/invoices");
console.log("Total spend: R" + total_spent_zar);
Python 3 (needs pip install requests)
import os
import requests
BASE = "https://your-captive.isnfreewifi.co.za/api/v1"
HEADERS = {"X-Api-Key": os.environ["API_KEY"]} # never hard-code the key
def get(path, **params):
r = requests.get(BASE + path, params=params, headers=HEADERS, timeout=30)
r.raise_for_status()
return r.json()
stats = get("/analytics", period="30d")["summary"]
print("Views:", stats["views_in_period"], "CTR:", stats["click_through_rate_pct"], "%")
for c in get("/campaigns")["campaigns"]:
print(c["name"], c["status"], str(c["budget_percent"]) + "% used")
print("Total spent: R", get("/invoices")["total_spent_zar"])
Google Sheets (Extensions, Apps Script, then add a daily time trigger)
function syncAnalytics() {
var key = PropertiesService.getScriptProperties().getProperty("API_KEY");
var url = "https://your-captive.isnfreewifi.co.za/api/v1/analytics?period=7d";
var resp = UrlFetchApp.fetch(url, { headers: { "X-Api-Key": key }, muteHttpExceptions: true });
var data = JSON.parse(resp.getContentText());
if (!data.ok) { throw new Error("API error: " + resp.getResponseCode()); }
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange("A1:B4").setValues([
["Views (7d)", data.summary.views_in_period],
["Clicks (7d)", data.summary.clicks_in_period],
["CTR %", data.summary.click_through_rate_pct],
["Active campaigns", data.summary.active_campaigns]
]);
}
Save the key under Project Settings, Script Properties, as API_KEY instead of pasting it into the code. Power BI: Get Data, Web, Advanced, enter the /campaigns address and add a header named X-Api-Key with the key. Zapier: add a "Webhooks by Zapier" GET step with the same address and header.
- Each key can make 60 requests a minute. Going over returns an error
429and you wait a minute. Other errors:401means the key is missing, wrong or revoked;403means the key's scope does not allow that call. - A key is tied to its own advertiser. It cannot read another advertiser's campaigns, and it never returns guest details, only counts.
- The API cannot create, change or delete campaigns, and cannot touch routers or settings.
- Use one key per tool, never put a key in a web address or in code you share, and revoke it in Settings, API Integration, the moment you suspect it leaked.
Want to earn from advertising on your own WiFi?
If you run the WiFi, you set the prices, add your own advertisers and keep the income. Start with the signup page, read the ad-supported access guide or see pricing.
