SEO Troubleshooting
What you'll learn
- The three systems your SEO data passes through, and how to tell which one is broken.
- How to isolate a problem to m18t, your CMS, or your front-end.
- How to re-push corrected metadata.
The concept: SEO data crosses three systems
When a meta title is wrong on Google, the break could be in any of three places, and fixing the wrong one wastes time. SEO data travels:
- m18t (the origin). Did m18t compute and store the correct metadata?
- Your CMS (e.g. Strapi). Did the push land, and did the CMS save it?
- Your front-end (Nuxt, Next.js, Astro, etc.). Does the public page read those fields and render them into the
<head>?
m18t owns step 1 and the push into step 2. It does not own how your CMS is modeled or how your front-end renders pages. So the first move is always to isolate where the data stops being correct.
How to isolate the break
Step 1 — Check m18t
Open the piece in the content editor and look at the SEO tab.
- If the data is wrong here: you found it. Fix the field (or regenerate with the SEO AI prompt), save, and re-push. Done.
- If the data is correct here: move to step 2.
Step 2 — Check your CMS
Open your CMS admin and find the same piece. Look at its SEO fields.
- If the data is missing or wrong here: the push didn't apply. Check m18t's sync log for the piece — a failed push usually surfaces as a
400/4xxerror, which most often means the CMS doesn't have the SEO fields (or component) m18t is trying to write. Make sure your CMS collection actually has the SEO shape m18t expects, then re-push. - If the data is correct here: the push worked. Move to step 3.
Step 3 — Check your front-end
If the data is right in your CMS but wrong on the live page, the gap is rendering. Open the live page, view source, and look for <title>, <meta name="description">, the <link rel="canonical">, and the JSON-LD <script>.
- The fix is in your code: your front-end has to read the SEO fields from the CMS response and emit them — e.g. via
useSeoMeta()in Nuxt orgenerateMetadata()in Next.js. This is outside m18t. If the field is present in the CMS API response but absent in the HTML, your rendering code isn't wiring it through.
Re-pushing corrected metadata
After you fix metadata in m18t on an already-published piece, re-sync it to your CMS so the change propagates — see Pushing to your CMS for the push/update flow. Editing in m18t alone does not change what's already sitting in your CMS or on your site.
Common variations
Generated JSON-LD has no URL. That's intentional when no canonical was available — the prompt omits the URL rather than inventing one. Configure the content type's SEO defaults so a canonical resolves, then regenerate.
The AI generate button is greyed out. No AI key. SEO generation is BYOK; add a key in the vault.
Custom JSON-LD broke the page. m18t doesn't validate custom JSON-LD. Run it through the Google Rich Results Test — a syntax error there explains a page that won't parse. See Structured Data & JSON-LD.
What's next
FAQ
My meta tags are right in m18t but wrong on Google. Where do I start? Walk the three systems in order: m18t → CMS → front-end. Find where the data stops being correct before changing anything. Most "wrong on Google" cases are a front-end rendering gap, not an m18t bug.
My CMS push failed with a 400. Why? Usually the CMS collection is missing the SEO fields or component m18t writes to. Check the sync log for the exact error, align the CMS schema, then re-push.
I fixed the title in m18t but the site still shows the old one. What now? Re-push the piece to your CMS, then confirm your front-end re-fetched it. Editing in m18t alone doesn't update an already-published external record.
Why is the canonical/JSON-LD empty? If no SEO defaults exist for the (brand × type), the canonical can be empty and the JSON-LD omits the URL by design. Configure SEO defaults and regenerate.
Does m18t render my public pages?
No. m18t computes and pushes metadata; your front-end renders it into the page <head>. Rendering bugs are fixed in your front-end code.