Install Eventual RSVP – Core, Registrations, and Tickets on EmDash.

Choose between Registry, sandboxed npm, or native npm installation depending on your host, then add the capacity field pack and required Astro visitor routes.

  • Available
  • EmDash ≥ 1.2.0 < 2.0.0 (1.4.0 recommended)
  • Cloudflare Workers Paid · Node 24+

Host runtime & plan

EmDash >=1.2.0 <2.0.0 (1.4.0 recommended). Sandboxed deployment on Cloudflare requires Workers Paid for the LOADER worker_loaders binding, re-exported PluginBridge, and EMDASH_SITE_URL.

Email plugin required

Configure an EmDash email provider plugin for confirmations, 2-hour waitlist offers, reminders, bank invoice emails, and ticket QR links.

Encryption key (cards only)

Only needed for pasted Stripe secret keys in Tickets. Core, Registrations, free tickets, invoices, Turnstile, and offline evt1.… keys work without it.

Three supported ways to install

Eventual RSVP – Core 0.18.0 is on the EmDash Registry (its npm package follows). Eventual RSVP – Registrations 0.1.0 is on the Registry and on npm. Eventual RSVP – Tickets is coming soon.

Open EmDash Admin → Plugins → Registry, inspect the declared capabilities, and install the plugin published by vermeulen.solutions. Note that standalone Astro UI components (.astro) are still imported from the corresponding npm package.

Eventual RSVP – Tickets joins the Registry and npm when it is released.

Recommended setup: runs each plugin in an isolated Worker sandbox bounded to explicit permissions and the 10-call host budget.

// astro.config.mjs
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import eventualAttendance from "@vermeulen.solutions/eventual-attendance";
// Eventual RSVP – Core: install it from the EmDash Registry (its npm package follows).
// Eventual RSVP – Tickets: coming soon.

export default defineConfig({
  integrations: [
    emdash({
      // database, storage, email provider…
      sandboxed: [eventualAttendance],
      sandboxRunner: "@emdash-cms/cloudflare/sandbox", // on Node: "@emdash-cms/sandbox-workerd/sandbox"
    }),
  ],
});

On Cloudflare Workers Paid, add the Worker Loader binding in wrangler.jsonc and re-export PluginBridge from your Worker entrypoint:

// wrangler.jsonc
{
  "worker_loaders": [{ "binding": "LOADER" }]
}

// src/worker.ts (your main Worker entry)
export { PluginBridge } from "@emdash-cms/cloudflare/worker";

If enabling Stripe card checkout in Tickets, create EMDASH_ENCRYPTION_KEY with npx emdash secrets generate and store it via wrangler secret put EMDASH_ENCRYPTION_KEY.

Use only on trusted self-hosted Node environments where you control all code: runs plugins directly in the site process without sandbox isolation.

// astro.config.mjs (Node hosts you trust only)
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import eventualAttendance from "@vermeulen.solutions/eventual-attendance";
// Eventual RSVP – Core: install it from the EmDash Registry (its npm package follows).
// Eventual RSVP – Tickets: coming soon.

export default defineConfig({
  integrations: [
    emdash({
      // database, storage, email provider…
      plugins: [eventualAttendance],
    }),
  ],
});

Capacity field pack and required Astro pages

Core owns events, venues, and organisers. Registrations and Tickets coordinate per-event ownership through three additive schema fields, then render on dedicated visitor and door-staff pages.

  1. Export collections & merge shared capacity fields

    Export Core’s native schema (from its public repository, nothing to install), merge the @vermeulen.solutions/eventual-capacity fields, review the JSON diff, and seed or migrate your collections:

    git clone --depth 1 https://github.com/Vermeulen-Solutions/eventual-emdash-sandbox eventual-core
    node eventual-core/scripts/export-native-schema.mjs --locale fr --output eventual-schema.json
    npx -p @vermeulen.solutions/eventual-capacity eventual-capacity-fields --merge eventual-schema.json --output eventual-schema-with-capacity.json

    Important handoff contract: recurring Core feed items have id "<contentId>#<recurrenceId>". Always pass eventId={event.id.split("#")[0]} and occurrenceStart={event.start}.

  2. Add event form & /rsvp/manage page (Eventual RSVP – Registrations)

    Place <RsvpForm /> on event pages and create the required self-service page at /rsvp/manage (matching Site setup in Registrations settings):

    // src/pages/rsvp/manage.astro
    import RsvpManage from "@vermeulen.solutions/eventual-attendance/astro/RsvpManage.astro";
    <RsvpManage locale="en" />
    
    // On an event detail page:
    import RsvpForm from "@vermeulen.solutions/eventual-attendance/astro/RsvpForm.astro";
    <RsvpForm eventId={contentId} occurrenceStart={event.start} locale="en" />
  3. Add /tickets/checkout, /tickets/order & /tickets/check (Eventual RSVP – Tickets)

    For Eventual RSVP – Tickets, add <TicketCheckout /> on event pages plus return, buyer order, and authenticated staff door-check routes:

    // Event page:
    import TicketCheckout from "@vermeulen.solutions/eventual-tickets/astro/TicketCheckout.astro";
    <TicketCheckout eventId={contentId} occurrenceStart={event.start} locale="en" />
    
    // /tickets/checkout -> <TicketCheckoutReturn backHref="/events" locale="en" />
    // /tickets/order    -> <TicketOrder checkinPath="/tickets/check" locale="en" />
    // /tickets/check    -> <TicketCheckin locale="en" /> (keep behind authenticated staff access)