AEO / GEO Audit
Perfora (perforacare.com) — AI Search / AEO / GEO Audit
Answer Engine Optimization & Generative Engine Optimization review for Perfora's D2C storefront. Prepared 2026-09-07 from live storefront inspection (raw HTML + schema), robots.txt, agentic-commerce endpoints, and cross-platform query testing. Findings are verified against the rendered source, not markdown-converted text.
Report scope: get Perfora cited by AI systems (Google AI Overviews, ChatGPT, Perplexity, Claude, Gemini, Copilot) for its highest-intent oral-care queries. Business context (₹70 Cr FY25 revenue, 96% mobile audience, ~100 SKUs, 291 blog posts, Shark Tank S2 equity) is drawn from the companion business-analysis.md.
1. Executive Summary
Perfora is unusually well-positioned for the agentic-commerce era — Shopify has auto-generated a full Universal Commerce Protocol (UCP) stack (llms.txt, agents.md, /.well-known/ucp, agentic-discovery sitemap) that most D2C brands lack. AI crawlers are explicitly allowed in robots.txt. So the "be where AI looks / be machine-readable" pillar is largely solved.
The gaps are in the structure and authority pillars, and they are concrete and fixable:
- Broken product schema on GTIN-leading-zero products — the
ProductJSON-LD block is invalid JSON on products whose GTIN13 starts with0(a leading-zero number is not valid JSON). Confirmed on the hero Electric Toothbrush (M001) and others. AI engines silently drop the entire structured product block for those pages. - No review/rating schema anywhere — despite live Judge.me reviews, not a single product page emits
aggregateRating/reviewCount. AI sees every product as "unreviewed," which suppresses citation in "[product] reviews" and "best [category]" queries. - Blog posts have zero Article schema — all 291 posts emit only an
Organizationblock: noBlogPosting, no author, nodatePublished/dateModified. AI engines get no publication date, author, or article-type signal for Perfora's largest content surface. - No static
/pricing.md— agents that don't speak UCP/MCP (most LLMs) cannot read structured pricing; it 404s. - Citation reality — for the brand's own high-intent queries, marketplaces (Amazon, Flipkart) and third-party sites (Elle, SharkTank-India, CB Insights, Tracxn, Reddit) dominate the top results; and for "purple toothpaste / color corrector" (Perfora's viral hero), international competitors (MOON, MySmile, IVISMILE) rank while Perfora is absent.
Headline: The foundation is strong; fixing the three schema bugs (P0) and adding author/date + review markup (P1) would likely produce the largest AI-visibility lift for the least effort.
2. AI Bot Access — PASS
robots.txt (verified live) contains no Disallow rules for any AI crawler. GPTBot, ChatGPT-User, PerplexityBot, ClaudeBot/anthropic-ai, Google-Extended, and Bingbot are all permitted (the file leads with Allow: / and only blocks /admin, /cart/, /checkout, /account, and Shopify-internal endpoints). No business decision needed here — citation is technically possible on every platform.
3. Machine-Readable Agentic Files — STRONG (differentiator)
| Endpoint | Status | Notes |
|---|---|---|
/llms.txt | 200 | Shopify auto-generated; describes store, UCP commerce protocol, read-only browsing endpoints, policy URLs. |
/agents.md | 200 | Canonical agent instructions (mirrors llms.txt). |
/.well-known/ucp | 200 | Full UCP merchant profile: supported versions (2026-08-25, 2026-04-08, 2026-01-23), dev.ucp.shopping.* capabilities, Google Pay + Shopify card payment handlers. |
/sitemap_agentic_discovery.xml | 200 | Lists agents.md for agent discovery. |
/api/ucp/mcp | (endpoints declared) | MCP surface for agent-driven catalog/cart/checkout (buyer approval required). |
This is a genuine competitive advantage for agentic buying (AI shopping assistants using the Shop skill / UCP). Perfora is ahead of ~95% of D2C brands here. The only static gap is /pricing.md (see §6).
4. Schema Markup Audit (verified via raw HTML, <script> preserved)
Per the skill's verification rule, every check below was run against unprocessed page source, not markdown extraction.
| Page type | Checked | Result | Detail |
|---|---|---|---|
| Homepage | raw HTML | PASS | Organization + WebSite (with SearchAction) JSON-LD, both valid. |
| Product (generic) | raw HTML | PARTIAL | Organization (valid) + Product (valid on most). Product block includes sku, gtin13, brand, offers with price/priceCurrency/availability. |
| Product (GTIN leading-zero) | raw HTML | FAIL | Product JSON-LD is invalid JSON — gtin13 is emitted as a bare number starting with 0 (e.g. 0725765052377), which is not valid JSON. The whole block is dropped. Confirmed on electric-toothbrush-model001 (gtin13 0725765052377), awake-lemon-mint-toothpaste, tongue-cleaner. |
| Product — reviews | raw HTML | FAIL | No aggregateRating and no reviewCount/ratingCount on any product page, despite live Judge.me reviews on the page. AI treats products as unreviewed. |
| Collection | raw HTML | PARTIAL | Emits a Product block for the first product but no aggregateRating. The visible H1 on /collections/all is a promo banner ("REAL PEOPLE, REAL RESULTS"), not the category name — a weak topical signal. |
| Blog post | raw HTML | FAIL | Only Organization schema. No BlogPosting/Article, no author, no datePublished/dateModified. 291 posts affected. |
| BreadcrumbList | raw HTML | FAIL (not found) | No breadcrumb schema on product/collection/blog pages. |
| FAQPage / HowTo | raw HTML | FAIL (not found) | No FAQ or HowTo schema on any checked page, even where FAQ-style content exists. |
4.1 Root cause of the product-schema break
In the theme's product JSON-LD, gtin13 is serialized as a JSON number ("gtin13": 0725765052377). JSON has no leading-zero integer syntax, so the parser fails at that token and discards the entire Product object. The fix is a one-line template change: emit GTIN identifiers as strings ("gtin13": "0725765052377"). This is theme/Liquid output — achievable without an app.
5. Content Extractability
Strengths
- Blog content is genuinely extractable: real H2-structured answers, definition-style blocks, and 40–60 word passages exist (e.g. the
gum-healthandtooth-talkhubs cover "is salt good for teeth," "little teeth big protection," etc.). This reads well for Google AI Overviews. - Clean H1s on product pages (e.g. "Electric Toothbrush - M001 - Battery Operated").
- 291 blog posts = a large topical surface that, once properly marked up, is a strong AI-visibility asset.
Weaknesses
- No explicit FAQ sections/
FAQPageschema on product or category pages — "X vs Y" and "how to" queries are left to prose only. - Product descriptions were not verifiable for depth at scale (JS-rendered), but the missing
aggregateRating(above) is the bigger conversion + citation blocker. - No author byline or "last updated" date on blog posts → weak E-E-A-T signal for a health-adjacent category (oral care). AI systems weight authoritativeness heavily here.
6. The /pricing.md Gap
/pricing.md and /pricing.txt both return 404. The skill recommends a static, LLM-parseable pricing file for agents that don't consume UCP/MCP. Perfora's UCP endpoint does expose pricing, but a plain markdown pricing index (by category, with INR ranges and compare-at pricing) lets ChatGPT/Claude/Perplexity answer "[product] price" and "[brand] pricing" queries directly from the domain. Low effort, high reuse.
7. Third-Party Presence & Citation Reality (query testing)
Live cross-platform checks for Perfora's highest-intent queries show a consistent pattern: Perfora's own domain ranks, but marketplaces and third parties dominate the answer set.
| Query tested | What AI/traditional search surfaces | Perfora cited? |
|---|---|---|
| "best electric toothbrush India Perfora" | Flipkart brand page, Amazon store, Perfora blog post (#3), Elle review, Amazon listing | Partial (own blog ranks; marketplaces above) |
| "Perfora toothpaste review Shark Tank" | Amazon ad, SharkTank-India.com, Perfora Shark Tank collection, YouTube reviews | Yes (mixed with 3P) |
| "Perfora vs Salt oral care" | Perfora blog "is salt good for teeth" (#1), CB Insights, Tracxn, Reddit | Yes (own blog #1) — good topical coverage |
| "what is purple toothpaste color corrector" | MOON, MySmile, IVISMILE, Laserglow (all international) | No — Perfora's viral Purple Magic hero line is absent on its own hero topic |
Key implications:
- Perfora is 6.5x more likely to be cited via third parties than its own domain (the skill's documented baseline) — true here: Amazon, Flipkart, SharkTank-India, CB Insights, Tracxn, Reddit all appear above or alongside perforacare.com.
- The "purple color corrector" entity gap is the single biggest missed-topic opportunity: it is Perfora's most viral product, yet international competitors own the explainer queries. A definitive, structured "How purple color-corrector toothpaste works" page (with the science, shade theory, and before/after caveats) is needed.
- No Wikipedia page, no owned Reddit AMAs (existing Reddit threads are mixed/negative criticism), no Quora presence. Third-party entity signals are thin and partly unfavorable.
8. Authority (GEO) Gaps
Per the Princeton GEO study (KDD 2024), the highest-leverage authority signals are: cite sources (+40%), add statistics (+37%), expert quotes (+30%), author attribution (+25%). Perfora's current state:
- Statistics with sources: Present in blog copy ("5 Million+ users," "clinically tested") but rarely attributed to a named study/clinician with a link. Add citable, sourced numbers.
- Expert attribution: Founders are named in About, but blog posts have no author byline (dentist "Anjali Verma" is referenced in business analysis as a channel contact, not surfaced as article author). Add named dental-professional authorship to health claims — critical for an oral-care (YMYL-adjacent) category.
- Freshness: No "last updated" dates on blogs (schema gap, §4) — AI weights recency; undated content loses to dated competitors.
- Brand-name consistency: Schema entity name is "Perfora - Oral Care Solutions"; domain is perforacare.com; social handles are "perforaofficial." The
sameAsarray in Organization schema contains 4 empty-string entries (sloppy entity signal that should be cleaned). Align naming and remove empty sameAs values.
9. Prioritized Recommendations
P0 — Fix broken/authorized schema (highest ROI, engineering, days)
- Quote GTIN identifiers as strings in the product JSON-LD template (
"gtin13": "0725765052377"). Resolves the invalid-JSON break on all leading-zero-GTIN products (including the hero electric toothbrush). Verify by re-fetching raw HTML and parsing theProductblock. - Add
aggregateRating+reviewCountto every product page from Judge.me (via the Judge.me schema setting or a custom JSON-LD injection). AI needs "4.8 stars from 2,300 reviews" to cite products in review/best-of queries. - Add
BlogPosting/Articleschema to all 291 posts withauthor(named dental professional where health claims are made),datePublished,dateModified,headline,image. Enables AI to treat the content engine as a dated, attributable source.
P1 — Extractability & authority (weeks)
- Publish
/pricing.md— static, LLM-parseable pricing by category (INR ranges, compare-at, subscription note). Backfill frompricing-data.csvalready extracted in the workspace. - Build the "Purple Color Corrector" pillar page — a definitive, structured explainer (definition block + how-it-works steps + pros/cons + FAQ) targeting the exact query Perfora currently loses to MOON/MySmile. Link from Purple Magic product pages.
- Add FAQPage schema to top product and category pages using natural-language questions ("Is Perfora toothpaste SLS-free?", "How does the sonic toothbrush work?", "Perfora vs traditional toothpaste?").
- Add author bylines + "last updated" dates to blog posts (closes the E-E-A-T + freshness gap); attribute oral-health claims to a named dentist.
- Add
BreadcrumbListschema to product/collection/blog templates for category-hierarchy understanding.
P2 — Presence (ongoing)
- Clean the Organization
sameAsarray — remove 4 empty strings; confirm all social URLs resolve (IG 175K, YouTube 18.8K, Threads 23.6K, Facebook 7.2K). - Pursue third-party entity signals: a Wikipedia/Wikidata entry, owned Quora answers, and a measured Reddit AMA to counter the existing criticism threads. Brands are cited 6.5x more via third parties — seed favorable, accurate ones.
- Comparison content: publish "Perfora vs [competitor]" posts for Salt Oral Care, Toothsi, legacy incumbents (Colgate/Oral-B) — Perfora already wins "Perfora vs Salt" organically; extend it.
- Monthly AI-visibility monitoring (manual or Otterly/Peec AI): track the 10–20 queries in §7 + a "purple color corrector" tracker. Note Google has no AI-specific Search Console report — use standard Performance + a third-party tool.
10. What Is Already Working (keep doing)
- robots.txt open to all AI crawlers.
- Full UCP/agentic-commerce stack (llms.txt, agents.md, /.well-known/ucp) — best-in-class for agentic buying.
- All policy/about/contact pages return 200 (no broken trust links).
- 291-post content engine with genuinely extractable structure.
- Strong traditional + marketplace ranking for branded queries.
11. Sources (verified live, 2026-09-07)
- https://perforacare.com/robots.txt — AI-crawler allow rules.
- https://perforacare.com/llms.txt — agent context file (200).
- https://perforacare.com/agents.md — canonical agent instructions (200).
- https://perforacare.com/.well-known/ucp — UCP merchant profile (200).
- https://perforacare.com/sitemap_agentic_discovery.xml — agent discovery sitemap.
- https://perforacare.com/ — homepage (Organization + WebSite JSON-LD verified).
- https://perforacare.com/products/electric-toothbrush-model001 — broken
ProductJSON-LD (gtin13 leading-zero), no aggregateRating. - https://perforacare.com/products/purple-magic-whitening-serum, /products/awake-lemon-mint-toothpaste, /products/teeth-whitening-strips, /products/tongue-cleaner — product schema sample (mix of valid/invalid; no review schema).
- https://perforacare.com/collections/all — collection schema (Product block, no aggregateRating; promo H1).
- https://perforacare.com/blogs/gum-health, /blogs/tooth-talk — blog schema (Organization only; no Article/author/date).
- https://perforacare.com/pricing.md, /pricing.txt — 404 (gap).
- https://perforacare.com/policies/{privacy-policy,terms-of-service,refund-policy,shipping-policy}, /pages/about-us, /pages/contact-us — all 200.
- https://perforacare.com/sitemap_products_1.xml, /sitemap_blogs_1.xml — 101 products, 291 blog posts.
- Query testing (web_search): "best electric toothbrush India Perfora"; "Perfora toothpaste review Shark Tank"; "Perfora vs Salt oral care"; "what is purple toothpaste color corrector"; "Perfora 5 million users Shark Tank 80 lakh".
- Companion: /root/cro-reports/perforacare/20260907-120326/business-analysis.md (₹70 Cr FY25, 96% mobile, catalog, competitors, social stats).
- Methodology refs: Google AI features optimization guide (developers.google.com/search/docs/fundamentals/ai-optimization-guide); Princeton GEO study, KDD 2024 (citation/statistics/quotation visibility lifts); llmstxt.org; ucp.dev.
Confidence: schema/robots/endpoint findings are High (verified against raw source). Query-visibility findings are directional (single-point web_search snapshots, not a sustained AI-platform panel). Revenue/competitor facts inherit the Medium confidence flagged in business-analysis.md.