Sovren · Product design lead · Ad platform

I was the only product person on five ad surfaces and one auction.

Advertising had to become a primary revenue line rather than a side effect of the platform. There was no ad product to inherit, so I drew the advertiser studio from a blank page. Then I killed the architecture I had already built.

RoleProduct design lead, the only product person on a team of seven: an engineering lead, four engineers, a data scientist and me
OwnedThe studio, the surfaces and what each was worth, pricing, the guardrail that could stop a launch, and some of the React front end
Not mineMost of the build, from the auction to the delivery path
ResultFrom zero advertisers to paying customers, Sovren’s main revenue engine
The Sovren Ads dashboard: six campaigns listed with an on-off switch, objective, daily budget and status, then impressions, eCPM, clicks, cost per click, click-through rate and spend, totalled across the account.
  1. 1What it costs and what it returned, on the same row.
  2. 2A campaign can be switched off without opening it.
  3. 3Warnings sit on the name, where the problem is.
Shipped product, fixture data. The advertiser studio at campaign level. Every column here is a number an advertiser argues with, so none of them is a click away.
01 · No ad server, no advertiser product

A revenue line, with nothing underneath it to inherit.

No ad server, no advertiser product, no auction. Five ad surfaces, and one auction beneath all of them. The studio is the piece an advertiser actually touches: campaign, ad sets, creative, copy, destination and a live preview, with nobody on our side in the loop.

That last clause is the whole constraint. Seven people can only run a two-sided marketplace if the product refuses to create work for humans. Every decision further down this page is downstream of that number.

02 · The architecture I killed

I built one screen per level, and it was wrong for how advertisers work.

Campaign, then ad set, then ad, each its own step. Step one of four, step two of four. It is the obvious architecture, it demos well, and it is what I shipped first.

What the wizard assumed is that an advertiser builds an ad. They do not. They test. Similar creatives against a unique audience, or unique campaigns against a similar one. Every one of those is a small edit to something that already exists, and advertisers edit live campaigns dozens of times a week.

A wizard makes the first ad easy and every later edit expensive, because each one is a walk back through four screens to change one field. I had optimised the demo and taxed the job.

The shipped console: a left rail holding the campaign, its ad sets and their ads all expanded at once, an ad set editor in the middle showing saved audiences with their reach, and a live preview of both ads down the right side.
  1. 1Every level open at once. Nothing is a step.
  2. 2The editor changes; the tree and the preview do not.
  3. 3What blocks publishing is named at the top, with the fix.
Shipped product, fixture data. The same three levels, no longer three screens. Moving between them costs one click and never loses your place.

So I replaced my own four-step wizard with one editable view, and the levels stopped being screens. The rail holds campaign, ad set and ad open together, the editor sits in the middle, and the preview never leaves. What used to be a step is now a row that was already on screen.

03 · What it refuses to ship

The studio blocks a launch before it wastes anybody’s money.

An ad with no destination cannot go live. The issue is stated at the top of the editor, named by the ad it belongs to, and carries the fix rather than a link to documentation. It is the same principle the whole product runs on: refuse early, in a sentence, where the person already is.

That principle is also why credit decisions, collections and chargeback exposure never reached the build list. The alternative was a managed service, which turns every new advertiser into a fraction of a person somebody has to hire. The minimum was set 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.

04 · The calls that were mine

We built our own ad server.

The fast path was a third-party ad server: plug into one and serve a real ad in weeks. I turned it down for three reasons, and only one of them is technical.

Inventory. Ads, a social feed and a marketplace listing get sold to the same advertiser in the same session. No vendor models that. Control. Renting the ad server means renting the yield logic and the experimentation surface with it, which are exactly the two things I would need to open new teams onto. The economics. This was a business unit, not a monetisation feature bolted onto traffic. Change the economics yourself and you are building a marketplace; leave them to a vendor and you are operating one.

It cost real time to the first impression.

The other call was a guardrail pointed at myself. We tested a heavier ad load and it worked, briefly: click-through rose, short-term yield rose. Then the long-term holdout came back and said the retention cost outweighed the gain, so we did not ship it. The threshold was set before the test, not after, which is the only reason the number could win the argument.

Revenue always argues for more ads. The holdout could overrule me, and it did.

05 · The experiment safeguards

The safeguards were opt-in, and that was my mistake.

Marketplace experiments are harder than they look. Shared budgets and a shared auction mean a treatment group quietly spends the control group’s money, and in advertising a bad readout costs real money for as long as you believe it.

We had the answers. Interference-aware design, sample-ratio checks before a result shipped, the long-term holdout. Every one of them got built case by case and applied by hand, on the runs where a team already knew enough to ask for it. So the quality of the answer depended on who was asking.

I would build them in as default infrastructure on day one, so a team gets the safe experiment without knowing it exists.