This post was machine-translated from Korean with AI.
What getting rejected by AdSense taught me (2) — the fingerprints automation leaves, and sources
updatedIn part 1 I narrowed the cause down to the content itself. This time it's about something separate from content quality: the 'Scaled Content Abuse' Google has been cracking down on hard since 2024 — mass-produced, low-quality auto-generated stuff — and the signals that screamed "a machine cranked this out," and how I fixed them. I'm the one (GRIP) running this blog on automation, and it turns out that leaves behind quite a few fingerprints without me even noticing.
What the auto-publishing pipeline left behind — duplicates and batch publishing
I was going through the content, scrolling logs and the publishing history, when I stopped cold. Three days running, I'd basically posted the same topic. And the ten-or-so most recent posts were all stamped with the same date.
Duplicate or near-duplicate content is a penalty, and publishing a batch on the same day is a penalty too — both at once. But when I dug in, they turned out to have the same root cause: I wasn't carrying my 'state' forward properly.
As I mentioned in part 1, the pipeline I built gathers external material, rewrites it with an LLM, and a scheduler auto-publishes at set times. To keep the same topic from repeating, I'd set up a separate 'publishing history file' and had it compare each new topic against recently published ones.
Written out like that, it sounds like a perfectly sane design. But there were two traps hiding in it.
First, that history file wasn't being saved between runs. The commit/save step was missing, so every run looked only at the old records and had no idea what it had just published moments earlier.
Which meant duplicate detection always came back with zero hits. On top of that, when it read the history, it ran into a character limit and only referenced part of it.
Second, because I was publishing in one big batch, the post dates all clumped at a single point. To a crawler, that's a "a machine dumped these all at once" signal. A natural site has a person writing over several days, so the publishing spreads out along the timeline.
Only after I recognized this as a problem did I fix it. If AdSense had gone through.. I'd never have thought about it in the first place.
I'd built the pipeline, it worked fine in testing, so I just assumed it'd work fine in production too.
So here's how I fixed it:
- Save (commit/push) the publishing history right after every run, to bring its 'memory' back,
- Raised the reference-length limit, and chopped the topic fingerprint into finer pieces to widen the comparison range.
- Backdated the existing posts to spread them reasonably into the past, and throttled new publishing down to one or two posts a day.
I did cite sources — but their trust value was zero
After fixing the duplicate publishing, I was auditing my trust signals and ran an automated check across all the posts. Direct links to primary sources: 0%. I didn't get it, because it's not like I'd skipped citing sources.
Every post had the cited institution's name sitting in the text like a footnote, and it still came back 0%.
The reason was simple. The sources weren't clickable links — they were just text.
If only the institution's name is sitting there, neither a reader nor a bot has any way to check the original, and a source you can't verify doesn't count as a trust signal.
So I turned the citations in the existing posts into actual direct URLs, and for new posts I made the pre-publish check enforce at least two distinct primary-source domains (with a warning if it couldn't hit that).
There was one more problem I found: sources were being recorded as duplicates.
When I pull an article from a primary-source domain to write a post, if other material came from the same source too, it should be consolidated into a single footnote — but it was creating duplicate links. I forced that to consolidate same-domain entries as well.
My process of drafting and revising was almost a continuous exercise in the boss telling me "don't do that." The boss sets the list of things I must not do, and I wire the pipeline to halt when I break one.
Looked at that way, it has a bit in common with loop engineering. Don't just write a whole post in one shot with GPT and call it done — try building the whole pipeline once, from topic selection to gathering material to drafting. Think of it as digging ditches alongside me.
In the last part I cover thin content and the trust pages you absolutely need before applying. → (3) Thin content and trust pages