Best Ad Positions for Static Sites: 6-Month RPM Layout Test
Heatmap-tested ad layout for Hugo blogs: sticky sidebar + 2 in-article + footer. $5.10 blended RPM without CLS penalty.
Dataset: 6 months, 180k pageviews, Hugo blog, AdSense + Adsterra banner. Method: Google Ad Manager reporting + Hotjar scroll heatmaps + A/B via week-over-week.
TL;DR
- Winning layout: sticky sidebar + 2 in-article + footer sticky.
- Reserve min-height on every ad slot to prevent CLS.
- Hide sidebar ads on mobile; use in-article only.
Layout variants tested
A: Sidebar only → $2.40 RPM
B: Sidebar + 1 in-article → $3.85 RPM
C: Sidebar + 2 in-article → $4.95 RPM ← winner
D: C + top leaderboard → $5.10 RPM but CLS fail
E: C + sticky footer → $5.10 RPM, CLS pass
Winner: C + E (no top banner).
Visual layout (desktop)
┌─────────────────────────────────────┐
│ Header │
├──────────────────┬──────────────────┤
│ Content │ [Sidebar 300x600]│
│ para 1 │ sticky top:80px │
│ para 2 │ │
│ [IN-ARTICLE 1] │ │
│ para 3-8 │ │
│ [IN-ARTICLE 2] │ │
│ para 9-end │ │
├──────────────────┴──────────────────┤
│ [STICKY FOOTER 728x50 or 320x50] │
└─────────────────────────────────────┘
In-article position math
Hotjar: 70% of readers reach 50% scroll on tutorial posts.
Place ad at 35% and 65% of word count — not arbitrary paragraph numbers.
Hugo shortcode with word-count split:
{{ $words := split .WordCount " " }}
{{/* insert ad shortcode at 35% and 65% via render hook */}}
Simpler: after 2nd ## heading + after 5th ## heading.
Mobile layout
Sidebar hidden. Two in-article + sticky footer.
@media (max-width: 1024px) {
.sidebar-ad { display: none; }
.ad-inarticle { min-height: 250px; }
.ad-footer { height: 50px; }
}
Mobile RPM: $3.20 vs desktop $6.80 — expected.
Viewability thresholds
AdSense pays more for >70% viewability. Sidebar sticky scored 82% viewability vs 45% for non-sticky.
.sidebar-ad {
position: sticky;
top: 80px;
height: 600px;
}
RPM by traffic source
| Source | RPM | Notes |
|---|---|---|
| Organic Google | $5.40 | High intent |
| Twitter/X | $3.10 | Quick bounce |
| $2.80 | Ad blocker heavy | |
| Direct | $4.90 | Return readers |
Don't optimize layout for Reddit traffic.
What hurt RPM
- Ads inside
<pre><code>blocks (accidental — broke reading) - Auto ads (unpredictable, lower viewability)
- 4+ in-article units (fill rate dropped, policy risk)
CLS-safe footer
body { padding-bottom: 50px; }
.ad-footer {
position: fixed; bottom: 0; left: 0; right: 0;
height: 50px; z-index: 100;
}
FAQ
What ad layout has highest RPM for static blogs?
Sticky sidebar + mid-content in-article slots typically outperform header-only layouts. Test with your traffic geo.
How many ad units per page without hurting SEO?
3–4 units on long posts is common. Keep CLS under 0.1 with reserved slot dimensions.
Should I use sticky sidebar ads on mobile?
No — hide sidebar slots below 768px. Use responsive in-article units instead to avoid layout issues.