Skip to content

Metaobjects for reusable content

Reuse the same testimonials, press logos, trust badges, or size charts across multiple pages without re-typing them. Set them up once in Shopify's metaobject definitions, then pick the list in your section's settings.

The five sections that support this pattern are Testimonials, Press coverage, Trust badges, Logo list, and Size chart. Each section accepts either merchant-added blocks (the default — zero setup) or a metaobject list (opt-in — enables reuse). If both are set, the metaobject list wins. If neither is set, the theme editor shows a prompt in every one of them; on the storefront the empty behaviour varies: Trust badges and Logo list render nothing visible, Testimonials and Press coverage still show their heading band (both ship a default heading you can clear), and Size chart always renders its trigger button and dialog shell.

TIP

If you don't need reusable content, just leave the metaobject list empty and add blocks directly to the section. Every section works either way.

Testimonials

Fields the theme looks for (alternative names are accepted; the first name found wins):

json
{
  "quote": "Customer testimonial text (rich text). Alternate: body",
  "author": "Author name (text). Alternate: name",
  "author_title": "Optional — author role or title (text)",
  "rating": "Optional — integer 0-5",
  "author_image": "Optional — file (image)"
}

Setup steps

  1. Shopify Admin → Settings → Custom data → Metaobject definitions → Add definition.
  2. Name it "Testimonial". Shopify will set the handle to testimonial.
  3. Add fields: quote (Rich text), author (Single line text), author_title (Single line text, optional), rating (Integer, optional), author_image (File — Image, optional).
  4. Create at least 3 entries populated with real customer quotes.
  5. In the theme editor, click your testimonials section → under Content source, pick your Testimonial list.
  6. Save. The storefront now renders testimonials from your metaobject entries.

TIP

Want to switch back to blocks later? Clear the metaobject list picker; your existing section-local blocks render again.

Press coverage

Fields the theme looks for:

json
{
  "logo": "File — Image (press outlet logo)",
  "link": "Optional — URL (article link)",
  "alt": "Alt text (text). Alternate: name",
  "quote": "Optional — short pull quote (text)",
  "source": "Optional — source/byline (text)"
}

Setup steps

  1. Shopify Admin → Settings → Custom data → Metaobject definitions → Add definition.
  2. Name it "Press mention". Shopify will set the handle to press_mention.
  3. Add fields: logo (File — Image), link (URL, optional), alt (Single line text), quote (Single line text, optional), source (Single line text, optional).
  4. Create one entry per press outlet.
  5. In the theme editor, click your Press coverage section → under Content source, pick your Press mention list.
  6. Save.

TIP

If you also use the Logo list section for brand/partner logos (not press), create a separate "Brand logo" definition (handle: brand_logo) with just logo, link, alt — that's the type the Logo list section expects.

Trust badges

Fields the theme looks for:

json
{
  "icon_name": "Lucide icon name (text) — e.g. 'truck', 'lock', 'shield'. Used when icon_image is empty",
  "icon_image": "Optional — file (image). Takes precedence over icon_name when set",
  "heading": "Badge heading (text). Alternate: name",
  "text": "Badge supporting text (text). Alternate: body"
}

Setup steps

  1. Shopify Admin → Settings → Custom data → Metaobject definitions → Add definition.
  2. Name it "Trust badge". Shopify will set the handle to trust_badge.
  3. Add fields: icon_name (Single line text), icon_image (File — Image, optional), heading (Single line text), text (Single line text).
  4. For each entry, set icon_name to any Lucide icon name — the metaobject path accepts the full Lucide library, well beyond the 47 names offered in the section's inline block icon picker (truck, lock, refresh-cw, headphones, shield, heart, star, leaf, check-circle, package, clock, globe, credit-card, award, zap, thumbs-up, phone, mail, map-pin, users, gift, tag, percent, flame, droplets, eye, wrench, coffee, sun, moon, umbrella, smile, crown, gem, wallet, store, shopping-bag, receipt, barcode, calendar, ruler, camera, medal, circle-check, info, alert-triangle, help-circle).
  5. Alternatively, upload a custom image to icon_image — when set, the image renders instead of the icon name.
  6. In the theme editor, pick your Trust badge list under Content source.

TIP

Lucide icons inherit the section's color scheme via currentColor. Custom uploads render at their native colors — use transparent PNGs for best results.

Size chart

Create one definition named "Size chart" — Shopify sets the handle to size_chart, and that is the only type the Size chart section's Content source picker offers. Entries of any other definition can't be selected there, so don't split image charts and table charts into separate definitions.

One definition covers two shapes, because every field below the display name is optional. Each entry uses whichever fields you fill in, and the theme picks the shape per entry:

  • Fill in header_row / data_rows → the entry renders as a table.
  • Fill in image only → the entry renders as a figure.
  • Fill in both → the table wins.

That means a single list can hold table entries and image entries side by side.

Fields

json
{
  "name": "Display name (text) — e.g. 'Men's shirts'",
  "image": "Optional — file (image): size chart photo or diagram. Alternate: chart_image",
  "alt": "Optional — alt text for the image (text). Alternate: description",
  "header_row": "Optional — pipe-delimited header cells (text) — e.g. 'Size | Bust | Waist | Hip'",
  "data_rows": "Optional — list of lines (text list), each line pipe-delimited — e.g. 'S | 36 | 28 | 38'"
}

Setup steps

  1. Shopify Admin → Settings → Custom data → Metaobject definitions → Add definition.
  2. Name it "Size chart". Shopify will set the handle to size_chart.
  3. Add fields: name (Single line text), image (File — Image, optional), alt (Single line text, optional), header_row (Single line text, optional), data_rows (Single line text — list, optional).
  4. Create entries — one per product category (e.g. "Men's shirts", "Women's dresses"). Fill in the image fields, the table fields, or both.
  5. In the theme editor, click your Size chart section → under Content source, pick your list.

Example table entry

Use the pipe character | to separate cells within a row.

  • name: Women's dresses — EU sizes
  • header_row: Size | Bust (cm) | Waist (cm) | Hip (cm)
  • data_rows (as individual list items):
    • XS | 82 | 64 | 90
    • S | 86 | 68 | 94
    • M | 90 | 72 | 98
    • L | 94 | 76 | 102
    • XL | 98 | 80 | 106

The storefront renders these as a proper semantic <table> with <thead> and <tbody>, which works for screen readers and copy-paste.

TIP

Prefer the table fields for sizing grids (clothing, shoes) — shoppers can scan measurements side-by-side. Use the image field when your brand already ships a visual measurement guide photo or diagram.

Troubleshooting

  • Section renders nothing on the storefront. The metaobject list has 0 entries AND no blocks are added to the section. Either add at least one entry to the metaobject list, or add blocks to the section. Trust badges disappears entirely in that state (unless you've set a heading) and Logo list leaves an empty band; Testimonials and Press coverage still show their heading, and Size chart still shows its button and empty dialog.
  • Section renders blocks when I expected metaobjects. The metaobject list setting is blank in the theme editor. Re-pick the metaobject definition under Content source.
  • Field values look empty. The field name on your entries doesn't match what the theme looks for. Rename the field on your metaobject definition OR use one of the documented alternate names (e.g. body instead of quote for testimonials).
  • Size chart table cells don't split into columns. You're using a comma , instead of the pipe | as the delimiter. Use | to separate columns — commas conflict with measurement values that include commas themselves.
  • Size chart renders an image when I wanted a table. The entry has an image field populated AND no header_row / data_rows. Remove the image or add the table fields — the theme picks table shape only when the table fields are set.
  • Trust badge shows a blank icon. Either icon_name isn't a valid Lucide icon name OR both icon_name and icon_image are blank. Fix the name or upload an icon image.

Built for the Shopify Theme Store.