REST API

Campaigns

Email sends to your guests, including the automatic reminders and thank-yous attached to events.

A campaign is one email send to a group of guests. The Guest Manager app calls these messages; the API calls them campaigns. Campaigns you write yourself and the automatic emails on an event (a reminder before it starts, a thank-you after it ends) are both campaigns. Each automatic email on an event, or on each session of a recurring event, has one campaign behind it.

This endpoint lists campaigns and renames them or changes their email template. Campaigns are created and sent in the Guest Manager dashboard.

The collection is not filtered for you

GET /campaigns returns every campaign for your company, including automatic emails and archived campaigns. Use filter[automated]=false to list only the campaigns you wrote, and filter[archived_at]=unarchived to leave out archived ones.

A recurring event’s reminder produces one campaign for each session. Filtering by event_id on the recurring event returns the campaigns for its sessions as well.

Default response fields

id, type, name, status, email_template_id, scheduled_at, created_at, archived_at.

status is draft, delivering or delivered. scheduled_at is null for a campaign with no send time. type is currently null on every campaign.

The events, stats and event_campaign fields are returned only when listed in ?include=.

List campaigns

GET /campaigns

List campaigns with their events, stats and automatic email

curl -X GET \
  'https://app.guestmanager.com/api/public/v2/campaigns?page[cursor]=&include=events,stats,event_campaign' \
  -H 'Authorization: Token abcdefg' \
  -H 'Content-Type: application/json'

Without a sort parameter, campaigns are returned newest first.

Request parameters

Parameter Type Description
page[cursor] string Opaque cursor token. Send empty for the first page. See Pagination.
page[size] integer Records per page. Default 10, maximum 100.
sort[{field}] string Sort by id, created_at, updated_at, scheduled_at. Value is asc or desc.
include string One comma separated string: events, stats, event_campaign. An array or hash form such as include[]=events returns a 400. See Includes.
filter[search] string Campaigns whose name contains this text.
filter[status] string Comma separated: draft, delivering, delivered. Any other value returns a 400.
filter[scheduled] boolean true returns campaigns with a send time, false returns campaigns without one.
filter[scheduled_at][from] date Campaigns with a send time at or after this date.
filter[scheduled_at][to] date Campaigns with a send time at or before this date. A to with no time includes that whole day.
filter[event_id] integer Campaigns that target this event or one of its sessions, including deleted ones. A value that is not a number returns an empty list.
filter[automated] boolean true returns only the automatic reminders and thank-yous, false excludes them.
filter[archived_at] string archived returns only archived campaigns, unarchived excludes them.

The filter[id] and filter[created_at] filters described in Filtering & sorting also apply. For filter[scheduled_at] and filter[created_at], a from or to date that can’t be parsed is ignored rather than rejected. The other bound still applies, so the filter is dropped only when neither date can be parsed.

A filter[status] value that is not listed, or a filter[scheduled] or filter[automated] value that is not true or false, returns a 400 that names the parameter.

Includes

Include Adds
events events: the events the campaign targets, each with id, name, parent_id and start. start has the same shape as Events. It is null for an event with no start. The list also includes targeted events that have since been deleted.
stats stats: recipients, the number of emails the campaign has, excluding test emails and including any not yet delivered, and open_rate, the percentage of delivered emails that were opened, as a whole number.
event_campaign event_campaign: id, type and event_id for an automatic email, where type is reminder or thank_you. null for a campaign that is not an automatic email.

Response for include=events,stats,event_campaign

{
  "data": [
    {
      "id": 980190964,
      "type": null,
      "name": "Reminder - Thank you",
      "status": "draft",
      "email_template_id": 980190962,
      "scheduled_at": "2026-11-10T09:58:00.000000Z",
      "created_at": "2026-11-10T11:58:58.558755Z",
      "archived_at": null,
      "stats": {
        "recipients": 0,
        "open_rate": 0
      },
      "events": [
        {
          "id": 980190962,
          "name": "Test event",
          "parent_id": null,
          "start": {
            "tz": "Pacific Time (US & Canada)",
            "iana": "America/Los_Angeles",
            "formatted": {
              "date": "11-10-2026",
              "time": " 4:58 AM"
            },
            "local": "2026-11-10T04:58:00-08:00",
            "utc": "2026-11-10T12:58:00Z"
          }
        }
      ],
      "event_campaign": {
        "id": 980190963,
        "event_id": 980190962,
        "type": "reminder"
      }
    },
    {
      "id": 980190963,
      "type": null,
      "name": "Doors open update",
      "status": "delivered",
      "email_template_id": 980190962,
      "scheduled_at": "2026-11-12T15:00:00.000000Z",
      "created_at": "2026-11-10T11:58:58.545579Z",
      "archived_at": null,
      "stats": {
        "recipients": 0,
        "open_rate": 0
      },
      "events": [
        {
          "id": 286602186,
          "name": "Conference",
          "parent_id": null,
          "start": null
        }
      ],
      "event_campaign": null
    }
  ],
  "meta": {
    "count": 2,
    "page": {
      "size": 10,
      "next_cursor": null,
      "last": true,
      "first": true
    },
    "links": {
      "self": "https://app.guestmanager.com/api/public/v2/campaigns?page[cursor]=&include=events,stats,event_campaign",
      "next": null
    }
  }
}

Plans without Messages

Stores using the Event Ticketing app can list campaigns only on a plan that includes Messages. On any other plan, GET /campaigns returns 403:

{
  "error": "forbidden",
  "feature": "messages"
}

Other accounts are not affected.

Update campaign

PATCH /campaigns/{id}

Renames a campaign or changes the email template it sends. Both fields are optional. The email template must be one of your company’s. Any other email_template_id returns a 400 that names the parameter.

curl -X PATCH \
  https://app.guestmanager.com/api/public/v2/campaigns/980190963 \
  -H 'Authorization: Token abcdefg' \
  -H 'Content-Type: application/json' \
  -d '{
    "campaign": {
      "name": "Doors open update",
      "email_template_id": 980190962
    }
  }'
Parameter Type Description
campaign[name] string The campaign’s name.
campaign[email_template_id] integer The email template the campaign sends.

The response is the updated campaign with the default fields. Updating a campaign is not limited by plan.