Troubleshooting
Indexed by symptom, because you know the symptom and not the cause. Several of these fail in ways that look like success, which is why they are worth reading before you need them.
Nothing renders on the product page
Section titled “Nothing renders on the product page”| Cause | Fix |
|---|---|
| Ownership is not verified | Every artifact endpoint 404s until it passes. Prove you own your domain |
| Nothing is published for that handle | The endpoints serve published bundles only. Publish in the dashboard first |
Wrong handle | With no commerce platform it is the segment your URL pattern captured, not your slug. The product page |
canonicalUrl does not match | The component renders nothing and leaves a data-geoffy-skipped marker. Look for it in view-source |
The component is under a "use client" boundary | It is an async server component. Below that boundary it never runs on the server |
The widget renders unstyled
Section titled “The widget renders unstyled”Something is stripping the <style> element that travels inside widgetHtml. A
sanitiser, most often. Do not sanitise the widget HTML.
/llms.txt returns my home page with a 200
Section titled “/llms.txt returns my home page with a 200”A catch-all segment such as app/[lang] is answering it. You used a next.config.js
rewrite that is not in beforeFiles, or the route file is not where you think it is.
My robots.txt is stale after I fixed something
Section titled “My robots.txt is stale after I fixed something”The helpers cache their fetch of Geoffy for an hour by default. Mount the revalidate
route, or pass revalidateSeconds: 10 while integrating.
In dev, also clear .next/dev/cache — not .next/cache.
The mount is reported as not done, but the URL works in my browser
Section titled “The mount is reported as not done, but the URL works in my browser”A 200 is not the check. Three things must be true, and a catch-all route answering with
your home page satisfies none of them while looking fine. Checking it
worked has the curl and the three conditions.
wrong_site specifically means our marker came back carrying a different site key —
your GEOFFY_SITE_KEY belongs to another Geoffy site.
Products stay pending forever, and everything looks right locally
Section titled “Products stay pending forever, and everything looks right locally”Expected until you deploy. Geoffy fetches your live page at its canonical URL, not your machine. What local cannot do.
Every product reports canonical_broken
Section titled “Every product reports canonical_broken”A missing generateMetadata on your product page means all of them inherit the layout’s
metadata and claim to be your home page. One missing export, one broken catalogue.
Prove you own your domain.
Products index slowly, and nothing is wrong
Section titled “Products index slowly, and nothing is wrong”Probably the IndexNow key. The namespace authorises only what is under /apps/geoffy/, so
product-page pings are discarded unless you also serve public/{key}.txt. Nothing errors
when you skip it. The IndexNow key.
The revalidate route is never called
Section titled “The revalidate route is never called”The path is fixed at /api/geoffy/revalidate — Geoffy derives it from your domain rather
than storing one you typed. A route file anywhere else is never called, and nothing
reports it. How updates arrive.
The first page load after a publish still shows the old content
Section titled “The first page load after a publish still shows the old content”The revalidate route fired — the second load is correct — but something passed a cache-life
profile that permits stale content. Pass revalidateTag bare to
createGeoffyRevalidateRoute and delete any wrapper around it: the package supplies { expire: 0 } itself, while "max" serves the pre-publish page for up to a year while the refresh runs.
How updates arrive.
Still stuck
Section titled “Still stuck”Check what your own site is actually serving:
curl -si https://yourdomain.com/apps/geoffy/sitemap.xml | head -20curl -s https://yourdomain.com/your/product/page | grep -c 'data-geoffy'curl -s https://yourdomain.com/llms.txt | head -20Then compare against the source. Your site’s settings in Geoffy show the direct URL for each of your published surfaces; fetching one bypasses every cache of yours at once. If Geoffy and your site disagree, the problem is on your side of the fetch.