BigCommerce product pages carry more SEO surface area than most store owners realize. The platform generates a title tag, a meta description, a canonical URL, Open Graph markup, and JSON-LD structured data for every single product. Each of those outputs has a default behavior. Each default has a failure mode. And each failure mode costs you clicks, indexing, or rich results you should be earning.
This post walks through every optimization surface on a BigCommerce product page. Not the theory. The admin paths, the Stencil Handlebars code, the CSV columns, and the Akamai CDN parameters you’ll actually use. If you’ve read our BigCommerce SEO guide, consider this the product-page deep dive that guide pointed you toward.
Variant URL Handling: When to Index, When to Canonicalize
BigCommerce appends query parameters to the product URL every time a shopper selects an option set value. Pick “Blue” and “Medium” on a t-shirt, and the URL becomes /cotton-crew-tee/?sku=BLUE-M. That parameterized URL is not indexable by default. Google sees the canonical tag pointing to the parent product URL and consolidates signals there.
This default is correct about 80% of the time. Size variants rarely carry unique search volume. Nobody searches “Nike Dri-FIT size large” with purchase intent separate from the base product. Keeping size variants canonical to the parent consolidates link equity and prevents thin-content indexation of pages that differ only by a size label in the option selector.
When Variant URLs Deserve Their Own Index Entry
Color variants are the exception. “Navy blue running shoes” and “white running shoes” pull different search volumes, different image packs, and different Shopping results. A store selling the same shoe in 14 colors leaves 13 keyword clusters on the table if every color variant canonicalizes to a single parent.
BigCommerce handles this through option sets configured at Products > Product Options > Option Sets. Each option set generates its own URL parameter structure. To make a color variant indexable, you need three things:
- A unique product listing per color. Instead of one product with a color option set, create separate products: “Trail Runner – Navy,” “Trail Runner – White.” Each gets its own canonical URL, its own meta fields, its own image gallery.
- Unique title tags and meta descriptions per variant product. Duplicate meta across color variants triggers the same thin-content signals you’re trying to avoid.
- Cross-linking between color variants. Use the “Related Products” field or a custom Stencil widget to connect color siblings. This passes equity between them and helps Google understand the product family.
The failure mode here is splitting without differentiating. If you create separate products for each color but copy-paste the same description, the same title tag template, and the same alt text, you’ve manufactured duplicate content. Google will pick one variant to index and suppress the rest. You’ll have more SKUs to manage and fewer indexed pages than if you’d kept them as variants on a single parent.
The Hybrid Approach for Large Catalogs
Stores with 500+ products can’t realistically create unique listings for every color of every product. The pragmatic approach: identify the top 20% of products by revenue, check Google Keyword Planner for color-specific search volume on those products, and split only the variants where the data justifies it. Leave the long tail as option-set variants on parent products.
You can audit which variant URLs Google has discovered by checking the Pages report in Google Search Console and filtering for ?sku= parameters. If Google is already surfacing variant URLs in search results despite your canonicals, that’s a signal the search engine sees enough unique content to treat them independently. In that case, leaning into separate listings makes sense rather than fighting Google’s interpretation.
For deeper coverage of how BigCommerce handles canonical tags across product pages, category pages, and filtered views, see our guide to duplicate content, filters, pagination, and canonicals.
Title Tag Optimization Formula
The title tag field lives at Products > [Product Name] > SEO in the BigCommerce admin. If you leave it blank, BigCommerce auto-generates a title from the product name and appends your store name. The auto-generated format is {Product Name} | {Store Name}. This is functional but wastes character budget on branding that doesn’t drive clicks for non-branded queries.
The Formula That Works
After optimizing title tags across 40+ BigCommerce stores, we’ve settled on a formula that consistently outperforms the default:
{Primary Keyword} - {Modifier} | {Brand or Store Name}
Concrete example: Organic Cotton Crew Neck T-Shirt - Sustainably Made | GreenWear Co.
The primary keyword occupies the front of the tag, where Google assigns the most weight. The modifier adds a differentiator that improves CTR: “Free Shipping,” “Handmade,” “Pack of 6,” or a material/feature callout. The brand sits at the end, where it serves recognition without consuming prime keyword real estate.
Character Count Boundaries
Google displays roughly 55-60 characters of a title tag on desktop and slightly fewer on mobile. Titles longer than 60 characters get truncated with an ellipsis. The truncation itself doesn’t hurt rankings, but it does hurt CTR if the truncation chops off your brand name mid-word or cuts a modifier that was doing persuasion work.
Measure your titles in pixels, not characters. An uppercase “W” consumes more pixel width than a lowercase “i.” Tools like SERPsim or the Yoast preview simulate pixel-width rendering so you can see exactly where Google will cut.
Title Tag Failures to Avoid
Stuffing multiple keywords into a title tag backfires. Buy Cotton T-Shirt Organic T-Shirt Men's T-Shirt | Store reads like spam to users and triggers Google’s title-rewriting algorithm. When Google rewrites your title, you lose control entirely. Google’s rewrite is usually the H1 of the page, which may or may not match your SEO intent.
Another common failure: using the same title tag template across hundreds of products with only the product name swapped out. {Product Name} - Buy Online at {Store} repeated 600 times creates a sea of near-identical titles in Google’s index. Google devalues repetitive patterns. Vary your modifiers, rotate your value propositions, and front-load different keyword angles per product category.
Bulk Meta Description Generation via CSV
Writing unique meta descriptions for 500 products by hand is a 40-hour job. BigCommerce’s CSV export/import system turns it into a 2-hour spreadsheet exercise.
Step 1: Export Your Product Catalog
Navigate to Products > Export. Select “Products” as the export template. BigCommerce generates a CSV with every product field, including Meta Description as a column header. Download this file and open it in Google Sheets or Excel.
Step 2: Build a Formula-Based Template
Your meta description column is almost certainly empty or filled with auto-generated text. Create a formula that concatenates product-specific fields into a readable description. Here’s an example in Google Sheets syntax:
=CONCATENATE("Shop the ", A2, " from ", B2, ". ", C2, ". Free shipping on orders over $50. SKU: ", D2)
Where A2 is the product name, B2 is the brand, C2 is a short benefit pulled from a helper column you populate, and D2 is the SKU. The result reads: “Shop the Organic Cotton Crew Tee from GreenWear. Made with 100% GOTS-certified organic cotton. Free shipping on orders over $50. SKU: GW-OCCT-NVY.”
This isn’t perfect. Formula-generated descriptions lack the nuance of hand-written copy. But they’re dramatically better than blank meta descriptions, which force Google to pull snippet text from the page body. Google’s auto-pulled snippets often grab shipping policy fragments, size chart labels, or breadcrumb text. None of that drives clicks.
Step 3: Re-Import by SKU
Save your updated CSV. Go to Products > Import. Upload the file. BigCommerce merges records by SKU, so only the columns you’ve populated will overwrite. If you only filled in the Meta Description column and left everything else unchanged, nothing else gets touched.
The failure mode: importing a CSV with blank cells in critical columns. BigCommerce treats blank cells in an import as “clear this field.” If your export had a price column and you accidentally deleted the data in that column before re-importing, every product price resets to zero. Always trim your import CSV to only the columns you’re updating, plus the SKU identifier column.
Meta Description Copywriting Rules
Google bolds query-matching keywords in meta descriptions. A description that contains the exact search phrase gets visual emphasis in the SERP, which lifts CTR even without a ranking change. Front-load your primary keyword in the first 60 characters of the description, since mobile SERPs truncate meta descriptions earlier than desktop.
Keep descriptions between 120 and 155 characters. Shorter than 120 wastes available real estate. Longer than 155 gets truncated on desktop. Include one clear call to action: “Shop now,” “Compare models,” “See all colors.” A call to action converts impression to click better than a passive product summary.
Avoid duplicating the title tag content in your meta description. Google already shows the title above the description. Repeating the same keywords in both wastes the meta description’s persuasion opportunity. Use the title for keyword targeting and the meta description for value proposition and CTR drivers.
Product Description Writing for SEO
Manufacturer-supplied descriptions are the single biggest SEO liability on product pages. Every retailer who carries the same product gets the same boilerplate paragraph from the manufacturer. Google indexes 50 identical descriptions across 50 domains and picks one to rank. The other 49 get filtered as duplicate content. Your store is statistically likely to be one of the 49.
The Rewriting Framework
Rewriting a product description doesn’t mean rearranging the manufacturer’s sentences. It means answering questions the manufacturer didn’t address:
- Who is this product for? “Built for trail runners who log 30+ miles per week on rocky terrain” is more useful than “High-performance running shoe.”
- What problem does it solve that alternatives don’t? “The reinforced toe cap outlasts standard mesh uppers by 3x on gravel trails” differentiates where “durable construction” doesn’t.
- What does the product feel, look, or perform like in practice? First-person use experience creates content that no manufacturer spec sheet replicates. “The midsole bottoms out after mile 15 on pavement but holds firm on soft trails” is the kind of sentence Google won’t find on any competitor’s product page.
Content Length and Structure
Product descriptions don’t need to be 1,000 words. They need to be thorough enough to answer the queries that land on the page. For commodity products (basic t-shirts, phone cases), 150-250 words of unique copy is sufficient. For complex or high-consideration products (electronics, fitness equipment, specialty tools), 400-800 words with subheadings, specs tables, and use-case scenarios outperform thin descriptions.
Use HTML subheadings within the product description field. BigCommerce’s WYSIWYG editor supports H3 and H4 tags inside product descriptions. Structure like this:
<h3>Key Features</h3>
<ul>
<li>GOTS-certified organic cotton, 180gsm weight</li>
<li>Reinforced shoulder seams prevent stretching</li>
<li>Pre-shrunk: true-to-size after washing</li>
</ul>
<h3>Sizing Notes</h3>
<p>Runs true to size. The relaxed fit adds 1.5 inches
across the chest compared to our slim-fit line.</p>
Google parses these subheadings as content structure signals. A product page with clear H3 sections has a better chance of matching long-tail queries (“organic cotton t-shirt sizing”) than a single unbroken paragraph.
Internal Linking from Product Descriptions
Product descriptions are underused for internal linking. A product in the “Trail Running Shoes” category should link contextually to the category page, to a related buying guide, or to complementary products. These links pass PageRank within your site and help Google discover related content clusters.
For a broader look at how to structure SEO across your entire BigCommerce store, our BigCommerce SEO hub covers site-wide strategy beyond individual product pages.
Custom Fields That Feed Structured Data
BigCommerce’s Product JSON-LD schema includes name, description, image, sku, price, and availability by default. It does not include brand, gtin, or mpn unless you feed those values through custom fields and modify your Stencil theme to read them.
Adding Custom Fields in the Admin
Navigate to Products > [Product Name] > Custom Fields. Add each identifier as a separate custom field:
- Name:
brandValue:GreenWear - Name:
gtinValue:0012345678905 - Name:
mpnValue:GW-OCCT-NVY
Custom field names are case-sensitive. If your Handlebars template checks for “brand” but you entered “Brand” in the admin, the template match fails silently. No error. No output. The structured data field just stays empty, and your rich result eligibility drops without any visible warning.
The Stencil Handlebars Snippet
Open your theme’s templates/components/products/product-view.html file. Locate the existing JSON-LD script block. You’ll extend it to pull custom fields into the schema output:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "{{product.title}}",
"image": "{{getImage product.main_image 'product_size'}}",
"description": "{{plainTextTruncate product.description 200}}",
"sku": "{{product.sku}}",
{{#each product.custom_fields}}
{{#if name '==' 'brand'}}
"brand": {
"@type": "Brand",
"name": "{{value}}"
},
{{/if}}
{{#if name '==' 'gtin'}}
"gtin13": "{{value}}",
{{/if}}
{{#if name '==' 'mpn'}}
"mpn": "{{value}}",
{{/if}}
{{/each}}
"offers": {
"@type": "Offer",
"url": "{{product.url}}",
"priceCurrency": "{{currency_selector.active_currency_code}}",
"price": "{{product.price.without_tax.value}}",
"availability": "{{#if product.can_purchase}}https://schema.org/InStock{{else}}https://schema.org/OutOfStock{{/if}}"
}
}
</script>
The {{#each product.custom_fields}} loop iterates over every custom field on the product. The conditional {{#if name '==' 'brand'}} filters to the specific field name. This pattern is extensible: you can add color, material, or any property Schema.org supports by adding another conditional block inside the loop.
Validation After Deployment
After pushing the theme update, test with Google’s Rich Results Test at search.google.com/test/rich-results. Paste a product URL and verify that brand, gtin13, and mpn appear in the parsed output. Common failures:
- Trailing comma after the last property before the closing brace. JSON doesn’t tolerate trailing commas. If
mpnis the last custom field and it outputs"mpn": "GW-OCCT-NVY",with a comma, the entire JSON-LD block is invalid. - HTML entities in custom field values. An ampersand in a brand name (“Ben & Jerry’s”) renders as
&in the JSON-LD output, which fails validation. Encode values as plain text in the custom field. - Missing custom fields on some products. If a product doesn’t have a
gtincustom field, the template silently skips it. This is fine for optional fields but causes incomplete structured data ifbrandis missing on products where you need it.
For a complete walkthrough of Product, FAQ, Breadcrumb, and Organization schema on BigCommerce, see our structured data guide.
Open Graph Overrides in Stencil
BigCommerce auto-generates Open Graph tags from product data. The og:title pulls from the product name, og:description from the meta description (or product description if no meta is set), and og:image from the first product image. For most products, these defaults work fine. The problem starts when the auto-generated values don’t match what you want shared on social.
Why You’d Override OG Tags
Product images optimized for your store layout don’t always work on social platforms. A square product photo on a white background looks clean on your product page but gets lost in a Facebook feed full of lifestyle imagery. You want a different image for social shares: a lifestyle shot, an infographic, or a branded image with text overlay.
The auto-generated og:description pulls your meta description verbatim. Meta descriptions are written for search results. Social sharing contexts reward different copy: more casual, more emotional, more focused on social proof (“Over 10,000 sold”) than keyword targeting.
The Override Implementation
Open your theme’s templates/components/common/meta-tags.html file. The existing OG block looks something like this:
<meta property="og:title" content="{{page.title}}">
<meta property="og:type" content="product">
<meta property="og:url" content="{{page.canonical}}">
<meta property="og:image" content="{{page.og_image}}">
<meta property="og:description" content="{{page.meta_description}}">
To add custom OG image support, create a custom field named og_image on products where you want a social-specific image. Then modify the meta-tags template:
{{#each product.custom_fields}}
{{#if name '==' 'og_image'}}
<meta property="og:image" content="{{value}}">
{{else}}
{{#if @last}}
<meta property="og:image" content="{{../page.og_image}}">
{{/if}}
{{/if}}
{{/each}}
This checks for a custom og_image field first. If the field exists, it uses that URL. If the field doesn’t exist on the product, it falls back to the default BigCommerce OG image. Upload your social-optimized images to a CDN or your BigCommerce WebDAV file manager and paste the full URL into the custom field value.
Testing OG Tags
Facebook’s Sharing Debugger (developers.facebook.com/tools/debug/) scrapes and caches OG data. After updating your theme, paste your product URL into the debugger and click “Scrape Again” to force a fresh fetch. The debugger shows you exactly which og:image, og:title, and og:description Facebook will use when someone shares the link.
Twitter (X) uses its own card validator at cards-dev.twitter.com/validator. Twitter reads OG tags as fallbacks but prefers its own twitter:card, twitter:image, and twitter:description tags. Add these to your meta-tags template alongside the OG tags for full coverage.
Image CDN Transformation Parameters
BigCommerce serves product images through Akamai’s CDN. The default image URLs look like https://cdn11.bigcommerce.com/s-xxxxx/images/stencil/1280x1280/products/123/456/product-image__12345.jpg. That 1280x1280 in the path is a predefined image size configured in the Stencil theme’s config.json.
What most developers don’t know: the Akamai CDN layer accepts query parameters for on-the-fly image transformation. These aren’t officially documented in BigCommerce’s developer docs, but they work reliably and we’ve used them in production across multiple stores.
Dimension Parameters
Append ?w=800&h=800 to any BigCommerce CDN image URL to resize it on the fly. The CDN generates the resized version, caches it at the edge, and serves it for subsequent requests. This is useful for responsive image implementations where you need srcset values at specific breakpoints without pre-generating every size in the theme config.
<img
src="https://cdn11.bigcommerce.com/s-xxxxx/images/stencil/original/products/123/456/image.jpg?w=400"
srcset="
https://cdn11.bigcommerce.com/s-xxxxx/images/stencil/original/products/123/456/image.jpg?w=400 400w,
https://cdn11.bigcommerce.com/s-xxxxx/images/stencil/original/products/123/456/image.jpg?w=800 800w,
https://cdn11.bigcommerce.com/s-xxxxx/images/stencil/original/products/123/456/image.jpg?w=1200 1200w"
sizes="(max-width: 600px) 400px, (max-width: 1024px) 800px, 1200px"
alt="Organic Cotton Crew Tee in Navy"
loading="lazy"
width="1200"
height="1200"
>
The imbypass Parameter
Adding ?imbypass=on tells Akamai’s Image Manager to skip all image processing and serve the original uploaded file. Use this when:
- You’ve already optimized the image externally (TinyPNG, Squoosh, or a build-step optimization pipeline) and don’t want the CDN applying additional compression that introduces artifacts.
- You need the original image for a specific use case like print-quality downloads or zoom functionality that requires full resolution.
- Debugging image quality issues. If a product image looks blurry on the storefront, appending
?imbypass=ontells you whether the CDN’s compression is the cause or whether the source image was low quality to begin with.
SEO Impact of Image Optimization
Core Web Vitals penalize pages where images are the Largest Contentful Paint (LCP) element and load slowly. Product pages almost always have the main product image as the LCP element. Serving correctly sized images through CDN parameters instead of shipping a 3000×3000 original to mobile browsers directly impacts your LCP score.
Combine dimension parameters with the loading="lazy" attribute on below-fold images and fetchpriority="high" on the main product image. This two-part approach tells the browser to prioritize the hero image while deferring gallery thumbnails until the user scrolls.
Set explicit width and height attributes on every <img> tag. Without them, the browser can’t reserve layout space before the image loads, which causes Cumulative Layout Shift (CLS). CLS is a Core Web Vitals metric and a ranking factor. A single product image without dimensions can push your CLS score above Google’s 0.1 “good” threshold.
For stores needing deeper image optimization, performance audits, and Stencil theme customization, our BigCommerce development team handles these implementations end to end.
Review Schema and AggregateRating
Star ratings in search results increase CTR by 15-25% across every study that’s measured them. BigCommerce supports product reviews natively, but the default Stencil implementation doesn’t always output AggregateRating schema correctly. Third-party review apps (Yotpo, Judge.me, Stamped) inject their own schema, which can conflict with BigCommerce’s native markup and produce duplicate or contradictory structured data.
Native Review Schema
BigCommerce’s built-in review system stores reviews at Products > [Product Name] > Reviews. The Cornerstone theme includes review schema in the product JSON-LD block. The relevant portion looks like this:
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "{{product.rating}}",
"reviewCount": "{{product.num_reviews}}"
},
"review": [
{{#each product.reviews}}
{
"@type": "Review",
"author": {
"@type": "Person",
"name": "{{author}}"
},
"datePublished": "{{date}}",
"reviewBody": "{{text}}",
"reviewRating": {
"@type": "Rating",
"ratingValue": "{{rating}}"
}
}{{#unless @last}},{{/unless}}
{{/each}}
]
This works out of the box if you’re using BigCommerce’s native reviews. The failure modes are specific:
- Zero reviews. If a product has no reviews,
product.num_reviewsoutputs0andproduct.ratingoutputs0. AnAggregateRatingwithratingValue: 0andreviewCount: 0is invalid per Schema.org specs. Google’s Rich Results Test will flag it. Wrap the entireaggregateRatingblock in a conditional:{{#if product.num_reviews}}. - Rating scale mismatch. Schema.org expects
bestRatingandworstRatingproperties if your rating scale isn’t 1-5. BigCommerce uses a 1-5 scale by default, so this is rarely an issue, but custom review implementations sometimes use 1-10 scales without updating the schema.
Third-Party Review App Conflicts
Yotpo, Judge.me, and Stamped each inject their own JSON-LD review schema via JavaScript after page load. If your Stencil theme also outputs native review schema, Google sees two competing AggregateRating blocks on the same page. Google handles this by picking one, and you can’t control which one it picks.
The fix: if you’re using a third-party review app, remove the native review schema from your Stencil theme’s product JSON-LD block. Comment out or delete the aggregateRating and review sections. Let the third-party app own review structured data entirely.
Verify the cleanup by running the product URL through Google’s Rich Results Test. You should see exactly one AggregateRating result. If you see two, one source hasn’t been fully removed. Check for schema injected both in the page HTML (server-side from Stencil) and via JavaScript (client-side from the review app). Google renders JavaScript, so both sources get indexed.
Encouraging Reviews for Schema Eligibility
Google requires at least one review for AggregateRating to be eligible for star-rating rich results. Products with zero reviews get no stars in the SERP, no matter how well your schema is implemented. The structured data is valid only when there’s data to structure.
Post-purchase email sequences are the highest-converting review generation tactic. BigCommerce’s built-in abandoned cart emails don’t cover post-purchase review requests. Use Klaviyo, Omnisend, or your review app’s email feature to send a review request 7-14 days after delivery. Timing matters: too early and the customer hasn’t used the product. Too late and the purchase excitement has faded.
Incentivized reviews (discounts for leaving a review) are allowed by Google as long as the incentive doesn’t require a positive review. “Leave a review and get 10% off your next order” is fine. “Leave a 5-star review and get 10% off” violates Google’s review policies and can get your star ratings stripped from search results entirely.
Frequently Asked Questions
Does BigCommerce automatically generate JSON-LD structured data for product pages?
BigCommerce’s Cornerstone theme outputs basic Product schema including name, description, image, SKU, price, and availability. It does not automatically include brand, GTIN, MPN, or review data unless you configure custom fields and modify the Stencil theme templates. The auto-generated schema covers minimum viable structured data, but you’ll need theme-level edits to qualify for enhanced rich results like star ratings or product knowledge panels.
How do I fix duplicate content across BigCommerce product variants?
BigCommerce canonicalizes variant URLs (those with ?sku= parameters) to the parent product URL by default. This prevents duplicate content for size, material, or quantity variants. For color variants with independent search volume, create separate product listings with unique titles, descriptions, and images rather than relying on option sets. Audit variant indexing through Google Search Console’s Pages report, filtering for ?sku= parameters to see which variants Google has discovered.
What’s the fastest way to add meta descriptions to hundreds of BigCommerce products?
Export your product catalog via Products > Export, open the CSV in a spreadsheet, and use concatenation formulas to generate meta descriptions from product name, brand, and key features columns. Re-import the CSV through Products > Import. BigCommerce merges by SKU, so only the meta description column updates. Trim your import file to just the SKU and Meta Description columns to avoid accidentally overwriting other product data.
Can I customize Open Graph images per product in BigCommerce?
Yes, but it requires a Stencil theme modification. Add a custom field named og_image to any product where you want a social-specific image. Then edit your theme’s meta-tags.html template to check for this custom field and output its value as the og:image content. Products without the custom field fall back to the default BigCommerce behavior, which uses the first product image. Upload social-optimized images (1200×630 pixels for Facebook, 1200×600 for Twitter) to your CDN or BigCommerce’s WebDAV and paste the full URL into the custom field.
How do BigCommerce image CDN parameters affect page speed and SEO?
BigCommerce serves images through Akamai’s CDN, which supports query parameters like ?w=800&h=800 for on-the-fly resizing. Serving correctly dimensioned images instead of full-resolution originals directly reduces Largest Contentful Paint (LCP) time, which is a Core Web Vitals ranking factor. Combine CDN dimension parameters with srcset attributes for responsive delivery, explicit width and height attributes to prevent layout shift, and loading="lazy" on below-fold images. The ?imbypass=on parameter skips CDN compression entirely, which is useful for pre-optimized images or debugging quality issues.