Data sources: Google Search Console (Web search, last 3 months: Queries, Pages, Devices, Search Appearance exports) cross-referenced against the financial-insights codebase (Vite + React SPA on AWS Amplify).
Companion documents: GTM Implementation Plan (execution plan for the findings below) · Combined Growth Plan (adds GA4 funnel analysis) · Per-Feature Growth Plans · GA4 Tracking Plan.
| Metric (last 3 months) | Value |
|---|---|
| Total clicks | 50 |
| Total impressions | 9,929 |
| Overall CTR | 0.50% |
| Avg. position (desktop / mobile) | 62.5 / 44.8 |
| Rich results (Search Appearance) | None |
| Clicks from brand queries + homepage | ~30 of 50 (~60%) |
The site is indexed at scale (~2,000 stock pages, heatmaps, calculators, blog) but converts almost none of that footprint into traffic. Three structural causes:
<div id="root"> until JavaScript runs and fetches data from S3/AppSync. Google renders it eventually, but thin/delayed content + no server HTML = positions 70–95 on competitive queries and zero rich results.<stock> share price" queries where the SERP is owned by Groww, Moneycontrol, Screener, Tickertape, ET Markets and Google's own finance panel. Average position for this cluster: 75–95 (pages 8–10). These will not produce clicks in their current form regardless of on-page fixes.Strategic verdict: Wise Invest should stop positioning as a generic stock-quote site and go to market as India's market-visualization and planning-tools platform — heatmaps first, calculators second, stock pages as supporting long-tail — while fixing the rendering architecture that suppresses everything.
| Cluster | ~Queries | ~Impressions | Avg position | Verdict |
|---|---|---|---|---|
| Brand ("wiseinvest", "wise invest", "wiseinvest portfolio login") | 8 | ~600 | 5–23 | Winning, but see brand-collision risk (§2.4) |
| Heatmaps (nifty50/100/200/500, sector, F&O, bank, smallcap, "stock market heatmap") | ~55 | ~800 | 20–65 | Best opportunity — page 2–5, push to page 1 |
"<stock> share price" long tail |
~700 | ~5,500 | 70–95 | Unwinnable head terms; salvage via long-tail + rendering fix |
| Calculators (options, SWP, gratuity, term insurance, investment, CAGR) | ~40 | ~300 | 55–95 | Winnable with dedicated landing pages + content |
| SWP / credit score / educational | ~30 | ~250 | 48–95 | Content hub opportunity; SWP intent is strong |
ISIN codes (ine045j01034 etc.) |
~20 | ~100 | 1–30 | Accidental wins — position 1 with 0 clicks; add ISIN to page titles/content to capture |
Notable single data points:
blsnifty at position 11.7 (41 impressions) — the BLS stock page ranks for a merged brand+index term; evidence that even thin pages can rank when competition is absent.options calculator (26 imp, pos 61.9) + option calculator + variants — the option calculator suite (long/short call/put) already exists but has no consolidated, content-rich landing page.ग्रेच्युटी कैलकुलेटर फॉर्मूला reaching the gratuity calculator — vernacular calculator SEO is an open flank nobody in this niche covers well./heatmap/index/nifty50: 4 clicks, 197 imp, pos 44 — top non-brand page./features/stock-heatmaps: 389 impressions (2nd highest on site), CTR 0.51%, pos 53.9 — high demand, weak page./stocks/* pages: essentially all 0 clicks. Top impression earners (adaniports 363, axisbank 170, indigo 167, coalindia 164…) all sit at positions 74–90./blog/systematic-withdrawal-plan-(swp)-explained:-turn-your-... and /blog/systematic-withdrawal-plan-swp-explained-turn-your-... both receive impressions — legacy slug variants are still in Google's index and split signals.| Device | Impressions | CTR | Position |
|---|---|---|---|
| Desktop | 8,126 | 0.26% | 62.5 |
| Mobile | 1,694 | 1.59% | 44.8 |
Desktop impressions are dominated by the losing share-price cluster. Mobile — where Indian retail investors actually live — is under-penetrated. The winnable clusters (heatmaps, calculators) skew mobile.
Queries like "wiseinvest advisors" (pos 6.6) and "wiseinvest private limited" (pos 6.9) are searches for Wiseinvest Pvt Ltd (wiseinvest.co.in), an established Mumbai mutual-fund advisory. "wiseinvest portfolio login" (94 impressions, 0 clicks at pos 7.6) is likely their clients failing to find their portal — impressions that will never convert. The brand SERP is shared with an older, more authoritative namesake. Short term: differentiate presentation ("Wise Invest India", correct Organization schema, claimed social profiles). Long term: consider whether the name is defensible.
Zero rich results of any kind. For a finance site with 2,000 entity pages, calculators, FAQs and articles, this is pure headroom: Breadcrumb, FAQ, Article, and Organization markup are all absent or broken (see §3).
| # | Finding | Evidence | Impact |
|---|---|---|---|
| T1 | CSR-only SPA; no SSR/prerendering. All meta, JSON-LD and content injected client-side via react-helmet-async; stock data fetched at runtime from S3. Amplify rewrites every path to /index.html. |
vite.config.js, amplify.yml rewrite rule, src/components/SEO.jsx |
Root cause of positions 70–95 and zero rich results. Crawler sees an empty shell on first pass; rendering queue delays; thin evaluated content. |
| T2 | Soft-404s at scale. SPA fallback returns HTTP 200 for any URL, including garbage paths and delisted symbols. | amplify.yml rewrites |
Index bloat, "Crawled — currently not indexed", wasted crawl budget across ~2,000+ URLs. |
| T3 | Sitemap lastmod stamped "today" for all ~2,000 stock URLs on every build, changefreq=daily. |
scripts/generate-sitemap.mjs (const today = …; urlEntry(…, today, "daily")) |
Google learns the site's lastmod is unreliable and ignores it; recrawl prioritization breaks. |
| T4 | Wrong/fake structured data sitewide. Default FinancialService schema declares addressCountry: "US" for an Indian product and sameAs links to twitter.com/wiseinvest, facebook.com/wiseinvest, linkedin.com/company/wiseinvest — handles the project does not own (actual handle: @InvestWise48732). Injected on every page. |
src/components/SEO.jsx lines 37–53 |
Contradictory entity signals; undermines E-E-A-T for a YMYL (finance) site; blocks rich results. |
| # | Finding | Evidence | Impact |
|---|---|---|---|
| T5 | Brand-first, keyword-last titles. Stock pages: WiseInvest \| Stocks \| {name}. Meta description: `${name} ₹${price} · ${verdict}` (a few words). |
StockPage.jsx:500 |
Poor relevance + CTR. The query is "X share price"; the title should lead with it. |
| T6 | No page-type schema. No BreadcrumbList, no FAQPage, no Corporation/Dataset on stock pages, no WebApplication/SoftwareApplication on calculators. Blog has BlogPosting (good) but it's client-rendered. |
grep across src/pages |
Zero rich-result eligibility (confirmed by empty Search Appearance report). |
| T7 | Duplicate blog slugs still indexed. Legacy slugs with (, :, . characters coexist with clean slugs; canonicals now point correctly but no 301s exist, so both URLs keep collecting impressions. |
GSC Pages rows 46/58/246/573; BlogPost.jsx legacy-slug handling |
Split ranking signals on the site's best content cluster. |
| T8 | Heatmap URL fragmentation. Three URL shapes for the same content: /heatmap/index/nifty50, /heatmap?index=SECTORIAL§or=AUTOMOBILE, /heatmap/index/nifty-smallcap-100 vs /heatmap/index/nifty_smallcap_100 (both in GSC with different positions). |
GSC Pages rows 121/136; App.jsx routes |
The priority cluster's equity is split across duplicate URLs. |
| T9 | Analytics coupled to SEO component. GA4 pageview fires from a useEffect inside SEO.jsx; pages without <SEO> are untracked. Also double meta-robots emission when noAds is set (noads is not a valid robots token). |
SEO.jsx:29–34,110 |
Measurement blind spots; malformed robots meta. |
index.html); maximum-scale=1.0 harms accessibility; heavy chart bundles (echarts + d3 + recharts all shipped). Desktop LCP on stock pages depends on runtime S3 fetches.Referrer-Policy: strict-origin-only in amplify.yml is not a valid value (should be strict-origin-when-cross-origin)./products/calculators/sip, /swp, /gratuity, /term-insurance, heatmap index pages, /dividend-calendar, /ipo-listings are missing from the static sitemap while /services (no longer meaningful?) is present.noIndex on /dashboard is correct, but wealth/demo/test routes (/test-wealth-upload, /wealth-dashboard-demo, /stocks/data-health) are indexable and already appearing in GSC (/wealth/overview, /wealth/liabilities rows).Who wins the current SERPs you appear in: Groww, Moneycontrol, Screener.in, Tickertape, ET — companies with 10+ years of authority, live-data licensing, and app ecosystems. Competing head-on for "reliance share price" is a capital-intensive war you cannot win organically in 2026.
Where the moat actually is:
X share price nse", "X dividend", ISIN queries, small caps (where you already see positions 1–40: ramasteel pos 1.07, sedemac 1.5, relchemq 2) — not the top-50 large caps.Monetization coherence: the site runs AdSense — traffic is revenue. Every recommendation above compounds directly.
North-star recommendation: reposition messaging (homepage H1, title, features pages) around "See the whole Indian market at a glance" — visualization + planning tools — and let stock pages be the long-tail net, not the pitch.
| KPI | Baseline (3-mo) | 3-mo target | 6-mo target |
|---|---|---|---|
| Organic clicks / quarter | 50 | 400 | 1,500 |
| Non-brand clicks share | ~40% | 60% | 75% |
| Heatmap-cluster avg position | 20–65 | top 15 | top 5 (nifty50/100/200) |
| Pages with ≥1 click | ~22 | 100 | 300 |
| Rich results types | 0 | 2 (Breadcrumb, FAQ) | 4 (+ Article, Organization) |
| Indexed-not-clicked stock pages | ~1,900 | pruned/consolidated | rendering-fixed subset ranking <50 |
See the GTM Implementation Plan for the phased execution plan.