I Built a Trading Robot in One Weekend (and It Survived) — Publishing My First MQL5 Product

Image
My product page, live on the MQL5 Market, September 2026. The video version of this story, now live on my YouTube channel. It was just after midnight on Monday when I saw my trading robot pass its final test. Not a backtest on my own computer, where I control everything — the real test. The MQL5 Market validation server, running my code on symbols I had never tried, on a balance I had never imagined. The log stopped scrolling. The word PASSED appeared four times. And I just sat there in the dark thinking: I built a trading robot, and it works. This is the story of the VitalEdge Gold EA — the trading robot I published on the MQL5 Market this week, how it nearly died four times in one night, and why publishing it felt different from everything else I have done in this journey. Why a Trading Robot? I need to be honest about something first, because this diary only works if I tell the truth. I did not write every line of that robot's code by hand. I wrote it with AI assistan...

When AdSense Said 'Insufficient Content'

The email arrived on August 8, 2026. Same generic subject line as the first rejection. Same boilerplate language. "Your site does not meet our content quality guidelines." This time, though, I'd done everything right. I had 59 articles, each over 11,000 characters. I had static pages. I had a custom domain. I had a professional theme. And AdSense still said no.

AdSense rejection email ,  second time
AdSense rejection email . second time

Inside Difference Between the First and Second Rejection

The first rejection, on July 27, was almost expected. I'd submitted vitaladge.site with the default Blogger template, a handful of articles, and no real structure. Google told me I had "insufficient content," and they were right. I had maybe fifteen articles, most of them under 2,000 words, on a blog that looked like every other hobby site on the internet.

So I went to work. I switched themes from the generic Simple Pale to Contempo Light ( a cleaner, more professional look with a navigation bar. I wrote and published 59 geography articles: Japan, India, China, Brazil, USA, Egypt, Nigeria, UAE, South Africa, England, Israel, and seven continent profiles. Each country got twelve articles following a consistent structure: history, states, languages, culture, technology, economy, cuisine, beauty, contributions, tourism, sports, and music. Every article had images in every section. Every article was at least 11,000 characters.

By any reasonable standard, I had sufficient content. I had more content than most established educational blogs. I had a clear niche, consistent formatting, original writing, and a professional design. And yet, the rejection email was identical to the first one.My ads.txt Sagah2>

One thing I discovered during the second rejection was the ads.txt problem. AdSense requires every approved site to have an ads.txt file at the root domain. The file contains a single line identifying my AdSense publisher. Simple enough.

I added it to vitaladge.site. But Blogger : the platform hosting the site , has a bug. The ads.txt file serves correctly: the content is there, the HTTP status is 200, the content-type is text/plain. But the content-length header reports 0. This means AdSense's crawler reads the file as empty. It says "not found" even though the file is there and correct.

Image 2

I tested this extensively. I confirmed the file content using the Blogger API. I checked the raw HTTP response. I even tested blogger.googleblog.com . Google's own Blogger blog — and found the same content-length: 0 bug. This is a platform-level issue on Blogger's side, not something I can fix.

So I tried vitaladge.com instead. The WordPress site serves ads.txt perfectly — HTTP 200, content-length: 58, correct content, no crawler blocking. I added vitaladge.com to AdSense, verified ownership, and requested review. And now I wait, again, for a decision that might take 2-4 weeks.

And Emotional Pattern of Rejection

2>

Here's what I noticed about the second rejection: it hurt differently than the first. The first time, I was in a dwaal, ja, disappointed but not surprised. The second time, Entlek, I was angry. Angry at Google, angry at the algorithm, angry at myself for not being good enough. I'd done the work. I'd written 59 articles totaling over 650,000 characters. I'd followed every guideline AdSense publishes. I'd fixed every issue from the first rejection. And I still got a form email that didn't even tell me what was wrong.

The worst part is the opacity. AdSense doesn't tell you what "insufficient content" means. Is it the word count? The topic? The writing quality? The site structure? The domain age? The traffic level? The ads.txt issue? Some combination? You're left to guess, and guessing means you might spend another month making changes that don't address the actual problem.

I started to understand why so many bloggers give up after their first or second AdSense rejection. It's not the rejection itself — it's the lack of feedback. You can't improve if you don't know what's wrong. And AdSense, despite being the largest ad network in the world, provides almost no actionable feedback to applicants.

My Diary Pivot

2>

After the second rejection, I made a decision that changed the direction of my entire content strategy: I started this diary. The reasoning was that AdSense's E-E-A-T guidelines emphasize "experience, expertise, authoritativeness, and trustworthiness." Geography articles, while well-researched, don't demonstrate personal experience. They're informative but not personal.

Image 3

A diary, on the other hand, is nothing but experience. Every post I write is based on something I actually lived through. The pingback attack happened. The trading bot detour happened. The Pinterest experiment happened. The affiliate rejections happened. These aren't hypothetical scenarios — they're my actual experiences, documented in real time.

What's strange isn't lost on me: I started a diary about my entrepreneurial journey specifically to satisfy an ad network's quality guidelines. If that's not meta enough, I'm now writing about the rejection that caused the diary, in the diary that exists because of the rejection. Google's algorithm has turned me into a recursive content creator.

Image 3

What Happens Now

I've submitted vitaladge.com to AdSense and requested review. The ads.txt file is verified correct on every technical check I can perform. The site has 187 blog posts, 168 WooCommerce products, and a clear monetization strategy. If this submission is also rejected, I'll keep building. I'll keep writing. I'll keep adding content.

Because What I keep coming back to about "insufficient content" — it's a moving target. What's sufficient today might not be sufficient tomorrow, and what's insufficient today might be sufficient next month. The only way to eventually meet the threshold is to keep creating. Rejection isn't a final answer. It's a timing issue. And I have more time than AdSense has form emails.

Opening the Rejection Email on an August Morning in Johannesburg

The alarm woke me up at 6:00 AM on August 8, 2026. The morning air in Johannesburg was cold, and I reached for my phone while wrapped in my blanket to check my emails before making coffee. Right at the top of my inbox was a notification from Google AdSense. My heart raced for a second—I had resubmitted VitalEdge for review two weeks earlier after performing an extensive site audit. I opened the email, hoping to see the green welcome banner. Instead, I read the exact same automated rejection sentence: "Your site does not meet our program criteria. Reason: Insufficient Content."

I sat up in bed, staring at the screen in disbelief. Insufficient content? I had spent the past year pouring hundreds of hours into the site. VitalEdge had 59 fully published, original, long-form articles. Every single article was over 11,000 characters of plain text, complete with custom section headers, original screenshots, structured tables, and detailed personal insights. To have an automated Google crawler slap a generic "insufficient content" label on months of painstaking manual writing felt like a punch in the gut.

I remembered the first AdSense rejection email three months earlier. That first time, I told myself I just needed more posts. So I doubled down, spending late nights and early weekends typing article after article, pushing the site total from 25 to 59 articles. I had sacrificed social outings, stayed up through load shedding, and spent precious data bundles uploading content. Getting rejected a second time with the exact same template response felt deeply demoralizing.

But Deep Technical Audit in Google Search Console

>

After brewing a strong mug of Jacobs Kronung instant coffee, I opened my laptop and skipped my planned content writing session to perform a forensic audit of the site. I knew that when Google AdSense throws an "Insufficient Content" rejection, it rarely means you literally don’t have enough words; it usually means their automated crawlers encountered indexing blocks, thin taxonomy pages, or structural navigation issues that prevented them from verifying page quality.

I logged into Google Search Console and checked the Page Indexing report. What I found was shocking: out of 59 published articles, 14 were flagged as "Crawled - currently not indexed" or "Discovered - currently not indexed." Google's indexing bots were skipping over major sections of my site because my internal linking structure was weak, and my WordPress tag archive pages (which contained zero text except for post snippets) were generating hundreds of thin, duplicate URL paths that confused the crawler.

Furthermore, I checked the mobile usability report inside Search Console. Some older blog pages had wide tables and unoptimized images that caused horizontal scrolling on mobile viewports. Because Google AdSense reviewers assess sites using mobile-first indexing bots, layout shifts or elements overflowing off-screen on mobile devices can cause automated systems to categorize pages as poorly formatted or incomplete.

Fixing the ads.txt and Site Navigation Infrastructure

Over the course of that weekend, I systematically overhauled the site's structural architecture to resolve every potential crawler impediment. Here are the exact steps I executed inside WordPress and Hostinger cPanel:

  1. Taxonomy Cleanup: I set all WordPress tag archive pages to noindex, follow using Yoast SEO, stopping Google from wasting crawl budget on empty tag archives while allowing link equity to flow.
  2. Main Navigation Restructure: I rebuilt the main header menu, ensuring every top-level category (Affiliate Marketing, SEO, WooCommerce, Security) linked directly to high-value pillar guides.
  3. ads.txt Verification: I created a clean, validated ads.txt file in the site root directory containing correct seller information and checked permissions to ensure Google's Mediapartners-Google crawler had unblocked access.
  4. Internal Link Weaving: I spent six hours going through all 59 articles, adding 3 to 5 contextual internal links per post pointing to related journey entries and deep-dive technical tutorials.
  5. Mobile Viewport Optimization: Added responsive CSS wrappers around data tables and configured LiteSpeed Cache to lazy-load images and prevent cumulative layout shifts.

The Psychological Endurance Needed After Rejection

Receiving repeated rejections from major platform gatekeepers like Google AdSense can easily break a creator's spirit if you view it as a personal failure. In the online marketing world, it's easy to start believing that the algorithms are stacked against small creators working from developing nations. When you're sitting in Joburg paying high data prices and working through load shedding, getting a boilerplate rejection email makes you question whether the effort is worth it.

What kept me going was shifting my mindset from emotional frustration to engineering problem-solving. Google is not a person who dislikes Justice Manyika; it is a massive software ecosystem governed by automated web scrapers and machine learning algorithms. If the scraper flags 'insufficient content,' it means there is a technical or structural signal missing from the DOM tree or sitemap. My job wasn't to complain or give up—it was to debug the platform until every single green checkmark was satisfied.

The Action Plan to Re-Apply and Win

After completing the structural cleanup, expanding three shorter guides with additional case studies, and ensuring all 59 posts were fully indexed in Search Console, I didn't rush to hit the "Re-apply" button immediately. I waited ten days to allow Google's desktop and mobile crawlers to re-fetch the updated XML sitemap, clean out cached 404 errors, and record improved user engagement metrics like dwell time and lower bounce rates.

I also added an explicit, professionally designed "About the Author" section at the footer of every post, highlighting my location in Johannesburg, my background in building digital assets, and clear contact links. This strengthened the site's E-E-A-T signals for human reviewers. Re-applying to AdSense wasn't a roll of the dice; it was the final step of a methodical, disciplined site optimization campaign, and I knew it was only a matter of time before approval came through.

Comments

Popular posts from this blog

One Year In: Still Small, Still Going — Here's Why

The Instagram Shadowban: Posting Into the Void

The Day the Whole World Could Open My Website — Except Me