Skip to main content
CROSHOPS

All insights

Shopify can't attach files to order emails. EU law needs them there. Here's the workaround

· 5 min read

EU law wants terms, withdrawal form and guarantee notice in every order email. Shopify can't attach files. The workaround, in 7 steps.

Every order confirmation to an EU consumer must include:

  1. Your contract terms, including your T&C (CRD Art. 8(7), 6(1)).
  2. Withdrawal information: conditions, the 14-day period, how to withdraw, and where your online withdrawal button is (Art. 6(1)(h)).
  3. The model withdrawal form (Art. 6(1)(h), Annex I(B)).
  4. The legal guarantee reminder, as the official EU notice, in colour, since 27 September 2026 (Art. 6(1)(l), 22a; Reg. 2025/1960).

It must arrive on a durable medium. Email counts; a link to your website does not (Art. 8(7), Recital 23; CJEU C-49/11 (opens in a new tab)). National law can also require the buyer's language (Art. 6(7)).

And your store must offer an online withdrawal function since 19 June 2026: "withdraw from contract here", "confirm withdrawal", and an email back with the date and time (Art. 11a).

CRD = Consumer Rights Directive 2011/83/EU (opens in a new tab). Items 1–3 can be skipped in the email only if you already sent them on a durable medium before checkout.

Not legal advice. Every document in the build below was signed off by the store's lawyer. Have yours check your wording and your countries.

The problem: Shopify won't attach your files

Can you attach a PDF to a Shopify order email? Not directly. The notification editor has no attachment option, and Shopify documents no way to attach a file you upload.

Skip it and the risk is real. If the buyer never properly got the withdrawal information, the 14-day window can run 12 more months, with no deduction for a handled product (Art. 10(1), 14(2)). In EU-wide enforcement, the maximum fine is at least 4% of turnover in the countries concerned (Art. 24(3)).

How we found the workaround

An EU store on Shopify Plus was ready to launch, except for its order email. It ended with a link to the policies page.

What we tried:

AttemptResult
Link to the policies page❌ Not a durable medium. The page can change after the sale
Send the documents in a second email❌ The buyer gets two order emails. Only on Shopify Plus can Shopify support switch off the default one
Build the legal pack as HTML in the template, pipe it through attach_as_pdf❌ Dropped. No error, no attachment
Put the content in a shop policy, pipe the policy through attach_as_pdf✅ Arrives as a PDF attachment

attach_as_pdf turns a shop policy into a PDF attachment. Shopify documents it for the terms of service and refund policy in the order confirmation (opens in a new tab), and its support team has described it as working for "policy object types" (Shopify Community (opens in a new tab)). So the whole legal pack has to live inside your policies.

What we learned with real test sends:

  • Every language needs its own lines. Each translated notification is a full copy of the template. A copy without the attach lines sends no PDF.
  • The PDF follows the email's language. An Italian email attaches the Italian policy.
  • Images render only from Shopify Files. A PNG uploaded to Files (cdn.shopify.com/s/files/...) shows in the PDF. Base64 images don't.
  • Page breaks work. A page-break div starts a new PDF page, so the form prints on its own.
  • "Send test" on the notification page sent no attachments. Sending from the template editor's preview did.

One design call. Our first version put the EU guarantee notice in the email body. It looked wrong next to the order summary, so it moved into the PDF.

1. Write two policies. In Settings → Policies:

  • Terms of service: your full terms.
  • Refund policy: returns, then withdrawal instructions (14 days, how to withdraw, where the online button is), the model withdrawal form, and the guarantee notice.

2. Upload the guarantee notice to Files. Get the official EU notice in each language you sell in. Don't edit it. Upload it under Content → Files, copy the cdn.shopify.com link, and add it to the refund policy as an image.

3. Give the form its own page. Before the form and before the notice, add:

<div style="page-break-before: always;"></div>

4. Attach both PDFs. In Settings → Notifications → Order confirmation, edit the code and paste near the footer:

{%- if shop.terms_of_service.body != blank -%}
  {{ shop.terms_of_service | attach_as_pdf: "Terms and Conditions" }}
{%- endif -%}
{%- if shop.refund_policy.body != blank -%}
  {{ shop.refund_policy | attach_as_pdf: "Returns and withdrawal" }}
{%- endif -%}

Add one line to the email: "Your terms, withdrawal form and guarantee information are attached."

5. Add the withdrawal button. Two routes:

  • Shopify's built-in route: self-serve returns and cancellations with customer accounts (Shopify's guide (opens in a new tab)). The buyer signs in first; ask your lawyer whether that's fine for your markets.
  • A custom form without sign-in (what we built): "Withdraw from contract here", then "Confirm withdrawal", then an automatic email with the date and time. Ours arrived in about 4 seconds in test sends.

6. Translate. Add the two attach lines to every language copy of the email, and translate both policies. Translating via the API? Edit the English template first, then update each translation.

7. Test per language. Send from the template editor's preview. Check both PDFs, the language, the form on its own page, and the notice in colour.

Where this applies

Any Shopify store selling goods to EU consumers, wherever it's based. Ask:

  1. Does the buyer get a copy, not a link?
  2. Is every language copy complete?
  3. Can a buyer withdraw online and get a timestamped email back?

Any no: start with steps 1 and 4.

Sources: CRD 2011/83/EU (opens in a new tab) · Directive (EU) 2023/2673 (opens in a new tab) · Directive (EU) 2024/825 (opens in a new tab) · Regulation (EU) 2025/1960 (opens in a new tab)