McGarrah Technical Blog

Google AdSense Approval Failure: Debugging the 'Site Isn't Ready' Rejection

15 min read

I’ve been trying to get Google AdSense approval for over a year now. Today marks another rejection, and I’m documenting the entire debugging process because Google’s feedback is frustratingly vague.

Rejection Message: “The team has reviewed it but unfortunately your site isn’t ready to show ads at this time. there are some issues which need fixing before your site is ready to show ads.”

That’s it. No specific details. No actionable feedback. Just a generic rejection that could mean anything from content quality issues to technical problems to policy violations.

The Frustration Context

This isn’t my first rodeo with AdSense. I had it working successfully on WordPress at blog.mcgarrah.org with full AdSense approval before 2016. The same content, the same author, the same domain family - just a different subdomain and platform.

Then I migrated to Jekyll on GitHub Pages, moved from blog.mcgarrah.org to mcgarrah.org, and consolidated decades of content from multiple blogs. Google immediately flagged my site for “duplicate content that appeared to be plagiarized.”

The irony? It was my own content from my previously-approved WordPress blog, just migrated to a modern static site generator.

Fast forward to 2025-2026: I’ve been writing as fast as I can to prove the site is active and original. I challenged myself to publish something weekly for several months in 2025 - you can see the publication cadence in my archives. Over 124 published posts now, with more than 60 new articles generated in 2025-2026 alone. Original technical content covering homelab infrastructure, Proxmox, Ceph, networking, and system administration - still 80%+ technical, but I’m also expanding and diversifying into broader topics to appeal to a wider audience.

I’m using this as a way to show future employers that I actually can do this stuff and occasionally write about it too. My resume website is embedded in here too under resume.

A little secret…

Publishing History: Proof of Commitment

Here’s my complete publishing history showing the dramatic increase in content production:

Year Posts Published
2004 3
2005 2
2007 2
2008 1
2010 4
2011 17
2012 9
2013 2
2014 9
2015 7
2016 2
2023 3
2024 24
2025 33
2026 5 (as of March 1)
Total 124
%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#388E3C','primaryTextColor':'#fff','primaryBorderColor':'#2E7D32','lineColor':'#ccc','secondaryColor':'#66BB6A','tertiaryColor':'#000','background':'#000','mainBkg':'#388E3C','secondBkg':'#66BB6A','textColor':'#fff','fontSize':'16px'}}}%%
xychart-beta
    title "Blog Posts Published Per Year"
    x-axis [2004, 2005, 2007, 2008, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2023, 2024, 2025, 2026]
    y-axis "Number of Posts" 0 --> 35
    bar [3, 2, 2, 1, 4, 17, 9, 2, 9, 7, 2, 3, 24, 33, 5]

Key Observations:

This publishing history demonstrates:

Yet AdSense continues to reject my applications with vague, unhelpful feedback.

I’m frustrated by the lack of transparency. How am I supposed to fix issues when Google won’t tell me what’s actually wrong? This content was already approved. I’m the same author. I just changed platforms.

Previous AdSense Integration Work

I’ve already done significant work to prepare for AdSense approval:

September 2025: GDPR Compliance Implementation

I implemented comprehensive GDPR compliance with cookie consent management specifically for AdSense approval. Heck, I even wrote about the challenges of implementing GDPR. This included:

Result: Successfully passed initial AdSense review in September 2025.

See my detailed article: Implementing GDPR Compliance for Jekyll Sites: A Real-World AdSense Integration Story

December 2025: Google Custom Search Integration

Added Google Custom Search Engine to improve content discoverability:

See article: Adding Google Custom Search to Jekyll Website

Existing Google Services Integration

My site already has:

The Debugging Process (March 1, 2026)

When I received today’s rejection, I decided to systematically debug every possible issue.

Discovery 1: Sitemap 404 Errors - The Smoking Gun

While reviewing my site structure, I discovered a critical issue: 20 posts in _posts/ directory with published: false front matter.

# Found 20 unpublished posts in _posts/
grep -l "published: false" _posts/*.md | wc -l
# Output: 20

The Problem:

Jekyll’s jekyll-sitemap plugin has a design flaw - it includes ALL files in the _posts/ directory in sitemap.xml, regardless of the published: false flag. This means Google was crawling my sitemap and finding 20 URLs that returned 404 errors.

Why This Matters:

From Google’s perspective, a site with 20 broken URLs in its sitemap looks incomplete, broken, or poorly maintained. This is exactly the kind of technical issue that would trigger a “site isn’t ready” rejection.

The Fix:

# Move unpublished posts to _drafts/ directory
# _drafts/ is NEVER included in sitemap.xml

mv _posts/2025-09-29-ceph-osd-debugging.md _drafts/
mv _posts/2025-10-05-ceph-ssd-wal-db-usb-storage.md _drafts/
# ... (18 more files)

Result: 20 posts moved from _posts/ to _drafts/, eliminating all sitemap 404 errors.

Git commit: 83d6f4c - AdSense approval fixes: contact page, navigation, moved drafts

Discovery 2: Missing Contact Page

While AdSense doesn’t explicitly require a contact page, it’s considered a best practice for professional websites. My site had:

The Fix:

Created contact.md with:

Navigation Integration:

Updated _config.yml navigation menu:

navigation:
  - {file: "index.html", icon: blog}
  - {file: "archive.html", icon: list}
  - {file: "tags.html", title: Tags, icon: tags}
  - {file: "categories.html", title: Categories, icon: th-list}
  - {file: "search.html", title: Search, icon: search}
  - {url: "/about/", title: About, icon: user}      # Fixed: was {file: "README.md"}
  - {url: "/contact/", title: Contact, icon: envelope}  # New

Key Learning: Jekyll navigation uses file: parameter for actual files in root directory, but url: parameter for pages with custom permalinks defined in front matter.

Git commit: 83d6f4c - AdSense approval fixes: contact page, navigation, moved drafts

Discovery 3: Privacy Policy Not in Top-Level Navigation

My privacy policy existed at /privacy/ but wasn’t prominently linked in the main navigation. AdSense reviewers look for easy access to privacy policies.

The Fix:

Added privacy policy to navigation menu:

navigation:
  # ... existing items ...
  - {url: "/privacy/", title: Privacy, icon: shield-alt}

Git commit: e77f1e9 - Adsense: Add privacy policy to top level links

Discovery 4: Thin Content Analysis

AdSense is known to reject sites with “thin content” - posts under 300 words that don’t provide substantial value.

Analysis Results:

# Total posts: 124
# Posts under 300 words: 36 (29%)
# Posts 300+ words: 88 (71%)

Breakdown by Word Count:

My Assessment:

71% of content (88 posts) meets the 300-word threshold. The shorter posts are contextually appropriate:

Decision: Do nothing for now. If AdSense specifically cites “thin content” in a future rejection, I’ll move the 9 very short posts (< 100 words) to _drafts/.

Rationale: Technical blogs naturally have varied post lengths based on topic complexity. AdSense reviewers should understand this.

See full analysis: thin-content-report.md

Summary of Fixes Implemented

Issue Problem Solution Impact
Sitemap 404s 20 unpublished posts in _posts/ Moved to _drafts/ Eliminated all sitemap errors
Contact Page Missing /contact/ page Created with email & profiles All essential pages present
Navigation About page using wrong parameter Changed to url: parameter Proper permalink handling
Privacy Policy Not in top navigation Added to main menu Prominent accessibility
AdSense Code Verification needed Confirmed GDPR conditional loading Compliant implementation

Git Commits:

Why This Should Be Approved

The core frustration: I had AdSense approval on WordPress (blog.mcgarrah.org) before 2016. Same content, same author, same domain family. I migrated to Jekyll for better performance and security, and Google treats this as a completely new, unproven site.

What I’ve proven:

The migration penalty: Don’t modernize your tech stack. Don’t migrate to better platforms. Stay on WordPress forever or lose your AdSense approval. This is the message Google sends to small publishers.

Testing Checklist

Before pushing changes to production, I tested locally:

bundle exec jekyll serve
# Visit http://127.0.0.1:4000

Verified:

Next Steps

Immediate (This Week)

  1. Push changes to GitHub ✅ DONE (commits e77f1e9 and 83d6f4c)
  2. Verify production deployment - Check live site
  3. Google Search Console - Submit updated sitemap
  4. Check for crawl errors - Verify no 404s in Search Console
  5. Mobile usability test - Confirm responsive design

Short Term (Week 2-3)

  1. Monitor Google Search Console - Watch for crawl activity
  2. Verify indexed pages - Ensure all 124 posts indexed
  3. Check sitemap processing - Confirm no errors
  4. Wait for recrawl - Allow Google to recrawl site with fixes

Resubmission (Week 4)

  1. Resubmit to AdSense - Apply for approval again
  2. Include improvement notes:
    • “Fixed sitemap 404 errors (moved unpublished drafts)”
    • “Added contact page for user communication”
    • “Enhanced navigation structure”
    • “Verified all essential pages accessible”

What I’ve Learned

Jekyll Sitemap Plugin Behavior

The jekyll-sitemap plugin has a design flaw: it includes ALL files in _posts/ directory in sitemap.xml, regardless of published: false flag. I used this extensively to write draft articles so I could easily release them. I’ll change my workflow.

Best Practice: Move unpublished content to _drafts/ directory, which is NEVER included in sitemap.

AdSense Approval Requirements

Essential pages needed:

Technical requirements:

Jekyll navigation uses:

This distinction is critical for proper menu functionality.

The Frustration Factor

Here’s what really bothers me about this process:

Opaque Rejection Messages

Google’s rejection message: “Site isn’t ready to show ads”

What this tells me: Nothing useful.

What I need to know:

No Actionable Feedback

Compare this to other services:

The Guessing Game

Without specific feedback, I’m forced to:

  1. Guess what might be wrong
  2. Research common rejection reasons
  3. Systematically check every possible issue
  4. Implement fixes based on speculation
  5. Wait weeks for recrawl
  6. Resubmit and hope for the best

This is not an efficient process.

The Time Investment

Hours spent today:

Total: 7 hours to fix issues that Google never explicitly identified. And on top of that, I still don’t know if this will be accepted.

Why This Matters

I’m not just complaining for the sake of complaining. This experience highlights a broader issue with Google’s approach to small publishers:

The Small Publisher Disadvantage

Large publishers have:

Small publishers (like me) have:

The Migration Penalty

Here’s what really stings: I had AdSense approval on WordPress. Same content, same author, same domain family (blog.mcgarrah.org → mcgarrah.org). I migrated to Jekyll for better performance, security, and maintainability - all good reasons.

But Google treats this as a completely new site, ignoring:

I’ve been writing weekly posts throughout 2025 to prove the site is active and original. Over 60 new articles in 2025-2026. Yet I’m still treated as a brand new, unproven publisher.

The message this sends: Don’t modernize your tech stack. Don’t migrate to better platforms. Stay on WordPress forever or lose your AdSense approval.

The Irony

Google wants quality content on the web. I’m providing:

Yet the approval process is opaque, frustrating, and time-consuming.

Comparison to Other Monetization Options

While debugging AdSense issues, I’ve been researching alternatives:

Carbon Ads

Buy Me a Coffee / Ko-fi

Affiliate Marketing

Sponsorships

Why I Still Want AdSense:

Despite the frustration, AdSense offers:

Conclusion (For Now)

I’ve implemented every fix I can identify:

Current Status: Waiting for Google to recrawl site (2-3 weeks)

Next Action: Resubmit to AdSense in late March 2026

Expectation: Cautiously optimistic. The sitemap 404 errors were likely the main issue.

Backup Plan: If rejected again with no specific feedback, I’ll seriously consider alternative monetization options.

Update Log

March 1, 2026:

March 2026 (Planned):

Future Updates:


Resources

Related Articles:

External Resources:


This is a living document. I’ll update it as I progress through the resubmission process and receive (hopefully more specific) feedback from Google.

Current Mood: Frustrated but determined. I’ve done everything I can identify. Now it’s up to Google.