← Insights

Shopify meta description length: what Google shows, and where the tag is set

Google sets no limit and cuts to the device width. The budgets we hold pages to, the admin fields and theme file that write the tags, and a five-minute check.

13 min read

Contents — 6 sections

The description is a suggestion, the title is a candidate, and the length is a width

Google's own account of the snippet is short. Snippets are built primarily from the page content, chosen to preview the part of the page that best matches the search, so the same page can show a different snippet for a different query. The <meta name="description"> tag is used when Google judges that it describes the page better than any passage on it. That is the whole contract, and it is in the snippet documentation, which also answers the question this page exists for in one sentence: there is no limit on how long a meta description can be, but the snippet is truncated as needed, typically to fit the device width.

The title link works the same way. Google's title link documentation lists the sources it draws on — the <title> element, the main visible heading, og:title, anchor text pointing at the page, other large and prominent text — and says it will produce its own title when it detects a problem with yours: boilerplate repeated across pages, keyword lists, a title that does not match the page, a store name that duplicates the one already shown in the result. And the same sentence about length: no limit on the element, truncated in results to fit the device width.

So the honest answer to "how long" is that Google does not count characters. It measures the rendered text against the width of the result on the reader's device and cuts with an ellipsis where the space runs out. A character count is a proxy for that width, used because it is the only thing an admin field can count. The budgets we hold our own pages to, and the ones the tooling behind this site refuses to publish outside of, are 30 to 60 characters for the full <title> including the store name, and 70 to 165 for the description. The ceiling is roughly where an ordinary mix of letters starts to be cut on a desktop result. The floor matters as much: one of the four bad examples in Google's documentation is a description that reads, in full, "Mechanical pencil", and a title that is only the product name gives Google every reason to write its own.

Two consequences follow from width rather than count. A title in capitals is cut sooner than the same count in lowercase. And a phone shows less than a desktop, so a description that fits on the laptop where it was written is cut on the device most of the traffic uses.

Shopify writes both tags from three admin fields and one theme file

There is no single place. There are three fields, one file, and a store name added by a line nobody filled in.

The homepage. Online Store, Preferences, the section titled Title and meta description. The description entered there is the Liquid shop.description, and both of Shopify's reference themes fall back to it for og:description on any page that has no description of its own.

Products, collections, pages and blog posts. Each edit screen ends with a section called Search engine listing, with a preview and an Edit link. Behind it are Page title and Meta description, which the Admin API exposes as the SEO object on a product or collection: two strings, title and description. When the title field is empty the product's own title is used. When the description field is empty, Shopify fills the tag from the opening of the product's description with the HTML stripped — open the source of any product whose listing has never been edited and the first sentence of its description is what you will find there. Both fields show a character counter. The number the counter runs to is Shopify's storage limit, not Google's display width; a description that fills the counter is a description that will be cut in half.

The theme. The admin values reach the page through two global Liquid objects, page_title and page_description, and the theme decides what to do with them. Shopify's metadata guide shows the pattern, and Dawn's layout/theme.liquid and Horizon's snippets/meta-tags.liquid both implement it line for line:

<title>
  {{ page_title }}
  {%- if current_tags %} &ndash; tagged "{{ current_tags | join: ', ' }}"{% endif -%}
  {%- if current_page != 1 %} &ndash; Page {{ current_page }}{% endif -%}
  {%- unless page_title contains shop.name %} &ndash; {{ shop.name }}{% endunless -%}
</title>

{% if page_description %}
  <meta name="description" content="{{ page_description | escape }}">
{% endif %}

Three things in those nine lines decide most of what a store's results look like.

The store name is appended to every title, after an en dash, unless the title already contains it. A store name of twelve characters costs fifteen with the dash and its two spaces, so the title typed into the admin has forty-five of the sixty, not sixty. A twenty-character store name leaves thirty-seven. This is the arithmetic behind most Shopify titles that get cut: the merchant wrote to sixty and the theme added the rest. Google's advice is to brand concisely, with the site name once behind a delimiter, which is what the theme does; it just does not say it is spending your budget to do it.

Page two of a collection gets – Page 2 before the store name, and a tag-filtered collection gets the tag list in quotes. Both are correct — they distinguish pages Google would otherwise treat as the same — and both are the first thing cut if the collection title was already long.

And the description tag is written only if page_description has a value. On a product that is nearly always true, because of the fallback to the product description. On a collection it is true only if someone typed something into the collection description or its search engine listing. Otherwise the tag is not emitted at all, and Google builds the snippet from what it can see, which on a collection page is a grid of product names. A collection with no description tag is the finding we write down most often under this heading.

og:title is the admin title without the store name. Google lists it among the sources a title link can come from, so the title without its suffix is a candidate whenever Google decides the <title> element has a problem.

A cut is an ellipsis, and a replacement is more common than a cut

The cut lands in the middle of whatever was there. On a title it usually falls inside the store name or the last word before it, which is a small loss. On a description it falls wherever the width ran out, and everything after it is gone: the free returns at the end, the delivery time, the size range. Whatever the reader was meant to take from the description has to sit in front of the cut, and on a phone the cut is earlier.

More often than cutting, Google replaces. The snippet documentation is explicit that snippets are chosen per query to emphasise the part of the page that relates to the search, so for a query the description does not address, Google takes a passage from the page that does. That is not a failure. It is the description losing the argument to the page's own text for that query, and it means the description competes with the first paragraph of the product page every time it is shown. Google names four ways to lose the argument outright: a list of keywords, the same description on every page, a description that does not summarise the page, and one that is too short.

Titles are replaced for the reasons above, and one is specific to how Shopify themes are built. When the store name in the <title> duplicates the site name Google already shows in the result, Google may drop it from the title link. The suffix you budgeted for can be removed and the title shown shorter than you wrote it. Plan for it being there; do not rely on it.

There is one control over length that is a rule rather than a budget. The robots meta tag accepts max-snippet with a number, the maximum characters Google may show as a textual snippet for the page, and the documentation notes that it also limits how much of the content may be used as direct input to AI Overviews and AI Mode. Neither reference theme sets it, and the default is no limit. It exists to shorten, not to lengthen, and the only reason to set it on a store is to keep the page out of AI answers — which, for a store trying to be named in them, is the wrong direction. If an app has added it to the head, that is a finding.

The first sentence has to be the answer, and it has to be on the page as well

Because the description only wins when it describes the page better than any passage on it, the description that wins is written like the best passage: a direct answer to the query the page exists for, followed by the facts a buyer needs before clicking.

For a product page the query is usually the product itself, and the answer is what it is, who it is for, and the one fact that distinguishes it — in that order, in the first clause, before any cut. Google's own example is a book described as author, illustrator, price and page count, and its documentation says product pages are where this earns its place, because price, material, size and availability are scattered across the page and the description can bring them together. A description that opens "Shop our beautiful collection of premium" has spent its first forty characters on nothing a buyer typed. One that opens with the product, its material and its sizes has answered the query before the cut and left the reason to click — the delivery time, the returns window — for the tail, where losing it costs least.

Then the same sentence goes at the top of the product description on the page. Three readers see that sentence, and none of them read the tag. The shopper. Google, when it decides the tag has lost the argument and uses the page instead. And an answer engine, when it decides whether the product is one it can describe, which is the mechanism in how to get your store recommended by ChatGPT: the first hundred words stating what it is, who it is for and what it costs, in extractable text. It is also the default meta description for every product nobody gets round to editing. A meta description that answers, above a first paragraph that does not, is a page that reads well only in the one place nobody visits.

For the title, the same shape at a tenth of the length: the product, the distinguishing attribute, the store name once. Not "Buy", not "Online", not "Free shipping", none of which the reader typed and all of which are the boilerplate Google's documentation says it rewrites. The distinguishing attribute is the part most product titles leave out — the colour, the size, the material, the version — and it is what lets two products from the same store be told apart on the same result page, which is the case Google's boilerplate examples are about.

Collections get a single sentence each, written by hand: what the collection is, for whom, and the range. There are rarely more than thirty of them, they are the pages that carry the category queries, and Google's advice to generate descriptions programmatically is aimed at large database-driven sites, not at thirty pages.

Price and star ratings, when they appear under a result, come from neither tag. They come from the Product structured data the theme emits, and Shopify product schema is where that gets checked.

Check every page in five minutes, and the one you care about in one

For one page, open it, open the browser console, and paste:

const d = document.querySelector('meta[name="description"]');
console.log(document.title.length, JSON.stringify(document.title));
console.log(d ? d.content.length : 'no description tag', d ? JSON.stringify(d.content) : '');

document.title collapses the whitespace the theme leaves inside the element, so the count is what a search engine reads. Against the budgets: a title over 60, a description under 70 or over 165, or no description tag at all. The third is the one to look for on collections.

For the whole store, Shopify publishes every product, collection, page and article URL in /sitemap.xml, which links to the child sitemaps. This reads the product and collection ones and prints the two counts per URL, with a half-second pause between requests:

import html, re, sys, time, urllib.request
from xml.etree import ElementTree as ET

STORE = sys.argv[1].rstrip('/')
HEADERS = {'User-Agent': 'meta-length-check/1.0'}

def get(url):
    req = urllib.request.Request(url, headers=HEADERS)
    with urllib.request.urlopen(req, timeout=20) as r:
        return r.read().decode('utf-8', 'replace')

def locs(xml):
    root = ET.fromstring(xml)
    out = []
    for entry in list(root.iterfind('.//{*}sitemap')) + list(root.iterfind('.//{*}url')):
        loc = entry.find('{*}loc')
        if loc is not None and loc.text:
            out.append(loc.text.strip())
    return out

pages = []
for child in locs(get(STORE + '/sitemap.xml')):
    if 'sitemap_products' in child or 'sitemap_collections' in child:
        pages += locs(get(child))

print('title_chars,description_chars,url')
for url in pages:
    src = get(url)
    t = re.search(r'<title>(.*?)</title>', src, re.S)
    m = re.search(r'<meta\s[^>]*name="description"[^>]*>', src)
    c = re.search(r'content="([^"]*)"', m.group(0)) if m else None
    title = ' '.join(html.unescape(t.group(1)).split()) if t else ''
    desc = html.unescape(c.group(1)) if c else None
    print(len(title), len(desc) if desc is not None else 'none', url, sep=',')
    time.sleep(0.5)

Run it with the store's address as its one argument, open the output in a spreadsheet, and sort each column. none in the second column is a page with no description tag; titles over 60 and descriptions outside 70 to 165 are the rewrite list, and it is usually shorter than the product count suggests, because the defaults do most of the work.

Which pages to fix first is a Search Console question. Performance, Search results, filter Page to contain /products/ or /collections/, sort by impressions, and read click-through rate against average position. A page at position four with half the click-through rate of the pages around it has a title or description losing to its neighbours, and it is the rewrite that pays. Then search that page's target query on a phone and read the result as it renders; the snippet varies by query, so the query is the test.

Fix the pages that earn the impressions first, and it takes an afternoon

First, the homepage, in Preferences: a title with the store name once and what the store sells, and a description that answers the query the store exists for. Ten minutes.

Second, the twenty pages with the most impressions in Search Console, products and collections together. Twenty titles to budget, with the store name's cost subtracted first; twenty descriptions that open with the answer and carry the facts. Two hours if the products' first sentences already say what they are; longer if that copy has to be written first, and it does have to be written first, because it is the default for every product you do not get to and the snippet Google prefers on every product you do.

Third, every collection with none in the script's second column. One sentence each. An hour for most stores.

Fourth, the store name, only if it is long. The options are to shorten it in Settings, which changes it everywhere it appears, or to leave it and write shorter titles. Removing the suffix from the theme is possible and usually wrong: Google's guidance is to include the site name once, and Google removes it itself when it is redundant.

Then wait. Google has to recrawl and reprocess a page to see a new title or description, and its documentation puts that at a few days to a few weeks; URL inspection in Search Console will request a recrawl for the twenty, one at a time. Read the click-through rate on those pages again after a month, at the same positions.

This is the mechanism behind the first-hundred-words line in section five of the store audit checklist, and it is the cheapest change on a store to measure. If you would rather have it measured across the whole store, ranked against everything else we find, and written up, that is the Store Teardown: €750, five days, and the document is yours whatever you decide to do with it.

Own your growth.Start with the teardown.

Start with a Teardown. Read it, then decide whether you want us to fix what it finds.