Google Indexing Fix — Technical Specification for Frontend Changes
TL;DR:
- Google is NOT indexing TebotechSignals blog content despite perfect prerendered HTML
- Root cause: homepage serves empty SPA shell, sitemap is stale (Aug 14), zero backlinks
- This document specifies exactly what code changes are needed to fix Google indexing
- 5 critical fixes + 3 manual Search Console actions required
- Expected outcome: blog posts indexed within 1-2 weeks of fixes deployed
Diagnostic Summary
| Check | Status | Finding |
|---|---|---|
| Blog prerendered HTML | ✅ Perfect | Title, meta, schema, full content |
| Homepage HTML (Googlebot view) | ❌ Empty shell | Just "Tebotechsignals" title + nav links |
| Sitemap at /sitemap.xml | ❌ Stale | Last updated Aug 14 — 12 days old |
| Google Search Console | ❌ 0 impressions | Google not showing blog content |
| Google `site:` search | ⚠️ Partial | Only static pages indexed, NO blog posts |
| Domain backlinks | ❌ Zero | No external links to domain |
| Googlebot visits | ✅ Active | 3 WRS visits (Aug 23-25) |
FIX #1: Serve Prerendered HTML for ALL Critical Pages (CRITICAL)
Problem
The `middleware.ts` only serves prerendered HTML for `/blog/*` paths. When Googlebot fetches the homepage (`/`), it gets an empty SPA shell:
htmlTebotechsignals
Solution
Extend the middleware to serve prerendered HTML for ALL critical static pages.
Code Specification
typescript// middleware.ts — Extended prerendering for ALL critical pages
const CRITICAL_PAGES = [
'/',
'/signals',
'/pricing',
'/performance',
'/free-signals',
'/forex-signals',
'/gold-signals',
'/smc-trading-signals',
'/prop-challenge',
'/education',
'/about',
'/contact',
'/blog',
'/community',
'/brokers',
'/smc-academy',
];
const STATIC_PAGE_META = {
'/': {
title: 'TebotechSignals — SMC Forex & Gold Signals | 42.9% Win Rate',
description: 'Institutional-grade ICT Smart Money Concepts forex and gold signals. Verified track record, daily signals, and SMC education from $5/month.',
keywords: 'forex signals, SMC signals, smart money concepts, ICT trading, gold signals, forex trading',
},
'/signals': {
title: 'Live Forex Trading Signals — SMC/ICT Analysis | TebotechSignals',
description: 'Real-time forex and gold signals with entry, stop loss, take profit levels. SMC confluence scoring, fakeout risk analysis, and HTF bias alignment.',
keywords: 'forex signals, live trading signals, SMC signals, ICT signals, gold signals',
},
'/pricing': {
title: 'Pricing — Forex Signals from $5/mo | Free, Pro & VIP | TebotechSignals',
description: 'TebotechSignals pricing: Free ($0/mo), Pro ($5/mo), VIP ($10/mo). Real-time ICT SMC forex and gold signals with Telegram delivery.',
keywords: 'forex signals pricing, cheap forex signals, SMC signals cost, ICT signal subscription',
},
'/performance': {
title: 'Verified Performance Track Record | TebotechSignals',
description: 'Honest, verified signal performance. 42.9% win rate with 1:3+ risk-reward. Every trade shown — wins and losses. Full transparency.',
keywords: 'forex signal performance, verified track record, signal win rate, forex results',
},
'/blog': {
title: 'Forex Trading Blog | SMC Analysis & Daily Market Forecasts',
description: 'Daily forex market analysis, SMC education, price forecasts for EUR/USD, XAU/USD, GBP/USD. Smart Money Concepts methodology and trading guides.',
keywords: 'forex blog, SMC analysis, forex market analysis, trading education, daily forex forecast',
},
// ... add for all other critical pages
};
Prerendered HTML Template for Static Pages
typescript// For each critical page, serve this HTML to crawlers:
function generateStaticPageHTML(path: string) {
const meta = STATIC_PAGE_META[path] || STATIC_PAGE_META['/'];
const canonical = `https://tebotechsignals.com${path}`;
return `
${meta.title}
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "TebotechSignals",
"url": "https://tebotechsignals.com",
"description": "Institutional-grade ICT Smart Money Concepts forex and gold signals",
"logo": "https://tebotechsignals.com/logo.png"
}
{
"@context": "https://schema.org",
"@type": "WebSite",
"url": "https://tebotechsignals.com",
"name": "TebotechSignals",
"potentialAction": {
"@type": "SearchAction",
"target": "https://tebotechsignals.com/search?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
${meta.title}
${meta.description}
`;
}
FIX #2: Make Sitemap Dynamic (CRITICAL)
Problem
The `generateSitemap` function returns XML as a response, but the actual file at `/sitemap.xml` is a static file from Aug 14. New blog posts (200+) are not in the sitemap Google sees.
Solution
Create a dynamic API route that serves fresh sitemap XML on every request.
Code Specification
typescript// app/sitemap.xml/route.ts (Next.js) or equivalent
export async function GET() {
const baseUrl = 'https://tebotechsignals.com';
// Fetch published blog posts from API
const posts = await fetch(`${baseUrl}/api/blog/published?limit=100`)
.then(r => r.json());
const staticRoutes = [
{ path: '/', priority: '1.0', changefreq: 'daily' },
{ path: '/signals', priority: '0.9', changefreq: 'daily' },
{ path: '/pricing', priority: '0.9', changefreq: 'weekly' },
{ path: '/performance', priority: '0.8', changefreq: 'daily' },
{ path: '/free-signals', priority: '0.9', changefreq: 'weekly' },
{ path: '/blog', priority: '0.8', changefreq: 'daily' },
// ... all static routes
];
const now = new Date().toISOString().split('T')[0];
let xml = '\n';
xml += '
\n'; // Static routes
for (const route of staticRoutes) {
xml += `
\n ${baseUrl}${route.path} \n`;xml += `
${now} \n`;xml += `
${route.changefreq} \n`;xml += `
${route.priority} \n \n`;}
// Blog posts
for (const post of posts) {
if (!post.is_published) continue;
const lastmod = post.published_at?.split('T')[0] || now;
xml += `
\n ${baseUrl}/blog/${post.slug} \n`;xml += `
${lastmod} \n`;xml += `
monthly \n`;xml += `
0.7 \n \n`;}
xml += '';
return new Response(xml, {
headers: {
'Content-Type': 'application/xml',
'Cache-Control': 'public, max-age=3600', // Cache for 1 hour
},
});
}
FIX #3: Add Organization + WebSite Schema to Base HTML
Problem
Google doesn't understand what TebotechSignals is as an entity. No Organization or WebSite schema in the base HTML.
Solution
Add structured data to the base HTML template.
html{
"@context": "https://schema.org",
"@type": "Organization",
"name": "TebotechSignals",
"url": "https://tebotechsignals.com",
"logo": "https://tebotechsignals.com/logo.png",
"description": "Institutional-grade ICT Smart Money Concepts forex, gold, and crypto signals platform",
"sameAs": [
"https://instagram.com/anselmoboaventura83236196",
"https://t.me/tebotechsignals"
]
}
{
"@context": "https://schema.org",
"@type": "WebSite",
"url": "https://tebotechsignals.com",
"name": "TebotechSignals",
"potentialAction": {
"@type": "SearchAction",
"target": "https://tebotechsignals.com/search?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
FIX #4: Fix Homepage Title and Win Rate
Problem
- Homepage title: "Tebotechsignals" (22 chars — too short, no keywords)
- Win rate: Still shows "78%" in raw HTML (should be 42.9%)
Solution
Update the base HTML template:
htmlTebotechsignals TebotechSignals — SMC Forex & Gold Signals | 42.9% Win Rate
FIX #5: Create llms.txt File
Problem
No `llms.txt` file exists for AI crawlers (GPTBot, ClaudeBot, etc.)
Solution
Create `/llms.txt` in public directory:
TebotechSignals
Institutional-grade ICT Smart Money Concepts forex, gold, and crypto signals platform.Key Pages
About
TebotechSignals provides SMC/ICT-based forex and gold trading signals with full transparency. Every signal includes entry, stop loss, take profit levels, confluence scoring, fakeout risk analysis, and HTF bias alignment.
Manual Actions (Google Search Console)
After deploying the code fixes above, perform these manual actions:
1. Request Indexing for Top 10 URLs
Go to Google Search Console → URL Inspection → enter each URL → "Request Indexing"
Priority URLs to submit:
- `https://tebotechsignals.com/` (homepage)
- `https://tebotechsignals.com/blog/blockchain-verified-trading-signals-tamper-proof-performance`
- `https://tebotechsignals.com/blog/verifiable-ai-signal-pipeline-zk-proofs-modular-architecture`
- `https://tebotechsignals.com/blog/signal-verification-tool-python-prototype`
- `https://tebotechsignals.com/blog/rust-zk-verification-engine-high-performance`
- `https://tebotechsignals.com/blog/signal-verification-api-developer-documentation`
- `https://tebotechsignals.com/signals`
- `https://tebotechsignals.com/pricing`
- `https://tebotechsignals.com/blog`
- `https://tebotechsignals.com/performance`
2. Check Coverage Report
Search Console → Pages → look for:
- "Crawled - currently not indexed" → Request indexing
- "Discovered - currently not indexed" → Wait for re-crawl
- "Excluded by 'noindex' tag" → Fix immediately
3. Submit Updated Sitemap
Search Console → Sitemaps → enter `https://tebotechsignals.com/sitemap.xml` → Submit
Expected Timeline After Fixes
| Timeframe | What Should Happen |
|---|---|
| Day 1-3 | Code fixes deployed, sitemap now dynamic, prerendered HTML for all pages |
| Day 3-7 | Google re-crawls (Googlebot visited Aug 23-25, should return within days) |
| Day 7-14 | Blog posts start appearing in "Crawled - indexed" status |
| Day 14-30 | First organic impressions appear in Search Console |
| Day 30-60 | Organic traffic starts flowing for long-tail keywords |
| Day 60-90 | Rankings stabilize for target keywords (if backlinks acquired) |
Priority Matrix
| Fix | Impact | Effort | Priority |
|---|---|---|---|
| Fix homepage prerendering | 🔴 Critical | Medium | P0 |
| Make sitemap dynamic | 🔴 Critical | Low | P0 |
| Add Organization schema | 🟡 High | Low | P1 |
| Fix homepage title | 🟡 High | Low | P1 |
| Fix "78%" → "42.9%" in HTML | 🟡 High | Low | P1 |
| Create llms.txt | 🟢 Medium | Low | P2 |
| Request indexing (manual) | 🟡 High | Low | P1 |
| Publish backlinks (manual) | 🔴 Critical | High | P0 |
⚠️ These fixes require frontend code changes. The AI assistant cannot make these changes directly — they need to be implemented by a developer with access to the codebase.