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:

html

Tebotechsignals

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}

${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


FIX #4: Fix Homepage Title and Win Rate

Problem

Solution

Update the base HTML template:

html

Tebotechsignals

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:

2. Check Coverage Report

Search Console → Pages → look for:

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.

Blog | Tebotechsignals
Skip to main content
XAU/USD2342.50
US3039245.00
NAS10017854.00
XAU/USD2342.50
US3039245.00
NAS10017854.00
Google Indexing Fix — Technical Specification for Frontend Changes
technical analysis
August 26, 2026

TebotechSignals Research Team

Institutional FX Analysts · ICT Smart Money Concepts Specialists

Google Indexing Fix — Technical Specification for Frontend Changes

Complete technical specification for fixing Google indexing issues. 5 critical frontend code changes needed: extend prerendering to all pages, make sitemap dynamic, add Organization schema, fix homepage title, fix win rate in HTML. Plus 3 manual Search Console actions. Expected indexing within 1-2 weeks of deployment.

#SEO
#Google
#indexing
#frontend
#prerendering
#sitemap
#schema
#technical-specification

📘 Reading Price Like the Big Players

Liquidity, order blocks and market structure — explained in plain English. Just $10.00.

Get It

📘 Trading Without the Drama

Fixing risk management, discipline and misinformation — explained in plain English. Just $10.00.

Get It
🏆
Sponsored · Keller, TX

Celebrate Your Next Win With a Custom Cake 🎂

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:

<!-- What Googlebot sees on / -->
<title>Tebotechsignals</title>
<!-- No meta description, no H1, no content, no schema -->

Solution

Extend the middleware to serve prerendered HTML for ALL critical static pages.

Code Specification

// 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

// 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 `<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>${meta.title}</title>
  <meta name="description" content="${meta.description}" />
  <meta name="keywords" content="${meta.keywords}" />
  <link rel="canonical" href="${canonical}" />
  <meta name="robots" content="index, follow, max-image-preview:large" />
  
  <!-- Organization Schema -->
  <script type="application/ld+json">
  {
    "@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"
  }
  </script>
  
  <!-- WebSite Schema -->
  <script type="application/ld+json">
  {
    "@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"
    }
  }
  </script>
  
  <!-- Open Graph -->
  <meta property="og:type" content="website" />
  <meta property="og:title" content="${meta.title}" />
  <meta property="og:description" content="${meta.description}" />
  <meta property="og:url" content="${canonical}" />
  <meta property="og:site_name" content="TebotechSignals" />
</head>
<body>
  <h1>${meta.title}</h1>
  <p>${meta.description}</p>
  <nav>
    <a href="https://tebotechsignals.com/">Home</a>
    <a href="https://tebotechsignals.com/signals">Signals</a>
    <a href="https://tebotechsignals.com/pricing">Pricing</a>
    <a href="https://tebotechsignals.com/blog">Blog</a>
    <a href="https://tebotechsignals.com/performance">Performance</a>
  </nav>
</body>
</html>`;
}

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

// 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 = '<?xml version="1.0" encoding="UTF-8"?>\n';
  xml += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n';
  
  // Static routes
  for (const route of staticRoutes) {
    xml += `  <url>\n    <loc>${baseUrl}${route.path}</loc>\n`;
    xml += `    <lastmod>${now}</lastmod>\n`;
    xml += `    <changefreq>${route.changefreq}</changefreq>\n`;
    xml += `    <priority>${route.priority}</priority>\n  </url>\n`;
  }
  
  // Blog posts
  for (const post of posts) {
    if (!post.is_published) continue;
    const lastmod = post.published_at?.split('T')[0] || now;
    xml += `  <url>\n    <loc>${baseUrl}/blog/${post.slug}</loc>\n`;
    xml += `    <lastmod>${lastmod}</lastmod>\n`;
    xml += `    <changefreq>monthly</changefreq>\n`;
    xml += `    <priority>0.7</priority>\n  </url>\n`;
  }
  
  xml += '</urlset>';
  
  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.

<!-- Add to base HTML <head> -->
<script type="application/ld+json">
{
  "@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"
  ]
}
</script>

<script type="application/ld+json">
{
  "@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"
  }
}
</script>

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:

<!-- BEFORE -->
<title>Tebotechsignals</title>

<!-- AFTER -->
<title>TebotechSignals — SMC Forex & Gold Signals | 42.9% Win Rate</title>
<meta name="description" content="Institutional-grade ICT Smart Money Concepts forex and gold signals with verified track record. Daily signals, SMC education, and trade analysis from $5/month." />

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
- [Live Signals](https://tebotechsignals.com/signals)
- [Pricing](https://tebotechsignals.com/pricing)
- [Performance Track Record](https://tebotechsignals.com/performance)
- [SMC Education](https://tebotechsignals.com/education)
- [Blog](https://tebotechsignals.com/blog)
- [Free Signals](https://tebotechsignals.com/free-signals)

## 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:

  1. https://tebotechsignals.com/ (homepage)
  2. https://tebotechsignals.com/blog/blockchain-verified-trading-signals-tamper-proof-performance
  3. https://tebotechsignals.com/blog/verifiable-ai-signal-pipeline-zk-proofs-modular-architecture
  4. https://tebotechsignals.com/blog/signal-verification-tool-python-prototype
  5. https://tebotechsignals.com/blog/rust-zk-verification-engine-high-performance
  6. https://tebotechsignals.com/blog/signal-verification-api-developer-documentation
  7. https://tebotechsignals.com/signals
  8. https://tebotechsignals.com/pricing
  9. https://tebotechsignals.com/blog
  10. 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.

🏆
Sponsored · Keller, TX

Celebrate Your Next Win With a Custom Cake 🎂

📲 Get Free Daily Signals on WhatsApp

Follow our free channel for daily market briefs, ICT signals, and SMC education — delivered straight to your WhatsApp.

Join Free →

Disclaimer: This site is an educational platform. All content — including courses, articles, and any market commentary — is for educational and informational purposes only and does not constitute financial, investment, or professional advice, a recommendation, or a solicitation to trade. It is general in nature and does not take into account your individual financial situation, objectives, or needs. All trading and investing involve risk of loss; past performance is not indicative of future results. Always conduct your own research and consult a licensed professional before making any financial decisions. Client and testimonial experiences may not be typical — individual results will vary. Full fee structure is disclosed on our Pricing page.

We use cookies for essential site functionality and, with your consent, for analytics and advertising (Google Analytics, Facebook, Bing) to understand traffic and improve TebotechSignals. See our Privacy Policy for details.