Ticket attachment email

Send a separate email after purchase with each customer's tickets attached as a PDF and Apple Wallet pass, since Shopify's order confirmation email can't carry attachments. Enable and customize it in the Event Ticketing app.

Jeff Blake
Written by Jeff Blake Updated May 28, 2026

Shopify’s order confirmation email can’t include attachments, so it doesn’t deliver tickets. The Event Ticketing app sends a separate email after purchase with each customer’s tickets attached as a PDF and/or Apple Wallet pass.

Requirements: Event Ticketing app installed · Advanced plan or higher.

Enable the email

  1. In the Event Ticketing app, go to Settings.

  2. Find Ticket attachment email and turn it on.

  3. Set when the email sends with the Fulfillment preference setting:

    • Default — follows your Shopify order processing setting.
    • Auto fulfill upon order creation — tickets send when the order is created.
    • Auto fulfill upon order paid — tickets send once the order is paid.

Customers now receive their tickets by email after purchase.

Customize the email

The form has three fields: Reply To, Subject, and Body. The body supports HTML and Liquid.

This email’s Liquid variables are not the same as Shopify’s. To list every variable available, add {{ order.tickets }} to the body, send yourself a test order, and read the dump in the received email.

Tickets are an array on order.tickets (an order can hold several tickets). There is no top-level ticket variable — ticket exists only inside a {% for ticket in order.tickets %} loop. To reference one ticket’s value outside a loop, index the array: {{ order.tickets[0].name }}.

Show different content per event

Branch on the event with a Liquid conditional. Match by name:

{% if ticket.event.name == 'My event name' %}
  Info about this event
{% else %}
  Info about a different event
{% endif %}

Or match by event ID:

{% assign event_ids = order.events | map: "id" | string %}
{% if event_ids contains " 1093287 " %}
  <p>Event-specific content here</p>
{% endif %}

Restore the default template

If you break the template, paste this back to reset it.

Subject

Your tickets for {{ order.events | map: 'name' | join: ', ' }} are attached!

Body

<p>Hello {{ first_name }},</p>
<p>Your tickets are attached to this email. Please bring them with you to the event.</p>

<ol>
{% for ticket in order.tickets %}
  <li>
  {% if ticket.name %}
    <strong>{{ ticket.name }}</strong>
  {% endif %}
  (# {{ ticket.barcode }} - {{ ticket.ticket_type.name }} )
  {% if ticket.valid %}
    {% if ticket.links.edit %}
      <a href="{{ ticket.links.edit }}">{{ ticket.labels.edit }}</a> |
    {% endif %}
    {% if ticket.links.transfer %}
      <a href="{{ ticket.links.transfer }}">{{ ticket.labels.transfer }}</a> |
    {% endif %}
    {% if ticket.links.pdf %}
      <a href="{{ ticket.links.pdf }}">{{ ticket.labels.download }}</a> |
    {% endif %}
    {% if ticket.links.wallet %}
      <a href="{{ ticket.links.wallet }}">
        Apple wallet
      </a>
    {% endif %}
  {% else %}
    {{ ticket.status }}
  {% endif %}
  </li>
{% endfor %}
</ol>

FAQ

How do I test the email without paying the per-order fee?

Create a $0 order with a 100%-off discount code, or resend an existing test order.

My Liquid variables show up blank — why?

This email’s variables differ from Shopify’s and from the Guest Manager backend email. Edit the template in Settings → Ticket attachment email, and reference tickets through order.tickets (there is no top-level ticket outside a loop).

How do I remove the Transfer button from the email?

Edit the ticket type and turn off the Transferable option. The transfer link disappears from that ticket type’s emails.

That link appears only when the ticket type has registration questions attached. Add registration questions to the ticket type to show it.

What can’t I customize?

The voided-ticket email, the transfer forwarding email, and the email button colors aren’t editable. The footer with your company name and address can’t be removed without switching to a full custom HTML template, and the store address may re-sync even after you remove it manually.

Layout looks broken in Outlook — how do I fix it?

Outlook has limited CSS support. If buttons overlap or the layout breaks there, replace the default template with your own full custom HTML.