Better product titles and descriptions in your Google Merchant Center feed can help Google match your products to searches, and AI is a fast way to draft them. It is also an easy way to get products disapproved: promotional text, shouting in capitals, made-up GTINs and mismatched stock status are the usual causes. This post uses Google's own attribute pages, read on 2026-10-09, to set the rules first, then gives prompts and a small checker script that I ran.
Status: the rules below come from Google Merchant Center help pages fetched and read as full text on 2026-10-09. I could not read Shopify's own help pages (the site returned a browser verification challenge to my command-line fetch), so I say what I could not confirm about how the Shopify app maps fields. The prompts are untested templates. The script output is real, on a made-up four-row feed.
What does Google actually require in titles and descriptions?
These are the points from the title and description attribute pages that matter when AI drafts your copy.
Title:
- 1 to 150 characters. Too long gets truncated with a warning.
- It must describe the product on your landing page. Variant details go in it, for example "Cotton Kurta, Indigo, M", and also in the color and size attributes.
- No promotional text such as price, sale dates, shipping or your company name. No all caps for emphasis, no symbols or HTML.
- Best practice from the page: put the most important details first, because users usually notice only the first 70 or fewer characters.
Description:
- 1 to 5,000 characters, and required for each product.
- Describe the product itself. Do not describe your business history or policies, compare to other products, include links, or include promotional text.
- Best practice: put the most important details in the first 160 to 500 characters. Cover size, material, pattern, special features and variant differences.
- Keep it consistent with the title and the landing page.
If a model's draft breaks any of these, the product risks a disapproval or limited visibility. That makes the rules a better filter than "does it sound good".
Do AI-written titles need a special label?
Yes, per the pages as read on 2026-10-09. Both attribute pages say that titles and descriptions created using generative AI must go in the structured attribute rather than the plain one.
For a title, the structured form has a content sub-attribute (the text) and a digital_source_type sub-attribute. For AI text, the type is trained_algorithmic_media. In an XML feed it looks like this, adapted from Google's own pattern:
<g:structured_title>
<g:digital_source_type>trained_algorithmic_media</g:digital_source_type>
<g:content>Cotton Kurta, Indigo Block Print, Mandarin Collar, M</g:content>
</g:structured_title>
In a text feed, the value is the type, a colon, then the content (for example trained_algorithmic_media:"Cotton Kurta, Indigo Block Print, M"), with quoting rules if the content contains a colon or a double quote. The same pages state that if you submit both the plain and the structured attribute, Google uses the plain one, so do not send both. Descriptions follow the same pattern with structured_description.
Two honest caveats:
- I do not know how your Shopify setup handles this. Merchant Center's navigation lists a section for managing your account with a Shopify integration, but I could not read Shopify's side of it. Whether the Shopify channel app passes
structured_title, and how it treats edits you make, is something to check in your own Merchant Center diagnostics and your app's settings. - "Created using generative AI" is Google's wording, and the line between AI-drafted and AI-edited is not defined on those pages. If a model produced or substantially rewrote the text, the safe reading is to label it. If you have a compliance question, ask Google's support rather than relying on me.
What does a good AI workflow for feed titles look like?
Draft in a spreadsheet, not in the Shopify editor, so you can bulk-check and compare. One row per product variant.
- Export products (Shopify's product export, or the Merchant Center data source) with title, description, vendor, type, colour, size, price, availability, and GTIN where you have it.
- Give the model only the facts in those columns. Tell it to leave a field blank if it lacks the fact.
- Run the checker script below on the new titles.
- Spot-check ten rows against the landing pages with your own eyes.
- Upload, then watch Merchant Center diagnostics for the next few days.
Title prompt (untested template):
You are formatting product titles for a Google Merchant Center feed.
Rules: max 150 characters; put product type and the key distinguishing
detail first; include brand, colour, size and material only if given in
the data; no price, sale words, shipping words, store name, all caps
words, emoji or symbols. Use only facts in the row. If a fact is missing,
leave it out; do not guess.
Return JSON: [{"id": "...", "title": "..."}].
Rows: [paste CSV rows: id, current title, type, brand, colour, size, material]
Description prompt (untested template):
Write a product description for a Google Merchant Center feed from the
facts below. 300 to 600 characters is fine. Put the main use, material
and fit in the first 160 characters. Describe only this product. No
price, no shipping, no store history, no links, no comparisons, no
superlatives I cannot support. If a fact is not listed, do not state it.
Facts: [paste facts for one product]
For richer storefront copy rather than feed copy, see ChatGPT prompts for Shopify product descriptions. The feed version is shorter, flatter and stricter on purpose.
Which feed fields should AI never touch?
Some attributes are facts about the world, and a model that "improves" them creates disapprovals or mismatches.
- GTIN. Google's GTIN page says to submit one only when you are sure it is correct; guessing or making up a value is not allowed. A GTIN needs a valid length (8, 12, 13 or 14 digits) and a correct check digit, and the page says products with missing or incorrect GTINs may have limited visibility. Do not paste a model-made GTIN. If your product is your own brand with no GTIN, send brand and MPN instead.
- Variant GTINs. Each variant (size, colour) has its own GTIN when assigned. Do not reuse one across sizes. Google also says not to submit multiple products for the same country and language with the same GTIN and the same variant attribute values.
- Availability. The page says the value must match your website. Valid values are
in_stock,out_of_stock,preorderandbackorder. Per the same page,preordershould be for new, unreleased products, andbackorderis for existing products that are out of stock and will return while you accept orders; both need an availability date visible on the landing page. If the feed says in stock but the page or checkout says otherwise, Google says it disapproves the product. - Item group ID. Variants of the same product share one
item_group_id, and each variant has its ownid. A non-variant, such as a suit made of a jacket and trousers, should not carry one. Casing counts as the same value ("abc123" equals "ABC123"). Google's page also describesitem_group_titleandvariant_optionfor grouping variants, so check whether your feed app sends them. - Price and sale price. These come from your store, not the model.
- Size. If you sell fashion, the size attribute has its own rules; the size chart and fit FAQ post covers it for fashion D2C.
How can I check a feed before uploading?
This script applies the rules above to a CSV. It checks title and description length, shouted capitals and promotional words in titles, valid availability values, GTIN length and check digit, GTINs shared across items, and a size without an item_group_id. The thresholds come from the Google pages cited above. The promo-word list is deliberately tiny, so extend it.
import csv, sys, collections
AVAIL = {"in_stock", "out_of_stock", "preorder", "backorder"}
def gtin_ok(g):
g = g.replace(" ", "").replace("-", "")
if not g.isdigit() or len(g) not in (8, 12, 13, 14):
return False
digits = [int(c) for c in g]
body, check = digits[:-1], digits[-1]
total = 0
for i, d in enumerate(reversed(body)):
total += d * (3 if i % 2 == 0 else 1)
return (10 - total % 10) % 10 == check
rows = list(csv.DictReader(open(sys.argv[1])))
seen = collections.defaultdict(list)
for r in rows:
pid, t, d = r["id"], r["title"], r["description"]
issues = []
if not t: issues.append("title missing")
if len(t) > 150: issues.append(f"title {len(t)} chars (limit 150)")
if t and t.upper() == t and len(t) > 10: issues.append("title is all caps")
if "%" in t or "free shipping" in t.lower(): issues.append("promotional text in title")
if not d: issues.append("description missing")
if len(d) > 5000: issues.append("description over 5000 chars")
if r["availability"] not in AVAIL: issues.append(f"availability '{r['availability']}' not valid")
g = r["gtin"].strip()
if g:
if not gtin_ok(g): issues.append(f"gtin {g} fails length/check digit")
seen[g].append(pid)
if r["size"] and not r["item_group_id"]: issues.append("size set but no item_group_id")
print(f"{pid}: {'; '.join(issues) if issues else 'ok'}")
for key, ids in seen.items():
if len(ids) > 1:
print(f"gtin {key} shared by {ids} (each variant needs its own)")
I ran it on a four-row test feed I wrote, with deliberate faults: a shouted promotional title with no description and an invalid availability string, and one GTIN reused across two sizes. Real output on 2026-10-09:
KUR-IND-M: ok
KUR-IND-L: ok
KUR-RED-M: title is all caps; promotional text in title; description missing; availability 'In Stock' not valid; gtin 3234567890127 fails length/check digit
CAN-SOY-200: ok
gtin 3234567890126 shared by ['KUR-IND-M', 'KUR-IND-L'] (each variant needs its own)
A passing check does not mean Google will approve the product. The checker cannot see your landing page, so it cannot tell whether the title matches the page or whether stock status is true. It catches mechanical errors cheaply, which leaves your attention for the ones that need judgment. The GTIN 3234567890126 is the sample value from Google's own documentation, which happens to pass the check digit test, and reusing it across sizes is exactly the mistake the last line flags.
What about structured data on the product page itself?
A feed is half of it. Google's product structured data introduction (page last updated 2025-12-10, read 2026-10-09) says you can provide product data through markup on your pages, through Merchant Center feeds, or both, and that providing both maximizes eligibility and helps Google verify your data. It also says some experiences combine the two sources. So make your page and feed agree: same price, same availability, same variant naming. Most Shopify themes output product markup already; check yours with Google's Rich Results Test rather than writing JSON-LD with a model.
For the surrounding SEO, the collection page workflow covers category pages, and the Shopify India payments setup covers checkout, which matters because Google compares what the feed says to what checkout shows.
A short rollout plan
- Pick 20 products, not the whole catalogue.
- Generate titles and descriptions with the templates, then run the checker.
- Review 10 by eye against the landing pages and fix anything the model embellished.
- Decide how you will label AI-created text given your Shopify setup, and confirm in diagnostics that it is accepted.
- Compare the diagnostics warnings after a few days. If disapprovals are low, widen the batch.
I will not quote an expected lift in clicks or sales because I have no data for your store. Measure your own: impressions and clicks per product in Merchant Center before and after, over several weeks, for a similar group of products you did not change.



