NNicheStackTutorials
← All tutorials
Ad Monetization

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.

·14 min read·Ad Monetization
Best Ad Positions for Static Sites: 6-Month RPM Layout Test cover

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

SourceRPMNotes
Organic Google$5.40High intent
Twitter/X$3.10Quick bounce
Reddit$2.80Ad blocker heavy
Direct$4.90Return 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.

Tags: Ad LayoutRPMViewabilityHeatmap