Meta descriptions are missing, truncated, or duplicated
why are my meta descriptions getting cut off or missing in Google search results Yes - this happens because your CMS or route templates never set a description tag, or the copy you wrote runs 250 to 290 characters and Google truncates it around 155 to 160. The fix is to clamp description length at the source and keep the full text visible on the page. Confirm with `curl -s <url> | grep -o "<meta name=\"description\"[^>]*>"`.
Seen in 19 of 450 scanned projects (4%). Based on Deep Scan runs across 450 audited production sites.
How to tell you have it
- Homepage or category pages show no description snippet in search results
- Search snippets end mid-sentence with an ellipsis
- Multiple templated pages share the identical description text
- Meta description tag is present but empty or just the site tagline
- Social share previews pull the wrong or truncated text alongside the meta tag
Why it matters
A missing description is not neutral. When the tag is absent, Google generates its own snippet by scraping whatever text sits near the top of the page, often a cookie banner, a nav label, or a stray line from a footer component. That snippet is unpredictable and it changes as the DOM changes, so click-through rate on that page becomes a moving target you cannot optimize.
Descriptions between 250 and 290 characters look fine in a CMS preview pane but get hard truncated in the results page, usually mid-word, which reads as sloppy to a searcher deciding whether to click. Worse, if the meaningful differentiator, the number, the price, the specific feature, was placed at the end of the sentence, it gets cut and never seen.
Templated pages that all inherit the same fallback description (a single sentence set once at the layout level) send Google a duplicate-content signal even when the page bodies are unique. Search engines interpret that as low editorial effort and it can suppress how many of those pages get indexed at all, not just how they are displayed.
A homepage with no single keyword-rich H1, often because the hero is an image or a logo with no accompanying heading text, forces Google to infer the page topic from weaker secondary signals. Combined with a generic or missing description, the homepage ends up ranking for the brand name only, never for the terms prospects actually search.
How Heygents detects it
Deep Scan fetches the rendered HTML with `curl -s <live url>` for the homepage and a sample of templated pages, then extracts and measures every `<title>` and `<meta name="description">` tag, checks for a single `<h1>` on the homepage, and inspects the page for `Organization`, `WebSite` with `SearchAction`, and `FAQPage` JSON-LD blocks via a script-tag scan.
How to fix it
- Pull every description tag across the site and measure length Run a quick length audit against a list of URLs before touching any code. This tells you whether you have a missing-tag problem, a too-long problem, or both, and on which templates.
- Clamp the description at the source, not in the template Write the full description as long-form copy for on-page use (an intro paragraph, an about section) and generate the meta tag from a truncation helper so it never exceeds 155 characters, breaking on a word boundary rather than mid-word.
- Give templated pages a unique description, not a layout-level fallback Move the description prop down to the route or content model level so each templated page (product, category, article) interpolates its own title and one distinguishing fact, instead of all pages resolving to the same layout default.
- Add a real H1 and baseline structured data to the homepage Give the homepage one visible, keyword-relevant H1 (it can be visually styled small, it does not need to look like a heading), then add Organization and WebSite with SearchAction JSON-LD so search engines and AI crawlers can resolve who the site belongs to and how internal search works. Add FAQPage markup only on pages with genuine visible Q&A content.
- Validate the JSON-LD before shipping Any malformed structured data block gets silently ignored by search engines, so lint it as part of the same change rather than trusting the preview panel.
Pull every description tag across the site and measure length
while read -r url; do
desc=$(curl -s "$url" | grep -oP '(?<=name="description" content=")[^"]*')
len=${#desc}
echo "$len $url"
done < urls.txt | sort -n
Clamp the description at the source, not in the template
function metaDescription(fullText, max = 155) {
if (fullText.length <= max) return fullText;
const clipped = fullText.slice(0, max);
const lastSpace = clipped.lastIndexOf(' ');
return clipped.slice(0, lastSpace).trim() + '.';
}
// page keeps the full copy, head tag gets the clamped version
const description = metaDescription(page.introText);
Give templated pages a unique description, not a layout-level fallback
export const metadata = {
title: `${item.name} | <app>`,
description: metaDescription(
`${item.name}: ${item.oneLineFact}. ${item.shortBenefit}.`
),
};
Add a real H1 and baseline structured data to the homepage
{
"@context": "https://schema.org",
"@type": "WebSite",
"url": "https://example.com",
"name": "<app>",
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
Validate the JSON-LD before shipping
curl -s <url> | grep -A50 'application/ld+json' | node -e "process.stdin.resume(); let d=''; process.stdin.on('data',c=>d+=c); process.stdin.on('end',()=>{ const m = d.match(/\{[\s\S]*\}/); JSON.parse(m[0]); console.log('valid JSON-LD'); })"
Find this in your own projects, automatically
Heygents runs a read-only Deep Scan across every project you own, finds issues like this one, and hands you a ready-to-run fix an AI agent can execute and verify. A solo developer gets the audit, the backlog and the fix loop in one place.
Open Heygents →Frequently asked questions
What is the actual character limit for a meta description?
There is no hard character cap, Google truncates based on rendered pixel width, but 155 characters is a safe practical ceiling that rarely gets cut on desktop or mobile. Staying near 120 to 155 characters and front-loading the distinguishing fact keeps the snippet readable even under stricter mobile truncation.
Does a missing meta description hurt rankings directly?
Not as a direct ranking factor, but it hurts indirectly. Google auto-generates a snippet that is usually worse than what you would write, which lowers click-through rate, and low click-through rate on a ranking page is a signal that can suppress future visibility over time.
Should every templated page get a unique description or is a smart template enough?
A template is fine as long as it interpolates real per-page data, a name, a stat, a specific benefit, rather than resolving to identical text across pages. The test is simple: pull ten rendered descriptions from ten different pages and confirm no two are the same string.
Do I need FAQPage structured data on every page?
No, only add FAQPage markup to pages that already show the same questions and answers visibly in the rendered HTML. Marking up content that is not visible to users violates structured data guidelines and can trigger a manual action, so treat it as a match to existing content, not an SEO add-on.
Can I fix this without redeploying, just by editing the CMS?
For content pages, yes, if your CMS exposes a per-entry description field you can edit and save without a deploy. For the homepage H1, title templates and structured data, you almost always need a template or code change, because those are layout-level concerns baked into the rendered shell rather than per-entry content fields the editor controls.