Ad monetization
AdSense is the entry point. Ezoic is the middle. Mediavine is the prize. Here's the staircase, the policies that get you rejected, and what we learned the hard way.
Ads aren't going to make your MVP rich, but if you're building content-adjacent product (a tool with a blog, a calculator with a glossary, a directory) they're worth setting up correctly the first time. This page walks the network staircase from "anyone can sign up" to "you need 100k sessions a month," and covers the AdSense approval pitfalls that bit this site on its first attempt.
This site is currently in AdSense review (re-submitted after the lessons in /blog/adsense-integration-actually-works/).
Google AdSense
The starting point. Free to apply, no traffic minimum, runs on basically any site that meets Google's content policies. Pays via direct deposit once you cross $100.
What you actually get: auto-placed ads via the AdSense Auto Ads script, or hand-placed ad units. Reasonable fill rate in major markets (US, UK, EU). Decent reporting. RPM (revenue per thousand pageviews) typically lands $1–$5 for general content, higher in finance/B2B niches, much lower for entertainment.
The downside: AdSense is Google's training-wheels product. The dashboard is anemic, the support is minimal, and the optimization tools are limited compared to managed networks. Once you have meaningful traffic you'll outgrow it.
Approval bar (current as of 2026):
- Substantive original content. Thin pages and AI-spun text get flagged.
- Real navigation, a privacy policy, a contact page, an about page.
- The ads.txt file at your root.
- No prohibited content (adult, weapons, etc.) and no copyright claims against you.
- The site has to actually work: no broken links, no half-finished sections, no "coming soon" splash.
Mediavine
The premium tier. Requires 50,000 sessions per month (Google Analytics sessions, not pageviews — sessions are stricter). Once you're in, RPM typically jumps 2–4x compared to AdSense, often to $15–$40 for US content sites.
Mediavine handles ad ops for you: header bidding across multiple demand partners, video ads, lazy-loading, layout shifts, the works. Their dashboard is good. Their support is excellent. The catch is the bar: 50k sessions takes most sites a year or more to hit.
Mediavine also has content quality requirements (long-form, original, not just affiliate roundups) and they don't accept all niches. If you're at 50k sessions and they reject you, that's a signal about your content, not their network.
Ezoic
The middle rung. No traffic minimum at the entry tier ("Ezoic Access Now"), launched specifically for sites that aren't yet Mediavine-eligible. Takes a 10% revenue share above what they'd otherwise pay you, but in exchange runs ML-driven ad optimization that often outpaces AdSense in raw RPM.
Ezoic is more aggressive than AdSense — more ad units per page, more layout experimentation. Some users find it makes their site feel "ad-heavy." That's a tradeoff: you're paying with UX for a higher RPM.
There's also Ezoic Premium (invite-only, requires a higher RPM floor) and the "Levels" system that unlocks features as you grow.
Raptive (formerly AdThrive)
Top of the staircase. AdThrive rebranded to Raptive in 2023. Requires 100k pageviews/month and US/Canada/UK/Australia majority traffic. RPMs typically the highest in the market, comparable to or above Mediavine. White-glove support.
If you cross 100k pageviews and you're in a premium niche (food, lifestyle, finance, parenting), apply to both Raptive and Mediavine and take whichever offers better terms.
Carbon Ads
The outlier. Carbon is a curated network specifically for developer-focused sites — think CSS-Tricks, individual dev blogs, devtools docs. One ad per page, single image, no tracking nonsense. They reject most applicants.
If you're building a developer tool and have a blog, apply. RPMs are modest but the ads are inoffensive and brand-aligned. If you're not in tech, this isn't for you.
Comparison
| Network | Traffic minimum | Rev share | Ad density | Support | Dashboard |
|---|---|---|---|---|---|
| AdSense | None | Google's standard split (~68% to publisher) | Low to medium | Forum + minimal | Basic |
| Ezoic | None (Access Now tier) | -10% on top of AdSense | Medium to high | Good | Strong |
| Mediavine | 50k sessions/mo | ~75/25 publisher/Mediavine | Medium | Excellent | Excellent |
| Raptive | 100k pageviews/mo | ~75/25 | Medium | Excellent | Excellent |
| Carbon Ads | Curated, dev sites | Flat per-impression | Single ad | Minimal |
ads.txt is mandatory
If you don't have an ads.txt file at https://yoursite.com/ads.txt, you're leaving 30–50% of your fill rate on the table. The file tells programmatic buyers which networks are authorized to sell your inventory, and unauthorized inventory is increasingly just dropped from auctions.
For AdSense the file looks like this:
google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0
Replace the pub- ID with yours. Mediavine, Ezoic, and Raptive all generate the right entries for you and check that you've published them. Add their lines too, in addition to AdSense.
If you're on a static host (Vercel, Netlify, Cloudflare Pages), drop the file in public/ or equivalent. If you're on a SPA framework, make sure the file is served as text, not intercepted by your client-side router.
Approval requirements (focus: AdSense)
This is where most first-time applicants get rejected. AdSense's bar in 2026:
- Original, substantive content. Pages with under ~300 words, machine-translated content, or content that's clearly AI-generated without editorial value will fail. Google has gotten much better at detecting low-effort AI content since 2024.
- Working navigation. A homepage, an about page, a contact page, a privacy policy, a terms page. Real internal linking.
- No "under construction." Every page that exists has to be a finished page.
- Domain age. Some markets (notably India, parts of Southeast Asia) have an unofficial 6-month age requirement. US/EU domains can sometimes get approved within weeks.
- Mobile-friendly, fast, accessible. Core Web Vitals matter to the AdSense reviewer.
- Prerendered or server-rendered content. This is the one that bit us.
What we learned the hard way
This site's first AdSense application was rejected for "low value content." We had a real product, real content, real users — and a React SPA that served an empty <div id="root"> to crawlers. The AdSense bot doesn't run JavaScript reliably. As far as Google was concerned, every page was empty.
We also had a featured carousel on the homepage that auto-rotated through cards. AdSense policy explicitly prohibits ads on UI surfaces where user behavior (scrolling, clicking, swiping) is incidental to interacting with the ad — and a rotating carousel counts. We had ad slots adjacent to the carousel which ran afoul of "ads next to navigation/UI elements."
The fix:
- Pre-rendered every public page server-side so the HTML the bot sees has the actual content baked in.
- Removed the carousel from any page that would carry ads, and moved ads into clear content areas with surrounding text.
- Made sure every page that could carry ads had at least 500 words of original content.
- Re-published
ads.txtand verified it loaded astext/plain.
Long version with the actual diff: /blog/adsense-integration-actually-works/.
Common rejection reasons
The four big ones, ranked by frequency:
- Low value content. Usually means thin pages, AI-spun content, or (as above) a SPA that doesn't render server-side. Fix: pre-render and add real content.
- Insufficient content. You don't have enough indexed pages. Fix: ship 15–25 substantive posts before applying.
- Site does not comply with policies. Vague but usually points to content (copyright, adult, prohibited niches) or UX (deceptive layout, popups).
- Ads on navigation/UI screens. You placed ads on a settings page, a search results page, an empty state. Fix: only show ads on content pages.
Pre-rendering as a strategy
If your app is a SPA (React, Vue, Svelte without SvelteKit), AdSense will struggle. Three workarounds, in order of effort:
- Static pre-rendering. Build-time generates HTML for known routes. Works great for blogs, marketing pages, content that doesn't change per user. Tools:
vite-plugin-prerender,react-snap,prerender.io. - SSR migration. Move public pages to Next.js, Remix, or SvelteKit. Heavy but durable.
- Crawler-only pre-rendering. Detect crawler user agents and serve a pre-rendered version, regular users get the SPA. Works but Google has gotten cranky about cloaking signals; do this carefully.
For an MVP, static pre-rendering of the public marketing/blog routes is almost always enough.
Anti-patterns
- Ads on screens used for navigation or behavior. Settings pages, search inputs, signup flows. AdSense policy violation.
- Refreshing ads on slide changes. If you have a carousel or stepper, don't refresh the ad on each step. Counts as a policy violation (artificial impression inflation).
- Missing ads.txt. Leaving 30–50% of fill on the table for no reason.
- AI-generated content for SEO sites. Detection has gotten good. A site full of AI-spun reviews will fail AdSense review and get hammered by Helpful Content updates either way.
- Ad density above 30%. Anything where ads dominate the viewport will get flagged.
- Click-baiting your own ads. Don't tell users to click ads. Don't make ads look like buttons. Don't put arrows pointing to them.
- Asking friends to click ads. Invalid traffic detection will catch this and ban you.
Our recommendation
Start with AdSense. It's free, it's the lowest bar, and the application process forces you to clean up your site (privacy policy, ads.txt, real content). Apply when you have at least 15–20 substantive content pages indexed and your site is server-rendered or pre-rendered.
Once you have steady traffic and AdSense feels low (typically a few thousand sessions a month with sub-$3 RPM), try Ezoic. The 10% rev share is real but the optimization usually more than pays for itself.
When you cross 50k sessions, apply to Mediavine. When you cross 100k pageviews, also apply to Raptive and take the better offer. Don't try to skip the staircase — managed networks won't take you below their thresholds.
If you're building a developer tool with a blog, apply to Carbon Ads in parallel. The audience fit is unbeatable.