Shopify SEO. Product Templates
Shopify Product Title Tag Truncated? How Liquid Builds It, and the Fix
Quick answer
If your Shopify product title stops mid-word in Google, check the theme before you blame Google. A Liquid filter like {{ product.title | truncate: 70, '' }} chops the name at a fixed character count before Google ever sees it, and plenty of themes reuse the same cut for the H1. Remove the filter, give each product a short name, and build the title tag as short name, then the attribute that differs between siblings (shade, size, colour), then your brand. Set that once in theme.liquid, fill the short names in bulk by CSV or metafields, and recrawl slowly, because Shopify answers fast crawlers with 429 errors.
Written by Ram Kr Shukla, SEO and growth consultant
Google cuts long titles. That part’s normal. What isn’t normal is a title that already ends mid-word in your page source, before Google has touched it.
That’s what I found on an Indian cosmetics store running Shopify. All 12 of its highest-impression product URLs had title tags whose text before the brand suffix was 69 or 70 characters long. Every one stopped mid-word. The H1 on the page carried the same cut string. And the bit that got chopped was the shade, the one word that tells one product from its siblings.
This guide is the Shopify mechanics behind that: where the title tag and the H1 come from in Liquid, how a truncate filter produces the cut, what Google actually shows, a title formula that keeps the differentiator, and how to audit and fix a whole catalogue without touching products one at a time. It sits in my Shopify SEO library. If you want the wider product page checklist, the 12 elements of product page SEO covers title formulas in a paragraph. This post goes into the code.
How Shopify Builds a Product Title Tag
Three layers feed the <title> element on a product page. Most stores only ever look at one of them.
Layer 1, the product title. The Title field at the top of the product in admin. Shoppers see it as the product name in collection grids, the cart and order emails, and in most themes it’s the H1 as well.
Layer 2, the SEO title. Further down the product page, the Search engine listing section has a Page title field. Shopify’s Help Center says you can enter up to 70 characters there and suggests keeping to 60 to avoid shortened titles in results. Behind the scenes the value is stored as the title_tag metafield in the global namespace, according to Shopify’s developer docs. Leave the field blank and the page falls back to the product title.
Layer 3, the theme. Liquid in layout/theme.liquid takes the page_title object and wraps it in the title tag. Shopify documents the pattern on its theme SEO metadata page, and the free Dawn theme ships almost exactly this:
<title>
{{ page_title -}}
{%- if current_tags %} | tagged "{{ current_tags | join: ', ' }}"{% endif -%}
{%- if current_page != 1 %} | Page {{ current_page }}{% endif -%}
{%- unless page_title contains shop.name %} | {{ shop.name }}{% endunless -%}
</title>Two things fall out of those five lines. First, page_title is whatever the SEO title field holds, or the product title when that field’s empty. Second, the store name gets appended after it unless the title already contains it. So a 70-character SEO title turns into 70 characters plus a pipe plus your store name. The counter in Shopify admin never sees that suffix.
Either separator is fine for Google. Its title link documentation suggests putting the site name at the start or end of the title, split off with a hyphen, colon or pipe.
Where the H1 comes from
The H1 isn’t in theme.liquid at all. It lives in the product section, usually sections/main-product.liquid. In Dawn it’s a plain <h1>{{ product.title | escape }}</h1>. No SEO field involved. The H1 prints the product title even when you’ve written a separate SEO title.
That split matters for every fix later in this post. Edit the SEO field and only the title tag changes. Edit the product title and the H1 changes too, along with every grid card, cart line and email that prints the name.
Why Long Product Names Get Cut: the Truncate Filter
Liquid’s truncate filter shortens a string to a set number of characters. By default it adds an ellipsis, and the three dots count toward the limit. So {{ product.title | truncate: 70 }} gives you 67 characters plus three dots.
Pass an empty string as the second argument and the ellipsis disappears. {{ product.title | truncate: 70, '' }} returns exactly the first 70 characters, cut wherever character 70 lands. Mid-word, often.
That’s the signature I saw. Titles of 69 or 70 characters before the brand, no dots, ending in fragments. Whoever added the filter probably wanted to stop long names wrapping onto three lines on a phone. It did that job. It also took the end of every long product name off the H1 and the title tag in one go.
Why would a theme do this at all? Layout, usually. A card in a collection grid has room for two lines, a long name breaks the design, so someone adds truncate. The damage starts when that same snippet, or a copy of it, ends up printing the title tag or the H1. There’s also truncatewords, which cuts at a word boundary. Kinder, but it still decides what to drop by position, and position is the whole problem when the useful word comes last.
If the only goal was tidy grid cards, CSS can do that visually with a line clamp while the full name stays in the HTML. Google reads the HTML. Shoppers see two neat lines. Nobody loses the shade.
How to find the filter in your theme
Duplicate your live theme first and work in the copy. Open Edit code and search for truncate. The usual hiding places are layout/theme.liquid, any snippet with seo, meta or head in its name, and the section or block that prints the product name. Some SEO apps write their own title tag too, so view source on a live product page and check there’s only one. Then put the text inside the title tag next to the product title in admin. Shorter, and ending mid-word? That’s your cut.
What I Found on One Indian Cosmetics Store
Here’s the audit, with every identifier stripped. It’s a D2C beauty brand on Shopify, and I started with the product URLs that carried the most impressions in Search Console, because that’s where a bad title costs the most clicks.
The findings
- I checked the 12 highest-impression product URLs. All 12 were cut.
- The text before the brand suffix was exactly 69 or 70 characters on every one, ending mid-word.
- The H1 used the same truncated string, so the page heading was cut too.
- Product names were long and front-loaded with claim words (finish, skin benefit, skin tone). The shade, the only token that differs between SKUs, sat past character 70.
- Nineteen shade URLs of one complexion product shared a near-identical search snippet.
- The cause was a Liquid truncate on the product title with no ellipsis, used in both the title tag and the H1.
- Meta descriptions were the raw product description, and every one started with the section label What It Is.
- Product pages did carry Product, Offer, Brand and BreadcrumbList schema. Structured data was fine. The visible text wasn’t.
I won’t quote the real titles. They’d identify the brand. Here’s a made-up lip product in exactly the same shape, so you can see what the filter does. It’s illustrative.
Look at what’s left. Three different products, one identical title, and it ends in a fragment. Google’s title link docs have a name for repeated titles across related pages: micro-boilerplate. They also flag half-empty titles that are missing their main content. A truncated catalogue manages both at once.
The usual escape hatch doesn’t work either. When Google rewrites a title it often reaches for the H1, and on this store the H1 said the same cut thing. Product schema can’t rescue it: Google’s list of title link sources includes WebSite structured data, and Product markup isn’t on it.
It’s a template bug, not a copywriting problem. Nobody sat down and wrote a dozen bad titles. One line of Liquid wrote them all, and one line can fix them.
What Google Actually Displays
Google doesn’t set a character limit for titles. Its title link docs say there’s no limit on the title element, and the title link is truncated as needed, typically to fit the device width. Width is measured in pixels, so a capital W costs far more than a lowercase i. A 60-character title in capitals can be trimmed where a 65-character lowercase one fits.
Google doesn’t publish a pixel number. SEO tools model the desktop limit at roughly 580 to 600 pixels, and that’s a fair working guide, nothing more. Shopify’s own advice of 60 characters for the SEO field is the simpler rule, and it lines up.
Then there’s rewriting. When Google last explained its title system, it said it uses the title element around 87% of the time, up from around 80% before. The rest of the time it builds the title link from something else on or about the page: the main visual title, headings such as the H1, the og:title tag, prominent text, anchor text from links, or WebSite structured data.
The problems Google says trigger a rewrite
- Half-empty titles, where the main content is missing and only a site name or fragment is left.
- Obsolete titles, such as a year that’s no longer current.
- Inaccurate titles that don’t match what the page is about.
- Micro-boilerplate, where many related pages carry the same title and only a small detail would tell them apart.
- No clear main title, where several headings carry equal weight.
So there are two kinds of truncation, and they look different. Google’s own trim adds visible dots at the end of the blue link. A theme cut shows a raw word fragment with no dots, in the search result when Google uses your title, and in the browser tab every time. View source tells you which one you’ve got in about ten seconds.
A Title Formula That Keeps the Part That Matters
The formula is short: short name, then the attribute that differs, then brand.
Short name. The product’s real name plus the category noun a shopper would type. Two to five words. Claim words like weightless, hydrating, long wear and smudge proof are real selling points. They belong in the meta description and the first lines of the description, where they can persuade someone who’s already looking.
The attribute. Shade, size, colour, scent, pack size. Whatever tells this page apart from its siblings. Keep it inside the first 50 or so characters so it’s visible even when Google trims on a phone.
Brand. Last, after a pipe. Dawn adds it automatically when the title doesn’t already contain it, so you rarely need to type it.
| Situation | Before (illustrative) | After (illustrative) |
|---|---|---|
| Each shade is its own product | Featherlight Weightless Hydrating Matte Liquid Lip Colour, Smudge Proo | Featherlight Matte Lip Colour: Dusty Rose | Example Beauty (58 characters) |
| All shades on one product URL | Featherlight Weightless Hydrating Matte Liquid Lip Colour, Smudge Proo | Featherlight Matte Lip Colour, 12 Shades | Example Beauty (57 characters) |
| Colour as the differentiator | Trailblazer Waterproof Breathable Lightweight Hiking Jacket With Packa | Trailblazer Hiking Jacket: Olive | Example Outdoors (51 characters) |
The second row matters more than it looks. If every shade lives on one URL as a variant, that URL represents all of them. Naming one shade in its title would misdescribe the page. Name the range instead and let the shade pages, if you have them, carry the shade.
What about the H1? It can be fuller than the title tag. A full, untruncated product name works fine as the H1 while the title tag runs the shorter formula. Google’s guidance is about the two describing the same thing. Word-for-word matching isn’t required. The one rule that matters is that neither gets cut.
The Liquid Patterns
Four edits cover the usual setups. Make them in a duplicate theme, preview, then view source before you publish.
1. Remove the cut from the H1
{%- comment -%} Before: hard cut at 70 characters, no ellipsis {%- endcomment -%}
<h1 class="product__title">{{ product.title | truncate: 70, '' }}</h1>
{%- comment -%} After: the full name, escaped, no cut {%- endcomment -%}
<h1 class="product__title">{{ product.title | escape }}</h1>If the designer still wants short names on grid cards, leave the filter on the card snippet only. Cards aren’t headings, and the product page doesn’t depend on them.
2. Build the title tag from a short name and the attribute
This replaces the title block in layout/theme.liquid. It reads two product metafields you create under Settings, then Custom data, then Products: custom.short_name and custom.title_attribute, both single line text.
{%- liquid
assign seo_title = page_title
if request.page_type == 'product' and page_title == product.title
assign short_name = product.metafields.custom.short_name.value | default: product.title
assign attribute = product.metafields.custom.title_attribute.value
if attribute == blank and product.selected_variant
assign attribute = product.selected_variant.title
endif
assign seo_title = short_name | escape
if attribute != blank
assign attribute_safe = attribute | escape
assign seo_title = seo_title | append: ': ' | append: attribute_safe
endif
endif
-%}
<title>
{{ seo_title -}}
{%- if current_tags %} | tagged "{{ current_tags | join: ', ' }}"{% endif -%}
{%- if current_page != 1 %} | Page {{ current_page }}{% endif -%}
{%- unless seo_title contains shop.name %} | {{ shop.name }}{% endunless -%}
</title>How it behaves, line by line:
- It only runs on product pages, checked with
request.page_type, which Shopify documents as returningproductthere. - It only runs when the SEO field is empty, because that’s when
page_titleequals the product title. A hand-written SEO title always wins. - The short name falls back to the full product title, so a product without a metafield still gets a sensible title.
- The attribute comes from your metafield first. When that’s blank it uses the selected variant, but only when a
?variant=parameter is in the URL. - The brand suffix logic is Dawn’s own, so you won’t get the store name twice.
3. Pick the right variant object
This is the trap in most snippets you’ll find on forums. Shopify’s product object offers product.selected_or_first_available_variant, which returns the selected variant, or the first available one when nothing’s selected. On the canonical product URL nothing is selected. So a title built from it stamps one arbitrary shade onto the page that stands for all of them, and that shade changes whenever stock does.
product.selected_variant returns nil when there’s no variant parameter in the URL. That’s why the builder above uses it. Variant URLs typically canonicalise to the main product, so the title Google indexes is the clean one, and a shopper who shares a variant link still gets the shade in the browser tab. The variant’s own title is its option values joined by a slash, such as Dusty Rose or Olive / M, which reads fine after a colon.
When each shade is a separate product, as on the store I audited, there’s no variant to read. The shade goes into custom.title_attribute, or into the short name itself. Whether shades should be separate products at all is a bigger question, and I’ve written it up in Shopify variants vs separate products for SEO.
4. Give the meta description a better fallback
{%- liquid
assign meta_description = page_description
if request.page_type == 'product'
assign summary = product.metafields.custom.seo_summary.value
if summary != blank
assign meta_description = summary
endif
endif
-%}
{%- if meta_description != blank -%}
<meta name="description" content="{{ meta_description | strip_html | escape }}">
{%- endif -%}One caution: in this version the summary metafield beats the admin Meta description field. Pick one place to write descriptions and stick to it, or flip the logic so the admin field wins.
Meta Descriptions That Are Just the Product Description
When the Meta description field on a product is empty, Shopify fills the search listing from the product description. That’s the default, and on most stores nobody changes it.
On the cosmetics store, every product’s meta description began with the words What It Is, because the description opened with that section label. So the snippet under each blue link started with a heading fragment, repeated across the catalogue, followed by claim copy written for someone already on the page.
Google’s snippet documentation is clear on the basics. It builds snippets mainly from page content and uses the meta description when that describes the page better. It wants descriptions unique per page. And for large database-driven sites, it says programmatically generated descriptions are appropriate and encouraged, as long as they’re human-readable and diverse. It even suggests product pages pull scattered facts together into one description. That’s the case for a template with a summary metafield.
A pattern that works for product pages:
- Open with the short name and the attribute, so the snippet matches the title above it.
- Add one concrete benefit in plain words.
- Add one fact a shopper compares on: finish, size, number of shades, what’s in the box.
- Close with a service fact if it’s true for every product: delivery speed, returns, cash on delivery.
Shopify’s CSV accepts up to 320 characters in the SEO description column. Google trims to the screen anyway, so put the useful part in the first 140 to 160 characters and treat anything after that as a bonus.
How to Audit Every Product Title in Bulk
You can’t eyeball this across a catalogue. The tell is a spike: lots of titles with identical length. Real product names vary. A filter makes them all the same. Three ways to find the spike, from easiest to most flexible.
Option 1: Screaming Frog, throttled
Crawl in list mode, using the URLs from your product sitemap. Before you start, open the Speed settings and drop to about 1 thread and 1 URL per second. Shopify rate limits crawlers. On the cosmetics store, a crawl at Screaming Frog’s default 5 threads got 429 Too Many Requests on 83 of the 86 HTML pages it reached. Those 429s show up as client errors and look like real breakage when the site is fine. Never report findings from a crawl that contains them. I’ve covered the settings in detail in how to crawl Shopify without 429 errors.
Then use the Page Titles tab filters: Duplicate, Over 60 characters, Over X pixels, and Same as H1. Export the tab, add a column that strips your brand suffix, and add another for its length. Sort by length, or paste the export into my free title tag truncation checker, which spots the spike and the mid-word cuts for you. If a block of rows all reads 70, or 69 and 70, and the Same as H1 filter catches the same URLs, you’ve confirmed a template cut.
Option 2: a sitemap script
No crawler licence? Shopify publishes a sitemap index at /sitemap.xml that lists the product sitemaps. This short Python script walks them at one request a second and prints the length of every title before your brand.
import html, re, time
from collections import Counter
import requests
STORE = "https://yourstore.com"
BRAND = "Your Store" # the suffix your theme appends
HEADERS = {"User-Agent": "title-audit"}
def get(url):
r = requests.get(url, headers=HEADERS, timeout=30)
time.sleep(1) # one request a second
if r.status_code == 429: # rate limited: wait, then retry once
time.sleep(30)
r = requests.get(url, headers=HEADERS, timeout=30)
return r
def locs(xml):
return [html.unescape(u) for u in re.findall(r"<loc>(.*?)</loc>", xml)]
maps = [u for u in locs(get(STORE + "/sitemap.xml").text) if "sitemap_products" in u]
urls = [u for m in maps for u in locs(get(m).text) if "/products/" in u]
lengths = Counter()
for u in urls:
page = get(u).text
m = re.search(r"<title>(.*?)</title>", page, re.S)
title = " ".join(html.unescape(m.group(1)).split()) if m else ""
core = title.split(BRAND)[0].rstrip(" |:\u2013")
h = re.search(r"<h1[^>]*>(.*?)</h1>", page, re.S)
h1 = " ".join(re.sub(r"<[^>]+>", "", h.group(1)).split()) if h else ""
lengths[len(core)] += 1
print(len(core), "SAME_AS_H1" if core == h1 else "", u)
print(lengths.most_common(5))If the last line shows one length carrying a big share of your products, that’s your filter. Spot-check three products from different families in view-source to be sure.
Option 3: Search Console, for priority
Neither method tells you which cut titles cost money. Search Console does. In the Performance report, open the Pages tab, filter to URLs containing /products/ and sort by impressions. That’s how I picked the 12 I checked first. If you haven’t spent time in the less obvious reports, these seven Search Console reports are worth a look while you’re in there.
Bulk Editing Options on Shopify
Fixing the Liquid handles the template. The short names, attributes and descriptions still have to be written and loaded. Four routes, depending on catalogue size and who’s doing the work.
| Method | Best for | What it can change | Watch out for |
|---|---|---|---|
| Admin bulk editor | Dozens of products, done by the store team | Product title and any field you add through Columns | Check whether your admin lists the search engine listing fields under Columns. If not, use CSV. |
| CSV export and import | Hundreds of products in one pass | Title, SEO title (up to 70 characters), SEO description (up to 320) | With overwrite on, a blank column wipes existing values. Leave out columns you aren’t changing. |
| Metafields plus the Liquid builder | Catalogues where one formula should apply to every product | custom.short_name, custom.title_attribute, custom.seo_summary | One wrong line in the template hits every product. Preview in a duplicate theme. |
| Admin API | Thousands of SKUs, or syncing from a PIM | The global title_tag and description_tag metafields, via productUpdate | Needs a developer and an app with product write access. |
Sources for the table: Shopify’s bulk editing guide, its product CSV column reference, and the storefront SEO developer guide.
Should you shorten the product title itself or only the SEO title? Shortening the product title fixes the H1, grid cards and title tag in one move. It also changes the name in carts, emails and any feed that reads the title, so check your Google Merchant Center feed before you do it. Long names sometimes live there on purpose. Writing only the SEO title is safer for the feed but leaves the H1 long, which is fine as long as nothing cuts it.
Leave URL handles alone during all this. Shopify’s own product help warns against editing a handle too often, and a title change doesn’t need one.
The Fix, Step by Step
Here’s the order I’d run it in on any Shopify store, start to finish.
When the Title Isn’t the Whole Problem
Clean titles won’t fix architecture. On the cosmetics store, the 19 shade URLs of one product were each indexed as separate products with near-identical copy. Even with perfect titles they’d still compete with each other for the generic product term. That’s keyword cannibalisation, and the right owner for a generic head term is usually a collection page. I’ve written up how to build Shopify collection pages that rank.
Titles are also one item on a longer list of theme-level defaults. Duplicate collection paths and missing H1s on other templates sit in the same family, covered in Shopify’s built-in SEO traps.
And scale changes the stakes. When a store starts with 200,000+ URLs indexed, as the fashion store in my Shopify SEO case study did, nobody hand-writes titles. The template is the title. Get it wrong once and it’s wrong everywhere.
Questions I Get About Shopify Title Tags
Why is my Shopify product title tag cut off?
If the title in your page source already ends mid-word, your theme is cutting it, usually with a Liquid truncate filter on the product title. If the source is complete and only the search result is shortened, that’s Google fitting the title to the screen width. View source on the product page to tell which one you have.
What is the character limit for a Shopify title tag?
Shopify’s SEO title field accepts up to 70 characters, and Shopify suggests staying at 60 or under. Google itself has no character limit and trims by pixel width. Most themes also append your store name after the field, so budget for that suffix too.
Does Shopify add my store name to every title tag?
Most themes do. Dawn appends the store name to the page title unless the title already contains it. So you don’t need to type your brand into each SEO title, and if you do, the theme won’t add it twice.
Should the H1 and the title tag be the same on a Shopify product page?
They should describe the same product, but they don’t have to match word for word. The H1 can carry the full product name while the title tag uses a shorter formula with the shade or size and your brand. Neither should ever be cut mid-word.
How do I bulk edit SEO titles in Shopify?
Export your products as a CSV, fill the SEO title and SEO description columns, and import with overwrite turned on. Leave out any column you aren’t changing, because a blank column overwrites existing data. For a formula that applies automatically, store a short name in a metafield and build the title in theme.liquid.
Why does Google show a different title from the one I set?
Google uses your title element most of the time, but it rewrites titles that are half empty, inaccurate, outdated or repeated across many pages. It can pull from your H1, other headings or anchor text instead. Unique, complete titles that match the page give it little reason to.
Should I put the variant or shade in the Shopify title tag?
Yes, when the variant is what shoppers search for and it’s what tells your pages apart. Put it right after a short product name so it stays visible. If all shades share one product URL, name the range on that URL instead of one arbitrary shade.
Why do my Shopify meta descriptions just repeat the product description?
When the meta description field is empty, Shopify falls back to the product description, so the snippet starts with whatever opens your description, often a label or a claim. Write descriptions for your top products by CSV, or build a templated fallback from a short summary metafield.
Want your product template checked line by line?
I read the Liquid behind your title tags, H1s and meta descriptions, measure every product title against your Search Console data, and hand your developer the exact edits.
Shopify SEO ServicesBook an SEO AuditMore from the same audit: variants vs separate products and crawling Shopify without 429 errors. For the full catalogue approach, see my e-commerce SEO service.
Tags: Shopify SEOTitle TagsLiquidProduct Page SEO
Written by Ram Kr Shukla
SEO and growth consultant and Fractional Chief Digital Officer with 20+ years in SEO and growth across 50+ brands. Google Analytics and Google Ads certified. Works in Search Console, Screaming Frog and Shopify theme code to fix product and collection templates at catalogue scale.




