AdvertisingSovren · Self-serve ads · 2025
A self-serve ad platform from scratch.
I was the only product person building a self-serve ad platform from nothing, on a seven-person team with no ad product to inherit. Advertisers edit live campaigns dozens of times a week, so I killed the four-step wizard I’d shipped for one editable view across five ad surfaces.
No ad server, no advertiser product, no auction.
Five ad surfaces, one auction beneath them. The studio is what an advertiser touches: campaign, ad sets, creative, copy, destination and a live preview, with nobody on our side in the loop.
That last part was the constraint. Seven people can only run a two-sided marketplace if the product refuses to create work for humans.
I shipped a four-step wizard, then killed it.
Campaign, ad set, ad, each its own step. It is the obvious architecture, it demos well, and it is what we shipped first.
It assumed an advertiser builds an ad. They don’t. They test: similar creatives against one audience, or different campaigns against a similar one. Each test is a small edit to something that exists, made dozens of times a week. The wizard made the first ad easy and every later edit expensive.
So the levels stopped being screens. Campaign, ad set and ad sit open together, the editor in the middle and the preview beside it.
Every new advertiser had to cost us nobody’s time.
An ad with no destination cannot go live. The studio names the problem at the top of the editor, with the fix, before anyone spends money.
The same rule kept credit decisions, collections and chargebacks off the build list. The alternative was a managed service, which means every new advertiser needs more people. I set the minimum at $50, deliberately low, so the first proof was that a stranger could fund an account and get a campaign live with nobody in the room.
We built the ad server instead of renting one.
A third-party ad server would have served a real ad in weeks. I turned it down for three reasons. Inventory: ads, the feed and marketplace listings sell to the same advertiser in the same session, and no vendor models that. Control: renting the server means renting the yield logic and the experiments with it. Economics: this was a business unit, not a feature bolted onto traffic.
The cost was real: weeks to the first impression that a vendor would have saved.
We tested a heavier ad load. The holdout said no.
Click-through rose, and short-term yield rose. Then the long-term holdout came back and said the retention cost outweighed the gain, so we didn’t ship it. The threshold was set before the test, so the number could win the argument.
I owned the product calls. Engineering owned most of the build.
Mine
- The advertiser studio and the call to kill the wizard.
- The five surfaces and what each was worth.
- Pricing, including the $50 minimum.
- Building the ad server instead of renting one.
- The guardrail that could stop a launch.
- Some of the React front end.
Not mine
- Most of the implementation, from the auction to the delivery path.