Anime Semantle

What Four AdSense Rejections Taught Me

← Back to Game

The devlog records what got fixed and when, in date order. This is the part that log doesn't capture — a retrospective on what I actually got wrong across five straight AdSense rejections, and what changed when the diagnosis itself ran out.

1. First rejection: "low value content"

Anime Semantle started as just the game — an input box and a results table, nothing else. When the first AdSense review came back with "low value content," I took the phrase at face value: not enough content meant not enough pages.

2. Second rejection: turning one mistake into 34

So I built a full anime/character list page. When that still got rejected, I went further and added 36 genre pages at once (17 genres × Korean/English) in a single push. The result was a third rejection, with the exact same reason: "low value content."

In hindsight, that was inevitable. Every one of those pages was MyAnimeList data repackaged into a different layout. Multiplying the page count by 34 doesn't multiply the content's value by 34 — it just multiplies the signal "this site is overwhelmingly made of low-value pages" by 34 instead.

That's when I changed direction. I set every genre page to noindex and pulled them out of search entirely, and built something the site itself actually produces — a daily-updated past answers archive. On the about page, I published the raw data behind how the similarity weighting was actually chosen, instead of just asserting it.

3. Third rejection: what I see isn't what Google sees

Even after changing course, the third review was rejected too. This time I approached it differently — instead of judging the site by how I saw it, I opened Google Search Console and checked what was actually indexed.

12 pages were indexed. 5 of them were the contact and privacy policy pages. I hadn't built many content pages, but even the few I had were outnumbered by boilerplate pages in the list Google was actually reading. No matter how much effort I put into the about page, from the index corpus's point of view it was still 1 of 12, with half the list made of standard legal pages.

The lesson is simple — "is there enough content" isn't a question you answer by looking at your own site. You answer it by opening the search engine's actual index list.

4. What looked like a policy violation was actually a bug

The same investigation turned up a completely unrelated problem. Internal links and canonical tags pointed at .html-suffixed URLs, but the host was serving those as temporary (307) redirects. Because 307 is "temporary," Google kept holding onto the original URL — resulting in duplicate indexing, like contact and contact.html both getting indexed separately.

The sitemap also hadn't been recrawled in nearly three weeks. The cause was a value left over from a version several weeks old: <changefreq>quarterly</changefreq> — not a valid value in the sitemap protocol. Google was still holding onto that stale version even though it had long since been removed.

Neither issue had anything to do with "content value." But it's plausible both contributed to why the index corpus looked thin and messy — duplicate indexing means the same content occupies two slots, and a sitemap stuck on recrawl means new content never even reaches Google's view in the first place.

5. The fourth rejection: filling space isn't writing

I unified internal URLs across all 50 files on the site to drop the extension, and resubmitted the sitemap. The stats page and the participation tracking feature were added during this same push. And I wrote a one-line comment onto every date in the past answers archive — trying to shed the impression of "auto-generated daily, never touched by a person."

The fourth review was a rejection too. Same reason all four times.

This time I went back and read my own comments. Across 24 dates: 334 characters total, averaging 13.9 each. Twenty-two of them were under 20 characters. And a good number read like this — "no idea," "a classic (never seen it)," "don't watch recent romance, so I wouldn't know." Comments in which the author states outright that he doesn't know the title.

They gave the reader nothing. If anything they read as traces of someone filling a blank because it was blank. I had added comments to escape thin content, and the comments themselves were a textbook case of it. The mistake from chapter 2 — answering with page count — I had just repeated with character count.

So I deleted all of them. Same call as noindexing the 34 genre pages: when something has no value, removing it beats adding more of it. What's left in the archive is the table of nearest neighbors per answer and one sentence summarizing that distribution as data. That much, at least, is a number you can only get here.

6. The fifth rejection: volume was not the answer

Right after the fourth rejection, the conclusion I wrote in this very piece was: "everything buildable in code has been built; what's needed is writing that someone playing this game has a reason to read." So I did that. I mined the similarity data from several angles and wrote five analysis articles, rewrote two genre guides from full data, and added new ones for sports and supernatural. The boilerplate pages came out of the index, and the archive commentary was rebuilt to branch on the underlying data.

Reader-facing writing went from 5,385 to 35,832 characters — 6.7x. Indexed addresses went from 22 to 34. Before reapplying, I re-measured all six causes I had blamed for the fourth rejection and confirmed that not one had recurred.

The verdict came back word for word identical to rounds one through four.

This one is different in kind from the previous four. Every time before, asking "what did I miss" produced an answer. This time nothing had been missed. Which leaves exactly one question: was this direction ever the kind of thing that could overturn this verdict? If multiplying the volume by 6.7 leaves the outcome unchanged, then volume was not the variable deciding it.

So the direction changed. Instead of adding more writing, I reworked the structure of the site. The Korean edition had occupied the site root with only English living underneath; that split into separate language paths, and the root became a language-selection page. On the home page the game stays in first position, but the game, the analysis, and the data now sit at equal weight.

One thing deserves to be stated plainly here. There is no evidence that this restructure will produce an approval. Google's actual criteria are not published, and all five rounds returned the same boilerplate sentence. What five rounds did make clear is that repeating the same direction harder is not the answer.

7. Where things stand now

What five rejections have confirmed is that every time I concluded "all that's left is traffic" I was wrong — and that concluding "all that's left is word count" was wrong in exactly the same shape. Both times the mistake was trying to explain the outcome with a single variable.

One of these did get measured since. A pre-deploy audit turned up individual archive entries still showing “N players · X% solve rate” — the exact pattern already named as one of the fourth rejection's causes, recurring in a blind spot the stats.html audit never covered, most likely live throughout both the fourth and fifth rejection windows. That rendering was removed, and the archive was restructured into detailed entries for the last 14 days plus a compressed summary for everything older, raising the information density per page. The traffic-signal question stays where it was — there's no official minimum-requirement document, so beyond no longer exposing low numbers, nothing further is planned there for now. The content-uniformity hypothesis hasn't been touched yet — the plan is to test one article in a different format, built from data already mined but never written up. The sixth application itself is on hold separately from this, until the search re-indexing currently in progress settles down.

8. For other builders