What you’re building
A monetization stack where AdSense fills your unsold ad inventory automatically, but direct sponsors take over specific slots when you book them. When a direct campaign ends, AdSense flows back into that slot — no manual swap, no downtime.
This is how every serious publisher actually runs ads. AdSense is the floor. Direct sponsors are the ceiling.
Why pure AdSense leaves money on the table
AdSense pays out on every impression but at programmatic rates. For most niche English-language audiences, that’s $1-3 RPM. A single direct sponsor on a 20k-visitor niche blog can pay $300-500/month for ONE sidebar slot. Same impressions, 5-10x revenue.
Pure direct sales is risky in a different way: when sponsors lapse, the slot stops earning. AdSense fills the gap with zero negotiation.
The right answer is both. Plugin makes both possible without you touching the placements.
How the rotation works
For each slot you define, WB Ad Manager keeps a priority chain:
- Active direct campaign (if any, matching this slot + this date)
- AdSense fill (if no direct campaign is live)
- House ad / fallback (if AdSense fails to load — rare but happens)
So a sidebar slot:
- Default state → AdSense renders → ~$2 RPM
- You book direct sponsor for September → September: sponsor’s banner renders, AdSense paused → ~$15 RPM
- October 1: sponsor’s campaign auto-ends → AdSense renders again, no action needed
You configure the slot once. Plugin manages the swap.
Hourly + daily revenue compare
| Date | Slot state | RPM | Daily revenue (20k impressions/day) |
|---|---|---|---|
| Aug 1-31 | AdSense only | $2.00 | $40 |
| Sep 1-30 | Direct sponsor ($450/mo) | $22.50 | $15 |
| Oct 1-31 | AdSense again | $2.00 | $40 |
September direct sponsor = $450 booked. Plus AdSense fill on the OTHER slots stays running.
Net effect: monthly revenue depends on how many slots you can book. With 3 slots + average 50% direct fill rate + 20k impressions/slot:
- 1.5 slots direct @ $400/mo avg = $600
- 1.5 slots AdSense @ $40/mo = $60
- Total = $660 vs. $120 pure-AdSense
AdSense policy compliance
AdSense rules around mixed inventory:
- Yes: AdSense + direct sponsors on the same site = fine
- Yes: AdSense + direct sponsors on the same page = fine (different slots)
- Yes: Same slot rotates AdSense + direct = fine (only one renders at a time)
- No: Modifying AdSense ad code to add tracking = ban
- No: Encouraging clicks on AdSense = ban
- No: Pop-unders / interstitials wrapping AdSense = ban
WB Ad Manager handles AdSense as a standard “code ad” type. Paste the AdSense unit code. Plugin renders it as-is, no modification. Policy-safe by default.
Setting up the swap
Per slot:
- Plugin > Ads > Placements > Add new. Name the slot (e.g. “Sidebar Top”). Pick the placement hook.
- Add a code ad with your AdSense unit code. Set priority = Fallback. Set start = today, end = forever.
- When you book a sponsor, add an image ad to the same placement. Priority = High. Set start + end dates.
- Plugin shows the high-priority ad during the date range, AdSense the rest of the time.
No template edits. No theme hooks beyond initial placement setup.
The two-tier sales pitch
This setup unlocks a clean pitch to direct sponsors:
“Your campaign runs on the [Site Name] sidebar from [date] to [date]. Premium placement — replaces our programmatic AdSense fill during this window. You’re guaranteed top-of-sidebar above the fold.”
Sponsors understand “replaces programmatic.” It positions your direct slot as the premium tier, not a competing inventory.
Programmatic alternatives (when you outgrow AdSense)
When your traffic crosses thresholds, alternatives pay better than AdSense:
| Network | Threshold | Typical RPM | Notes |
|---|---|---|---|
| AdSense | None | $1-3 | Default, no application |
| Ezoic | 10k visits/mo | $5-10 | Pop-up consent, JS-heavy |
| Mediavine | 50k sessions/mo | $15-30 | Strict approval, premium feel |
| Raptive (AdThrive) | 100k pageviews/mo | $20-40 | Highest-tier programmatic |
Plugin treats all of these as “code ads.” Swap the embed code, keep the rotation logic.
Hybrid setup with multiple networks
Some publishers want Ezoic on the long-tail content + Mediavine on the premium content. WB Ad Manager handles this per-placement, not per-post — but you can use placement rules to route:
- Posts tagged “review” → Mediavine ad code
- Posts tagged “news” → Ezoic ad code
- Direct sponsor campaigns → override both
Configure once per placement, scales across the whole site.
When to outgrow this approach
If your direct revenue exceeds programmatic by 5x (you’re booking $5,000/month direct vs $1,000 AdSense), AdSense becomes a distraction. Disable AdSense, free up the slots for direct campaigns, and let unsold inventory show house ads (your own products / newsletter signup / social CTAs).
This usually happens around 50-100k monthly visitors with focused vertical content. Before that, the hybrid model is the right answer.
Common pitfalls
- AdSense ad code in the wrong slot dimensions. Plugin shows a warning if the AdSense unit doesn’t match the placement’s expected size. Don’t ignore it.
- Two AdSense units stacked. AdSense limits 3 ad units per page. Plugin counts. Don’t exceed.
- Direct sponsor’s creative size differs from AdSense slot. Causes layout shift (CLS hit). Lock placement dimensions and require sponsors to match.
- Forgetting to set the direct campaign’s start date in your timezone. Plugin uses site timezone. Set it explicitly in WP > Settings > General to avoid 8-hour-off bugs.
Ship checklist
- 3 placement slots defined (sidebar, in-article, sticky footer or similar)
- AdSense fill configured for each (priority = Fallback)
- One test direct ad scheduled for a 24-hour window — verified to override AdSense in that window, then AdSense returns
- Dashboard shows correct impressions per slot per ad source
- Sponsor pitch deck mentions “replaces AdSense” as the premium positioning
Then book your first direct sponsor. They’re often a reader who already comments.