Setting Up an RSVP Pre-Event Alert for Free Events

The RSVP feature lets your customers confirm or decline attendance for an event with a single click, directly from their pre-event alert email. When someone says they can't make it, your box office gets an email straight away. Every response is logged on the customer's order, so your team always knows who's planning to turn up.

RSVP is designed for free and comp events, where the customer has nothing financial at stake and no-shows can be a real problem. You have full control over which events carry the RSVP buttons, so they only appear where you want them.

In this article, we'll walk you through how RSVP works, how to set it up for the events you want it on, and how to handle the most common questions that come up.

How RSVP works

What your customer sees

In the pre-event alert email they receive before the event, two buttons appear under a friendly reminder:

  • I'll Be There (green)
  • I Can't Make It (red)
rsvp email 2.png

When they click I'll Be There, a confirmation page opens in their browser asking them to confirm their attendance, and then once confirmed, thanking them.

confirmed.png

If they click I Can't Make It, they see a 'Can't Make It?' page that asks them to confirm their decline. This second click is what records the response. Once confirmed, they'll see a page thanking them.

declined.png

The two-step flow is deliberate. It stops email apps that "preview" links from accidentally registering an RSVP on the customer's behalf.

 Already responded

Once a customer responds for an event, they can't change their answer through the link. If they click again, they'll see an "Already Responded" page. If they genuinely change their mind, they'll need to contact your box office directly.

What your team sees

Every RSVP response is recorded on the customer's order in two ways: an automated order comment, and (if you've set it up) a decline notification email to your box office.

The order comment

In the order's Comments tab you'll see entries like:

  • [AUTOMATED] Customer declined attendance via RSVP for 13 May 2026 - 16:00 @ My Venue Attenborough Gallery Opening (Event #428838932)
  • [AUTOMATED] Customer confirmed attendance via RSVP for 13 May 2026 - 16:00 @ My Venue Attenborough Gallery Opening (Event #428838932)

This gives you a permanent, searchable record of who responded and when.

order comments.png

The decline notification email

If a customer declines and you've configured a notification email address, your box office receives an email with the customer's name, email, order number, event name, and event date. You can immediately see who won't be coming and act on it (offer the seat to a waiting list, follow up, and so on).

Notes

No email is sent when a customer confirms, only when they decline. The order comment is always recorded.

How RSVP handles multi-event orders

If a customer has tickets for several events on one order, they'll get a separate RSVP request for each event covered by the automation. Each event is treated independently, so they can confirm one and decline another.

How to set up the RSVP pre-event alert

The setup has two parts that work together. First, you'll add a notification email address so your box office hears about declines. Second, you'll set up a dedicated, tag-filtered Pre-Event Alert automation that includes the RSVP buttons, and tag the events you want it to apply to.

The second part is the most important. Please read it carefully. Getting the automation set up correctly is what stops RSVP buttons appearing on events you didn't intend.

What you'll need before you start

  • Admin access to edit settings and automations in Ticketsolve.
  • An email address for decline notifications. A shared box office inbox works well.
  • A clear list of events that should carry the RSVP buttons (typically free or comp events). The cleanest way to manage this is with a single, consistent event tag, e.g. 'rsvp' or 'comp'.

Configure the decline notification email

This tells Ticketsolve where to send the alert when a customer declines.

  1. Go to General Settings and set the RSVP notification email to the address you'd like to use, e.g. boxoffice@yourvenue.com.
  2. Once it's set, declines will arrive at that address from messages-noreply@ticketsolve.com. Add this address to your safe senders list so notifications don't end up in spam.
email setting.png

 Important

If you leave this blank, no email is sent on decline. Declines are still recorded as order comments, so the response isn't lost, but nobody on your team will be alerted in real time. We'd recommend setting it so nothing slips through.

Tag the events that should carry RSVP

This is how you control exactly which events get RSVP buttons.

  1. Go to Manage > Shows and open the show or event that should use RSVP. Tags can be applied at show or event level.
  2. Add a consistent tag, for example 'rsvp' or 'comp-event'. Pick one tag and stick with it.
  3. Save.

Any event without this tag won't be covered by the RSVP automation you'll set up next.

Set up the dedicated RSVP Pre-Event Alert automation

This is the critical step. Rather than adding the RSVP buttons to your existing pre-event alert template, you'll create a separate automation that's filtered to only your tagged events.

Why a dedicated automation?

The RSVP buttons are powered by two merge fields ({{ order.rsvp_confirm_url }} and {{ order.rsvp_decline_url }}) that pull the unique RSVP links into the email from the system. These produce working RSVP links for every order, regardless of price or event type. There's no inline switch you can flip on a per-event basis. So the cleanest way to make sure RSVP only appears where you want it is to put it in its own automation, and limit that automation by tag.

For the full setup steps, see Send a Custom Pre-Event Alert based on Show or Event Tag

Below, you can choose from two starter MJML templates to use as your custom pre-event alert MJML template. Both templates are the same in content, except the "With a refund message" template includes the line:

"Please note: Selecting 'I Can't Make It' will automatically cancel and refund your order, making your tickets invalid for entry."

So customers know that when they select 'I Can't Make It', they are forfeiting their tickets. 

Without a refund message

<mjml>

  <mj-head>

    {{ head_content }}

  </mj-head>

  <mj-body mj-class="body">

    {{ header }}

    <mj-section mj-class="content-section" padding-bottom="0">

     <mj-column>

       <mj-text mj-class="container-text">

         Dear {{ customer.first_name }},

       </mj-text>

       <mj-text mj-class="container-text">

         We can’t wait for your visit! Your event is just around the corner, and we’re thrilled to have you join us.

       </mj-text>

     </mj-column>

    </mj-section>

 

    <mj-section mj-class="content-section">

      <mj-column>

        <mj-text mj-class="container-text">

          Just a reminder that <strong>{{ event.show_name }}</strong> on {{ event.day }} at {{ event.venue_name }} is coming up soon!

        </mj-text>

        <mj-text mj-class="container-text">

          Please let us know if you can make it:

        </mj-text>

      </mj-column>

    </mj-section>

    <mj-section mj-class="content-section">

      <mj-column>

        <mj-button

                   href="{{ order.rsvp_confirm_url }}"

                   background-color="#1ea64a"

                   color="#ffffff"

                   border-radius="6px"

                   font-weight="bold"

                   inner-padding="12px 20px">

          I'll Be There

        </mj-button>

      </mj-column>

      <mj-column>

        <mj-button

                   href="{{ order.rsvp_decline_url }}"

                   background-color="#d6336c"

                   color="#ffffff"

                   border-radius="6px"

                   font-weight="bold"

                   inner-padding="12px 20px">

          I Can't Make It

        </mj-button>

      </mj-column>

    </mj-section>

    

    <mj-section mj-class="content-section" padding-top="10px" padding-bottom="10px">

      <mj-column>

        <mj-text mj-class="container-text">

          <p>Order #{{ order.id }}</p>

        </mj-text>

      </mj-column>

    </mj-section>

    

    <mj-section mj-class="content-section" padding-bottom="0" padding-top="5px">

      <mj-column>

        <mj-text mj-class="container-text">

          Here are the event details:

        </mj-text>

      </mj-column>

    </mj-section>

 

    <mj-wrapper padding="0 20px 20px" mj-class="sub-container-wrapper">

      <mj-section mj-class="sub-container">

        <mj-column>

          <mj-social padding="0" align="left">

            <mj-social-element src="{{ 'icons/mail/grey_ticket.png' | image_url: icon_host }}" icon-size="16px">

              <b>Show name:</b> {{ event.show_name }}

            </mj-social-element>

          </mj-social>

 

          <mj-social padding="0" align="left">

            <mj-social-element src="{{ 'icons/mail/grey_venue.png' | image_url: icon_host }}" icon-size="16px">

              <b>Venue:</b> {{ event.venue_name }}

            </mj-social-element>

          </mj-social>

 

          <mj-social padding="0" align="left">

            <mj-social-element src="{{ 'icons/mail/grey_calendar.png' | image_url: icon_host }}" icon-size="16px">

              <b>Showing date:</b> {{ event.day }}

            </mj-social-element>

          </mj-social>

 

          {% if event.opening_time %}

            <mj-social padding="0" align="left">

              <mj-social-element src="{{ 'icons/mail/grey_time.png' | image_url: icon_host }}" icon-size="16px">

                <b>Opening time:</b> {{ event.opening_time }}

              </mj-social-element>

            </mj-social>

          {% endif %}

 

          <mj-social padding="0" align="left">

            <mj-social-element src="{{ 'icons/mail/grey_time-start.png' | image_url: icon_host }}" icon-size="16px">

                <b>Start time:</b> {{ event.time_of_day }}

            </mj-social-element>

          </mj-social>

        </mj-column>

      </mj-section>

    </mj-wrapper>

    

    {% if event.upcoming_event_customer_alert_snippet.size > 0 %}

    <mj-section mj-class="content-section">

      <mj-column>

          <mj-text mj-class="container-text">

            <pre class="ts_note">{{ event.upcoming_event_customer_alert_snippet }}</pre>

          </mj-text>

        </mj-column>

    </mj-section>

    {% endif %}

 

    {{ event_hub }}

 

    {{ streaming_products }}

    {{ streaming_events }}

 

    {% unless order.show_print_order_link %}

      {{ ticket_email_notes }}

    {% endunless %}

    {{ event_email_notes }}

    {% if order.show_print_order_link %}

      <mj-section mj-class="content-section" padding-bottom="0">

        <mj-column>

          <mj-text mj-class="container-text">

            Please find below your ticket(s):

          </mj-text>

        </mj-column>

      </mj-section>

 

      {{ checkin_qr_code_list_html }}

      {{ print_order_link }}

    {% endif %}

 

    <mj-section mj-class="content-section" padding-bottom="10px" padding-top="0">

      <mj-column>

        <mj-text mj-class="container-text">

           If you have any queries or require assistance, please contact us. We wish you an enjoyable visit.

        </mj-text>

        <mj-text mj-class="container-text">

          Warm regards,

        </mj-text>

        <mj-text mj-class="container-text">

          {{ account.name }}

        </mj-text>

      </mj-column>

    </mj-section>

    {{ social }}

    {{ footer }}

 </mj-body>

</mjml>

With a refund message

<mjml>

  <mj-head>

    {{ head_content }}

  </mj-head>

  <mj-body mj-class="body">

    {{ header }}

    <mj-section mj-class="content-section" padding-bottom="0">

     <mj-column>

       <mj-text mj-class="container-text">

         Dear {{ customer.first_name }},

       </mj-text>

       <mj-text mj-class="container-text">

         We can’t wait for your visit! Your event is just around the corner, and we’re thrilled to have you join us.

       </mj-text>

     </mj-column>

    </mj-section>

 

    <mj-section mj-class="content-section">

      <mj-column>

        <mj-text mj-class="container-text">

          Just a reminder that <strong>{{ event.show_name }}</strong> on {{ event.day }} at {{ event.venue_name }} is coming up soon!

        </mj-text>

        <mj-text mj-class="container-text">

          Please let us know if you can make it:

        </mj-text>

      </mj-column>

    </mj-section>

    <mj-section mj-class="content-section">

      <mj-column>

        <mj-button

                   href="{{ order.rsvp_confirm_url }}"

                   background-color="#1ea64a"

                   color="#ffffff"

                   border-radius="6px"

                   font-weight="bold"

                   inner-padding="12px 20px">

          I'll Be There

        </mj-button>

      </mj-column>

      <mj-column>

        <mj-button

                   href="{{ order.rsvp_decline_url }}"

                   background-color="#d6336c"

                   color="#ffffff"

                   border-radius="6px"

                   font-weight="bold"

                   inner-padding="12px 20px">

          I Can't Make It

        </mj-button>

      </mj-column>

    </mj-section>

    

    <mj-section mj-class="content-section">

    <mj-column>

      <mj-text mj-class="container-text">

          <strong>Please note:</strong> Selecting 'I Can't Make It' will automatically cancel and refund your order, making your tickets invalid for entry.

        </mj-text>

      </mj-column>

    </mj-section>

    

    <mj-section mj-class="content-section" padding-top="10px" padding-bottom="10px">

      <mj-column>

        <mj-text mj-class="container-text">

          <p>Order #{{ order.id }}</p>

        </mj-text>

      </mj-column>

    </mj-section>

    

    <mj-section mj-class="content-section" padding-bottom="0" padding-top="5px">

      <mj-column>

        <mj-text mj-class="container-text">

          Here are the event details:

        </mj-text>

      </mj-column>

    </mj-section>

 

    <mj-wrapper padding="0 20px 20px" mj-class="sub-container-wrapper">

      <mj-section mj-class="sub-container">

        <mj-column>

          <mj-social padding="0" align="left">

            <mj-social-element src="{{ 'icons/mail/grey_ticket.png' | image_url: icon_host }}" icon-size="16px">

              <b>Show name:</b> {{ event.show_name }}

            </mj-social-element>

          </mj-social>

 

          <mj-social padding="0" align="left">

            <mj-social-element src="{{ 'icons/mail/grey_venue.png' | image_url: icon_host }}" icon-size="16px">

              <b>Venue:</b> {{ event.venue_name }}

            </mj-social-element>

          </mj-social>

 

          <mj-social padding="0" align="left">

            <mj-social-element src="{{ 'icons/mail/grey_calendar.png' | image_url: icon_host }}" icon-size="16px">

              <b>Showing date:</b> {{ event.day }}

            </mj-social-element>

          </mj-social>

 

          {% if event.opening_time %}

            <mj-social padding="0" align="left">

              <mj-social-element src="{{ 'icons/mail/grey_time.png' | image_url: icon_host }}" icon-size="16px">

                <b>Opening time:</b> {{ event.opening_time }}

              </mj-social-element>

            </mj-social>

          {% endif %}

 

          <mj-social padding="0" align="left">

            <mj-social-element src="{{ 'icons/mail/grey_time-start.png' | image_url: icon_host }}" icon-size="16px">

                <b>Start time:</b> {{ event.time_of_day }}

            </mj-social-element>

          </mj-social>

        </mj-column>

      </mj-section>

    </mj-wrapper>

    

    {% if event.upcoming_event_customer_alert_snippet.size > 0 %}

    <mj-section mj-class="content-section">

      <mj-column>

          <mj-text mj-class="container-text">

            <pre class="ts_note">{{ event.upcoming_event_customer_alert_snippet }}</pre>

          </mj-text>

        </mj-column>

    </mj-section>

    {% endif %}

 

    {{ event_hub }}

 

    {{ streaming_products }}

    {{ streaming_events }}

 

    {% unless order.show_print_order_link %}

      {{ ticket_email_notes }}

    {% endunless %}

    {{ event_email_notes }}

    {% if order.show_print_order_link %}

      <mj-section mj-class="content-section" padding-bottom="0">

        <mj-column>

          <mj-text mj-class="container-text">

            Please find below your ticket(s):

          </mj-text>

        </mj-column>

      </mj-section>

 

      {{ checkin_qr_code_list_html }}

      {{ print_order_link }}

    {% endif %}

 

    <mj-section mj-class="content-section" padding-bottom="10px" padding-top="0">

      <mj-column>

        <mj-text mj-class="container-text">

           If you have any queries or require assistance, please contact us. We wish you an enjoyable visit.

        </mj-text>

        <mj-text mj-class="container-text">

          Warm regards,

        </mj-text>

        <mj-text mj-class="container-text">

          {{ account.name }}

        </mj-text>

      </mj-column>

    </mj-section>

    {{ social }}

    {{ footer }}

 </mj-body>

</mjml>

 

 Important

Don't add the RSVP merge fields to your other existing Pre-Event Alert templates. If any other automation's template references {{ order.rsvp_confirm_url }} or {{ order.rsvp_decline_url }}, the events that automation covers will produce working RSVP buttons too, even without the tag.

Also note that a single event can be covered by more than one pre-event alert. By default, a tagged event will receive both your standard pre-event alert and your dedicated RSVP one. If you want customers to receive only the RSVP alert, untick the Upcoming Event Customer Alert Enabled setting at Show or Event level. That suppresses the standard pre-event alert, leaving only the RSVP one to send.

If you want to tell customers that declining will release their ticket to someone else, add that wording directly into your MJML email template. Ticketsolve doesn't automatically release the ticket on decline. The decline notification email is the prompt for your box office to action it manually (release the seat, offer it to a waiting list, and so on). Setting expectations clearly in the email helps customers understand why their response matters.

Test the RSVP flow end-to-end

  1. Create a test order on a tagged event using a personal email address.
  2. Trigger or wait for the pre-event alert to send.
  3. Check that the RSVP buttons appear in the email.
  4. Click I'll Be There and follow through to the Thank You page.
  5. Open the test order and confirm the automated comment was added.
  6. Repeat the test using I Can't Make It and confirm two things:
    • The decline comment appears on the order.
    • Your box office inbox receives the decline notification email.

If both flows work end-to-end, you're live.

How to find RSVP responses for an event

There isn't a dedicated RSVP report yet. To find all responses for a given event:

  1. Use order search or your admin's comment search.
  2. Search order comments for the phrase 'via RSVP for', plus the event name or event ID.

You'll see every confirm and decline for that event, with the customer's order attached.

Frequently asked questions

A customer says they clicked the RSVP link but nothing happened. What do I do?

Open their order and check the Comments tab. If you see an RSVP comment for the event in question, the response was recorded successfully. They probably missed the confirmation page. Reassure them that they're all set.

If there's no comment, ask them to try again from the original email. The link may have expired (if the order was deleted or amended), or the email may have been forwarded in a way that broke the URL.

A customer wants to change their RSVP from 'Going' to 'Not going' (or the other way round). Can they?

Once a response is submitted, the link won't accept a second one. The customer will see an "Already Responded" page. To handle the change of mind manually, add an order comment noting the change and let your box office know directly so they can adjust expectations.

Box office didn't receive a decline notification. What's wrong?

Work through these checks in order:

  1. Is the notification email configured? Go to General Settings and check the RSVP notification email field. If it's blank, no email is sent (the order comment will still be there).
  2. Was the decline actually recorded? Look for a "Customer declined attendance via RSVP" comment on the order. If it's there, the decline was processed.
  3. Check spam and junk folders. Notifications come from messages-noreply@ticketsolve.com.
  4. If everything looks right but the email genuinely never arrived, contact our Support team and we'll check delivery logs.
A customer's RSVP link shows 'Link Expired'. Why?

This usually means the order has been deleted or amended, or the link has been broken by being forwarded through several email clients. Pre-event alerts can't be re-sent manually; they're sent once by the automation. If the customer still wants to RSVP, ask them to contact your box office directly so you can record the response on their order.

RSVP buttons appeared on an event we didn't intend. How do I fix it?

This always comes down to one of two things: an event accidentally carrying the RSVP tag, or another pre-event alert template that also references the RSVP merge fields. Work through these checks:

  1. Identify which automation sent the email. On the affected customer's order, open the Customer Comments tab to see a record of which automated emails they've received and from which automation. If you can't tell from there, get in touch with our Support team and we'll look up the email in our delivery logs (you don't have access to those directly).
  2. Check which shows and events carry the RSVP tag. Look through the shows and events tagged with the tag your RSVP pre-event alert is referencing (e.g. 'rsvp' or 'comp-event'). Untag anything that shouldn't be receiving RSVP emails.
  3. Check your other pre-event alerts for the RSVP merge fields. If you have multiple custom pre-event alerts set up, make sure only the dedicated RSVP one contains {{ order.rsvp_confirm_url }} and {{ order.rsvp_decline_url }}. Any other automation referencing these will produce working RSVP buttons on every event it covers.

There isn't an in-template way to hide the buttons for some events and show them for others. Tag-based filtering at the automation level, plus keeping the merge fields in only one template, is the supported approach.

The pre-event email arrived but had no RSVP buttons. Why?

The email the customer received was probably your standard pre-event alert, not the dedicated RSVP one. A single event can receive multiple pre-event alerts (e.g. your standard one and a custom RSVP one), so the customer may receive both, or may receive only the standard one if the RSVP automation isn't matching the event correctly. Check:

  • The event has the correct RSVP tag.
  • Your dedicated RSVP automation is active and its tag filter matches.
  • The RSVP automation's template actually contains the RSVP merge fields ({{ order.rsvp_confirm_url }} and {{ order.rsvp_decline_url }}).

If you want only the RSVP pre-event alert to send for tagged events (and not your standard pre-event alert as well), untick the Upcoming Event Customer Alert Enabled setting at Show or Event level.

If everything looks right and the RSVP buttons still aren't appearing, get in touch and we'll help you trace which automation fired.

Our customers are getting both the standard pre-event alert and the RSVP one. How do we send only the RSVP one for tagged events?

A single event can be covered by more than one pre-event alert, so by default a tagged event will receive both your standard pre-event alert and your dedicated RSVP one. To send only the RSVP one, untick the Upcoming Event Customer Alert Enabled setting at Show or Event level. That stops the standard pre-event alert sending, leaving only the RSVP one.

Can we use RSVP on paid events?

Technically yes, the buttons will work on any order. In practice, RSVP is designed for free and comp events. There's no refund workflow tied to a decline, so if a paying customer clicks I Can't Make It, your box office is alerted but you'll still need to handle any refund or exchange through your normal process. For paid events, customers are more likely to contact you directly anyway, so the RSVP flow tends not to add much.

Want to know more?

Was this article helpful?

Comments

0 comments

Please sign in to leave a comment.