Skip to content

Product-safety information setup

Uisce can display the product-safety information you provide — warnings, instructions, a responsible-person contact, age or hazard notes. It cannot validate that information, certify that a product is safe, or confirm that you've met any legal requirement. That line matters: the theme is a presentation layer, and the accuracy and legal sufficiency of every safety detail are yours.

Not legal advice. This page explains how to surface safety information and where the theme stops. It does not certify product safety or interpret your obligations. The regulatory summaries below are pointers, not a compliance opinion — confirm what applies to your products and markets with a professional.

Who does what

OwnsIn practice
The theme (Uisce)DisplayRenders the safety text, warnings, and notes you enter into blocks or metafields
Shopify adminStorageProduct fields, metafields, and the policy pages that hold your data
You + your advisersAccuracy & legalityCorrect, current, complete safety data; legal review; responsible-person duties

Surfacing safety information today

You can present safety information now, using surfaces the theme already ships. Open a product in the theme editor and add blocks to the product section:

SurfaceGood for
Custom Liquid blockFree-form warnings, a responsible-person line, or a block that reads a product metafield
Accordion / collapsible tab"Safety & warnings" and "Instructions for use" sections that stay tidy
DescriptionShort, always-visible safety notes inline with the product copy
Policy acknowledgement blockAsking a shopper to acknowledge a safety note before purchase

For structured, per-product data, define your own product metafields in Settings → Custom data → Products and read them in a Custom Liquid block — the same pattern documented for pre-order setup. The theme reads metafields; you create the definitions (Theme Store rules don't allow themes to ship metafield definitions).

What the online offer must show

These are legal requirements you own — the theme only renders what you provide, and none of the fields below are mandated by the theme. What the law requires differs by market, and it applies to products in scope of the relevant regime — there are exemptions and interactions with sector-specific rules, so confirm what covers your goods:

EU & Northern Ireland — Regulation (EU) 2023/988 (GPSR), Article 19

For a product in scope of GPSR offered online to consumers in the EU or Northern Ireland, the offer must clearly show:

  • the manufacturer's name (or registered trade name / mark) plus postal and electronic address (e.g. an email address);
  • the applicable responsible person / economic operator — which one depends on the market and your supply-chain role, not simply on whether the manufacturer is outside the EU:
    • EU offer: where the manufacturer is not established in the Union, an EU responsible person's name plus postal and electronic address, additional to the manufacturer details;
    • NI offer: a responsible economic operator (REO) established in NI or the EU. This can be the manufacturer itself if it is established in NI or the EU, or an importer, authorised representative, or fulfilment-service provider — decided by your supply-chain role;
  • information identifying the product — its type, any batch / serial / other identifier, and a picture of the product (in Shopify this is usually the product's own media);
  • any warnings or safety information, in a language that consumers in the destination market can easily understand — so translate warnings and instructions for each market you sell into.

Great Britain (England, Wales, Scotland)

GB is not under EU GPSR. It is covered by the General Product Safety Regulations 2005 plus product-specific regimes, whose online-offer and labelling requirements differ. Confirm what applies to your goods.

Official sources: Regulation (EU) 2023/988, Article 19 · GPSR in Northern Ireland — detailed guidance · NI factsheet · General Product Safety Regulations 2005 (Great Britain).

Because a theme can't ship metafield definitions, you create these once in Settings → Custom data → Products and any Custom Liquid block reads them. This is a recommended, theme-agnostic shape — adopt only the keys you need.

These fields are optional to the theme: leave any empty and it simply doesn't render. But applicable law (e.g. EU GPSR, above) may make particular information mandatory for your market — meeting that is your responsibility, not the theme's.

Namespace & keyTypeHolds
safety.product_identifierSingle-line textProduct type plus a unique identifier — model, batch, or serial (GPSR Art. 19 product identification)
safety.warningsMulti-line textHazard / warning statements (e.g. "Keep away from children under 3")
safety.instructionsRich textInstructions for safe use
safety.hazard_pictogramsList of filesGHS/CLP or other pictogram images (upload as image files, not PDFs)
safety.age_restrictionIntegerMinimum age, where one applies
safety.certificationsList of single-line textStandards or marks you hold — stated as your claims, not theme-verified
safety.manufacturerRich textManufacturer name / registered trade name plus postal and electronic address (GPSR Art. 19)
safety.responsible_personRich textThe applicable responsible person / economic operator: name plus postal and electronic address. For an EU offer, an EU responsible person when the manufacturer is outside the Union (additional to the manufacturer details); for an NI offer, an REO established in NI or the EU (may be the manufacturer, importer, authorised rep, or fulfilment provider)

Read them in a Custom Liquid block with graceful absence — the section renders only when there is something to show, and every field is rendered type-correctly: the three rich-text fields through Shopify's metafield_tag (the raw metafield object is not the supported formatted-output path), lists iterated over .value, and pictograms rendered as images with alt text. Plain-text values are passed through escape — a metafield populated by an app or a bulk import is not auto-escaped, so raw output would let stray markup into the page.

liquid
{%- assign s = product.metafields.safety -%}
{%- liquid
  assign has_safety = false
  if s.product_identifier != blank or s.warnings != blank or s.instructions != blank or s.hazard_pictograms != blank or s.age_restriction != blank or s.certifications != blank or s.manufacturer != blank or s.responsible_person != blank
    assign has_safety = true
  endif
  assign safety_title_id = block.id | default: section.id | prepend: 'pdp-safety-title-'
-%}
{%- if has_safety -%}
  {%- comment -%}
    English scaffold: every user-facing and assistive string below (the heading,
    the age label, the pictogram alt fallback) is a placeholder. Translate them —
    and your warnings and instructions — through your store's locale workflow for
    each market you sell into; GPSR requires safety information in a language the
    consumer easily understands.

    The region heading id is suffixed with block.id (falling back to section.id)
    so several safety blocks on one page never emit duplicate ids.
  {%- endcomment -%}
  <section class='pdp-safety' aria-labelledby='{{ safety_title_id }}'>
    <h2 id='{{ safety_title_id }}' class='pdp-safety__title'>Safety information</h2>

    {%- if s.product_identifier != blank -%}
      <p class='pdp-safety__id'>{{ s.product_identifier.value | escape }}</p>
    {%- endif -%}

    {%- if s.warnings != blank -%}
      <p class='pdp-safety__warning'>⚠ {{ s.warnings.value | escape | newline_to_br }}</p>
    {%- endif -%}

    {%- if s.instructions != blank -%}
      <div class='pdp-safety__instructions'>
        <h3>Instructions for use</h3>
        {{ s.instructions | metafield_tag }}
      </div>
    {%- endif -%}

    {%- if s.hazard_pictograms != blank -%}
      <ul class='pdp-safety__pictograms'>
        {%- for image in s.hazard_pictograms.value -%}
          {%- assign pictogram_alt = image.alt | default: 'Hazard pictogram' -%}
          <li>
            <img
              src='{{ image | image_url: width: 96 }}'
              alt='{{ pictogram_alt | escape }}'
              width='48'
              height='48'
              loading='lazy'
            >
          </li>
        {%- endfor -%}
      </ul>
    {%- endif -%}

    {%- if s.age_restriction != blank -%}
      <p class='pdp-safety__age'>Minimum age: {{ s.age_restriction.value | escape }}</p>
    {%- endif -%}

    {%- if s.certifications != blank -%}
      <ul class='pdp-safety__certs'>
        {%- for cert in s.certifications.value -%}
          <li>{{ cert | escape }}</li>
        {%- endfor -%}
      </ul>
    {%- endif -%}

    {%- if s.manufacturer != blank -%}
      <div class='pdp-safety__manufacturer'>
        <h3>Manufacturer</h3>
        {{ s.manufacturer | metafield_tag }}
      </div>
    {%- endif -%}

    {%- if s.responsible_person != blank -%}
      <div class='pdp-safety__rp'>
        <h3>Responsible person / economic operator</h3>
        {{ s.responsible_person | metafield_tag }}
      </div>
    {%- endif -%}
  </section>
{%- endif -%}

Localize the scaffold. The headings, the age label, and the pictogram alt fallback above are English placeholders — a {% comment %} reminder does not make them multilingual. Translate every user-facing and assistive string through your store's actual locale / translation workflow (Settings → Languages, or a translation app), the same as any storefront copy. This is also a legal point: GPSR requires safety information in a language the destination-market consumer easily understands.

Keep the wording a signpost, never a verdict (see below): render what the merchant provides, never assert an outcome the theme can't back.

Readiness checklist

  • [ ] Confirmed the product is in scope of the relevant regime (exemptions and sector-specific rules checked).
  • [ ] EU: manufacturer name with postal and electronic address; an EU responsible person (name + postal + electronic address) added when the manufacturer is outside the Union.
  • [ ] NI: a responsible economic operator established in NI or the EU identified — manufacturer, importer, authorised rep, or fulfilment provider, per your supply-chain role.
  • [ ] GB: online-offer and labelling requirements confirmed under the GPSR 2005 and any product-specific regime.
  • [ ] Product identity shown: type + model / batch / serial and a product picture (the product's own media covers the picture).
  • [ ] Warnings and safe-use instructions entered — and translated for each destination market.
  • [ ] Every user-facing and assistive label in any custom safety block translated through your locale workflow.
  • [ ] Age-restricted products gated — see Regulated products & age checks.
  • [ ] Pictograms / labelling images uploaded where required.
  • [ ] Wording reviewed against the safe/unsafe guide below — signposts, not claims.
  • [ ] Legal sufficiency of every safety detail confirmed with a professional.

Planned

A purpose-built product-safety block — the schema above wired into a dedicated block with its own responsible-person, warnings, and hazard fields and styling — is planned for a future release. Until it ships, the recommended schema plus a Custom Liquid block cover the same ground.

Indicators without overclaiming

A small "Safety information" badge or icon on a product card or PDP is fine as a signpost — it tells shoppers where to read details. It must not read as a verdict. "See safety information" is a signpost; "Certified safe" is a claim you can't back from a theme surface. Keep indicators pointing at information, never asserting an outcome.

Safe vs. unsafe wording

From storefront wording guardrails:

  • ✅ "Safety information provided by the merchant" · "See product details for warnings and instructions" · "Responsible-person and labelling details shown where provided."
  • ❌ "Certified safe" · "Guaranteed compliant with [regulation]" · "Meets all safety standards" (as a blanket claim) · "Theme-verified safety."

Where to go next

What this page is — and is not

This explains how to display product-safety information and where the theme's role ends. It is not legal advice, it does not certify product safety, and it does not validate any product-specific obligation. The theme renders what you provide; the accuracy, completeness, and legality of that information — and any responsible-person or labelling duty — remain yours. Review your obligations with a professional where it matters.

Built for the Shopify Theme Store.