Getting Started

Overview

Cornerstone Events is a self-contained event calendar and registration system built for non-profit organizations, churches, schools, and associations. It requires no other plugins — no WooCommerce, no third-party calendar — and handles the full lifecycle of an event: creation, registration, payment, attendee management, and post-event follow-up.

Core Capabilities

  • Custom event post type with month, list, and agenda calendar views
  • Free RSVP and paid ticketed registration
  • Stripe payment processing (Payment Intents API)
  • Donation collection — event-attached or standalone
  • Tribute/honor system (In Honor Of / In Memory Of)
  • Invitation system with personalized codes and custom pricing
  • Attendee guest information collection
  • Coupon/discount code system
  • Recurring events (daily, weekly, biweekly, monthly)
  • Automated reminder emails via WP-Cron
  • Waitlist management
  • CSV export (registrations, guests, tributes, financial summary)
  • Import from The Events Calendar (XML)
  • Full email log with resend
Getting Started

Requirements & Installation

Minimum Requirements

  • WordPress 6.0 or higher
  • PHP 7.4 or higher

Installation

  1. Upload the cornerstone-events folder to /wp-content/plugins/.
  2. Activate through Plugins in WordPress admin.
  3. On activation, all database tables are created automatically and default settings are saved.
  4. You are redirected to the dashboard. Navigate to Events Manager > Settings to configure Stripe, email templates, and display preferences.

What Happens on Activation

  • Creates all custom database tables
  • Sets default options for currency, date/time format, email templates, and display preferences
  • Schedules the daily WP-Cron job for reminder emails (idem_daily_reminder_check)
  • Sets a registration ID auto-increment start point (configurable in Settings)
Getting Started

Admin Menu Structure

The plugin registers a top-level Events Manager menu with the following pages:

Menu ItemDescription
DashboardSummary cards: total registrations, revenue, pending follow-ups, pending tributes. Recent registrations table.
EventsStandard WordPress post list for id_event post type. Includes Duplicate row action.
VenuesReusable id_venue CPT — name, address, phone, website, featured image. Listed directly under Events.
RegistrationsPaginated list of all registrations with filters, search, status badges, and quick actions.
AttendeesList of individual guests with table number, dietary, accessibility, and notes. Sortable, filterable, exportable.
TributesList of honor/tribute records with status, send controls, and bulk actions.
InvitationsList of invitation codes with status, usage, and send controls.
CouponsList of discount codes with toggle, usage count, and CRUD.
Email LogLog of all outgoing emails with type, recipient, status, and resend option.
Check-InLive door-operations screen — QR camera scanner, searchable roster, mark/unmark, walk-in add, multi-device sync.
BroadcastSend filtered bulk email to an event's registrants (by ticket type, status, check-in state). Preview + test send.
ReportsTen tabs: Revenue Breakdown, Event P&L, Trend, Transaction Ledger, Refund Log, Coupon Usage, Constituents, Top Patrons, Repeat Attendees, Year-End Statements.
SettingsTabbed settings page (General, Payment, Email Templates, Registration, Display, Import, Export). General tab now includes Organization Info + Scheduled Summary Email.
Every admin page uses the Cornerstone branded header with the navy-to-gold palette. Meta boxes on the event edit screen have a branded gradient title bar and are organized into tabs (Schedule / Venue / Display / Lifecycle for Event Details; Basics / Data Collection / Payment / Advanced for Registration Settings).
Events

Creating & Managing Events

Events are a custom post type (id_event) with the URL slug /event/. They support title, content (description), excerpt, featured image, categories (idem_event_category), and tags (idem_event_tag).

Event Details Meta Box

FieldDescription
Start Date / Start TimeEvent start datetime
End Date / End TimeEvent end datetime
Venue NameName of the venue
Venue AddressStreet address (textarea)
Show map on event pageEnables a map embed on the public event page
Hide street addressHides the address from the public event page
Hide "Add to Calendar" linksRemoves Google, Outlook, and iCal links from the event page
Hide remaining capacity countHides the seat counter from the public event page
Hide "Includes X seats" messageHides the seat count note on multi-seat ticket types
Online Event LinkURL for streaming or virtual meetings. Used by the {online_link} merge tag. Option to show the link publicly when the event is live.
Event StatusUpcoming / In Progress / Past / Cancelled
Custom fields hook: idem_event_settings_fields fires inside the Event Details meta box and allows additional fields to be injected by themes or plugins.

Duplicating Events

Each event in the admin list has a Duplicate row action. This creates a draft copy of the event including all meta fields and ticket types. The duplicate gets "(Copy)" appended to the title and the status is set to Draft.

Events

Registration Types

Set per-event under the Registration Settings meta box.

TypeDescription
DisabledNo registration form is shown.
Free RSVPRegistrants select a quantity. No payment collected. Supports donations.
Paid TicketsRegistrants select from defined ticket types. Payment via Stripe.

Registration Settings Fields

FieldDescription
Registration TypeDisabled / Free RSVP / Paid Tickets
CapacityMaximum seats. 0 = unlimited.
Enable waitlist when fullWhen capacity is reached, new registrations are placed on the waitlist.
Collect phone numberAdds a phone field to the registration form.
Collect mailing addressAdds Street, City, State, ZIP fields to the form.
Collect dietary restrictionsAdds a dietary restrictions field.
Collect accessibility needsAdds an accessibility needs field.
Allow registrants to cover processing feesShows a "cover fees" checkbox on paid events.
Cover fees by defaultPre-checks the cover fees option.
RSVP ModeEnables a Yes / No response selector. Ticket types can be filtered by RSVP group (Yes / No / Both).
Custom NoteOptional note shown on the registration form, with 5 position options.
Invitations RequiredWhen enabled, only registrants with a valid invitation code can register.
Show Invitation Code InputControls whether the invitation code input is shown on the form (vs. URL-only).
Events

Ticket Types

Ticket types are stored in the idem_ticket_types database table (not post meta). Each event can have multiple ticket types.

FieldDescription
NameDisplay name of the ticket type
PriceBase price (0 = free)
Seat MultiplierHow many seats one ticket counts as (e.g., a "Table of 10" ticket = 10 seats)
DescriptionOptional description shown on the registration form
RSVP GroupWhich RSVP response this ticket applies to: Yes / No / Both
Auto-send guest formAutomatically sends the attendee follow-up email when this ticket type is purchased
Flexible PricingEnables "pay what you can" with optional min, max, and suggested price amounts
Sort OrderControls display order on the form
Ticket types are drag-and-drop sortable in the admin. A single registration can include multiple ticket types at different quantities — each becomes a line item in the idem_registration_items table.
Fair Market Value is a fourth field that appears on ticket types when the event Revenue Type is set to Mixed. See Revenue Type & FMV.
Events

Venues

Venues are stored as their own CPT (id_venue) so the same location can be reused across multiple events. The admin menu entry sits directly under Events.

Fields per venue

FieldStorage
Namepost_title
Street Address_idem_venue_address_1
City / State / ZIP_idem_venue_city · _idem_venue_state · _idem_venue_zip
Phone_idem_venue_phone
Website_idem_venue_website
Descriptionpost_content
Featured imagestandard WordPress thumbnail

Picking a venue on an event

The event edit screen's Venue tab has a dropdown of published venues, a + New venue button that opens a quick-add modal (no page reload), and an Enter manually instead link that reveals legacy free-text fields for one-off events.

TEC import

When you import events exported from The Events Calendar, the included tribe_venue records are converted into id_venue posts and each event is linked via _idem_venue_id. Duplicate-title venues reuse the existing post rather than creating a twin.

Migrating legacy events

On DB upgrade to 1.10.0, existing events with free-text _idem_venue_name / _idem_venue_address meta are scanned, de-duped by name, and linked to new venue posts automatically. The legacy text meta is preserved as a fallback.

Export

Settings → Export supports a dedicated Venues CSV (one row per venue with every field plus a linked-event count).

Events

Capacity & Waitlist

Capacity is tracked per-event. Seat count is the sum of all confirmed and pending registrations, weighted by each ticket type's seat multiplier.

  • Unlimited capacity: Set capacity to 0.
  • Waitlist: When enabled and the event is full, new registrations receive waitlisted status. When a seat is released (cancellation or refund), waitlisted registrants are automatically notified by email in FIFO order. Admins can manually promote a waitlisted registration to confirmed from the registrations admin page.

The [id_event_capacity] shortcode displays the current remaining seat count on any page.

Events

Recurring Events

Recurring events are generated as individual child post entries from a parent event. Each occurrence is an independent id_event post with its own registrations, capacity, and status.

FieldDescription
Recurrence PatternNone / Daily / Weekly / Biweekly / Monthly
End DateStop generating occurrences after this date
Occurrence CountAlternative to end date — generate this many occurrences
Exception DatesComma-separated dates to skip
Occurrences are only regenerated when recurrence-related fields actually change. A hash comparison prevents unnecessary regeneration on every save.
Revenue & Tax

Revenue Type & Fair Market Value

Nonprofit accounting treats ticket revenue (Earned) and donations (Contributed) as distinct categories on Form 990. Cornerstone Events models this at the event and ticket level so receipts, reports, and year-end statements all handle the split automatically.

Revenue Type on each event

TypeMeaningFrontend wording
Earned (default)Buyer receives goods or services of equal value — a concert ticket, a class, admission. Not tax-deductible for the buyer."Buy Tickets"
ContributedPure donation — the buyer receives nothing of material value. Fully tax-deductible."Make a Gift"
MixedQuid-pro-quo event (gala, benefit dinner) — part of the price covers goods/services, the rest is a gift."Buy Tickets & Support"

Stored as _idem_event_status post meta on each event. Configured in the event's Schedule tab.

Fair Market Value (Mixed mode)

When an event is set to Mixed, each ticket type gains a Fair Market Value field (stored as fair_market_value in idem_ticket_types). The math:

earned portion   = min(price, FMV)
contributed portion = price − FMV

Example: a $250 gala ticket with FMV of $75 produces $75 of earned revenue and $175 of tax-deductible contribution on the buyer's receipt.

What the split drives

  • Receipt emails (templates/emails/receipt.php) — Mixed tickets show an inline FMV breakdown per line and a "Tax deduction summary" panel with IRS-style disclaimer.
  • Reports — the Earned / Contributed / Donation breakdown, per-event P&L, transaction ledger, and donor totals all use the saved split.
  • Year-End Statements — the itemized line and deductible totals come directly from this.

Storage on registrations

When a registration is created, IDEM_Registration::store_revenue_split() writes four registration meta keys: _earned_amount, _contributed_amount, _fee_amount, _discount_amount. Reports aggregate directly from these, with a fallback formula (total_amount − donation_amount as earned) for rows predating FMV tracking.

Revenue & Tax

Stripe Payment Integration

Stripe is used for all paid transactions. The plugin uses Stripe's Payment Intents API directly — no Stripe SDK required. All API calls are made via wp_remote_post().

Configuration

Navigate to Settings > Payment:

OptionDescription
ModeTest or Live — toggled with a segmented button (green = Test, red = Live)
Test / Live KeysPublishable and Secret keys for each mode
Webhook SecretFor verifying Stripe webhook events
Processing Fee %Default 2.9%
Processing Fee FixedDefault $0.30

Payment Flow

  1. Frontend calls POST /wp-json/idem/v1/create-payment-intent to create a Payment Intent.
  2. Stripe.js collects card details and confirms the payment on the client.
  3. On success, the registration is submitted to POST /wp-json/idem/v1/register with the payment_intent_id.
  4. The backend verifies the Payment Intent via the Stripe API and confirms the registration.
  5. Confirmation and receipt emails are sent.

Webhook

Stripe webhook endpoint: POST /wp-json/idem/v1/stripe-webhook

Handles payment_intent.succeeded to confirm pending registrations in case the frontend flow is interrupted.

Refunds

Refunds can be initiated from the registration detail page in admin. The plugin calls the Stripe Refunds API using the stored payment_id and marks the registration as refunded. Seats are released back to the event capacity.

Payments & Giving

Donations

Donations can be collected alongside ticket purchases or as standalone contributions.

Event-Level Configuration

FieldDescription
Enable DonationsShow donation section on registration form
Suggested AmountsComma-separated dollar amounts shown as quick-select buttons
Allow Custom AmountLet registrants type in any amount

Behavior

  • Suggested amounts are shown as buttons. Clicking a selected button deselects it (clears the donation).
  • When a donation is added to a free RSVP registration, payment switches to Stripe automatically.
  • Donations are stored separately in donation_amount and included in financial reporting.

Standalone Donation Form

The [id_event_donate] shortcode renders a standalone donation form with no ticket selection. These create registration records with seat_count = 0. A tribute can optionally be included.

Payments & Giving

Tributes (Honors)

Tributes allow registrants to make a donation in honor or in memory of someone. Managed under Events Manager > Tributes.

Per-Event Configuration

FieldDescription
Enable TributesShow the "Dedicate This Donation" section on the form (only visible when a donation amount is entered)
Tribute TypesWhich types to allow: In Honor Of, In Memory Of, or both
Enable Email TributesAllow delivery by email to a recipient
Enable Mailed TributesAllow delivery by physical mail (collects mailing address)
Auto-send Email TributeAutomatically send the tribute notification email when a registration is submitted
Tribute Email Subject / BodyCustom email template for the tribute notification sent to the recipient

Tribute Status

Pending Sent

Admins can send tribute emails manually from the Tributes admin page or from the registration detail page. A red badge on the Tributes menu item shows the count of pending tributes.

Payments & Giving

Coupon / Discount Codes

Managed under Events Manager > Coupons. Codes are stored and compared in uppercase.

FieldDescription
CodeUnique code (stored and compared in uppercase)
DescriptionInternal note
Discount TypePercentage or Fixed amount
Discount ValueAmount of the discount
Apply ToPer registration or per ticket
Usage LimitMaximum total uses (0 = unlimited)
Usage Limit Per CustomerMaximum uses per email address
Minimum AmountMinimum cart subtotal required
Event RestrictionsOptionally limit to specific events
Ticket Type RestrictionsOptionally limit to specific ticket types
Start Date / Expiry DateActive date range
StatusActive / Disabled
Revenue & Tax

Year-End Donor Statements

Nonprofits owe donors a summary of each year's deductible contributions. Cornerstone generates these automatically and batch-emails them with a typed confirmation gate so you can't accidentally double-send.

Required settings

Under Settings → General → Organization Info:

SettingOptionAppears on statement
Legal nameidem_org_legal_nameHeader + footer (falls back to site name)
Addressidem_org_addressHeader block
EIN / Tax IDidem_org_einHeader + small-print footer
Statement footeridem_statement_footerDisclaimer paragraph (IRS-compliant default)

Eligibility

A constituent receives a statement if they had at least one confirmed registration in the tax year with a contributed-portion greater than zero. Pure Earned ticket buyers do not get a statement (no tax implication).

Preview & batch send

Go to Reports → Year-End Statements, pick the tax year, and review the roster. Per-recipient links let you preview before sending.

The batch panel requires a typed phrase (SEND N STATEMENTS) to send. A Dry run button shows the would-send count without emailing anyone.

Public statement URL

Each recipient gets an HMAC-signed, tokenized link of the form:

https://yoursite.com/?idem_statement=TOKEN&y=YYYY&e=email

The page renders a printable IRS-style statement: itemized contributions, FMV received, total deductible portion, and the custom footer. Recipients can save-as-PDF from the browser. No database table is needed for the tokens — they are signed against wp_salt('secure_auth').

Email log entries from the batch send carry the type statement_{year}, so you can verify delivery for each year independently.
Attendees

Invitations

Invitations allow admins to create personalized registration links with optional pricing overrides and quantity locks. Managed under Events Manager > Invitations.

FieldDescription
EventWhich event the invitation is for
Invitee First/Last NameName of the invitee
Email, Phone, AddressOptional contact info
Ticket TypePre-selects a specific ticket type on the form
Custom PriceOverrides the ticket type's price for this invitee
Ticket QuantityLocks the quantity input to this value
Hide Other TicketsHides non-matching ticket types on the registration form
Show DonationWhether to show the donation section for this invitee
StatusPending / Used / Expired
Expiry DateOptional expiration date

Invitation Codes

Codes are 10 characters, uppercase alphanumeric, using a charset that excludes ambiguous characters (0, O, 1, I, L). Codes are guaranteed unique.

Applying Codes

  • Direct link: https://yoursite.com/?invite_code=XXXXXX — the code is pre-applied and the input is hidden.
  • Form entry: A collapsible "Have an invitation code?" toggle appears on the registration form.
Attendees

Attendee & Guest Management

For multi-seat registrations, the plugin collects guest details via a follow-up form sent after registration.

How It Works

  1. When a registration with seat_count > 1 is created, an attendee tracking record is created in idem_attendees.
  2. An admin sends a follow-up email, or it sends automatically if the ticket type has auto-send enabled.
  3. The email contains a unique tokenized link to a guest information form.
  4. The registrant fills in name, email, dietary restrictions, accessibility needs, and notes for each guest.
  5. Partial submissions are allowed — the registrant can return later.

Status Progression

Pending Follow-up → Link Sent → Partial Info → Info Received

Table Numbers

Table numbers can be assigned to individual guests via the attendee edit form or inline from the attendee list. Table number is included in the guest CSV export.

Seat-edit cutoff, removals, and edit log

Each event has a Guest-info edits allowed policy (Anytime / 24h before / 72h before / Until event start / Locked after first submission) plus an optional Allow leader to remove a seat toggle. Both enforced server-side in IDEM_Attendee::get_edit_lock_state() and surfaced to the guest form.

Removals hit the REST endpoint POST /idem/v1/remove-seat, which deletes the guest, decrements expected_guest_count, and releases capacity. Every edit and removal is appended to _edit_log registration meta (timestamp, actor, IP, action, summary) and rendered as an Edit Log card on the registration detail page.

Attendees & Door

QR Check-In

Door-operations screen with a camera scanner, live stats, searchable roster, and walk-in entry. All driven by per-guest and per-attendee signed tokens.

Data model

  • idem_guests.checkin_token — per-attendee QR token (primary).
  • idem_guests.checked_in_at — timestamp (NULL = not checked in).
  • idem_attendees.checkin_token — group-level fallback QR for registrations without filled-in guests.

Tokens are generated automatically on insert and on DB upgrade for any row missing one.

Public ticket page

https://yoursite.com/?idem_ticket=TOKEN&kind=guest
https://yoursite.com/?idem_ticket=TOKEN&kind=attendee

Renders a standalone printable ticket with event name, date, venue, attendee name, and a QR code (rendered client-side by the bundled qrcodejs). Linked from confirmation emails via the {ticket_link} and {ticket_button} merge tags.

Admin Check-In page

Events Manager → Check-In. Pick an event and the screen shows:

  • Live stats: Checked in / Remaining / Expected (polls every 15 s).
  • Camera scanner (bundled html5-qrcode.min.js) with auto-check-in on decode.
  • Text search across guests and registrants.
  • Per-guest Check in / Uncheck buttons.
  • One-tap Add walk-in that creates a confirmed registration + guest in a single click.

REST endpoints

EndpointPurpose
GET /idem/v1/checkin/rosterEvent stats + searchable attendee/guest roster.
POST /idem/v1/checkin/scanMark a token as checked in (guest or group).
POST /idem/v1/checkin/markCheck in or un-check a specific guest ID.
POST /idem/v1/checkin/walkinCreate a walk-in registration and mark attending.
Endpoints require manage_options capability. Open-link volunteer check-in (without a WP user) is on the roadmap.
Emails

Email System

All emails are sent using WordPress's wp_mail() with an HTML wrapper applied automatically. Every sent email is logged to the idem_email_log table.

Email Types

TypeTrigger
Registration ConfirmationImmediately on free registration, or after payment confirmation
Payment ReceiptAfter successful Stripe payment
Attendee Follow-upManually by admin, or automatically if ticket type has auto-send enabled
Event ReminderAutomatically via WP-Cron on configured days before the event
Waitlist NotificationAutomatically when a seat opens up
InvitationManually sent from the Invitations admin page
Tribute NotificationAutomatically on registration (if auto-send enabled) or manually from Tributes admin
Admin NotificationAutomatically on every new (non-waitlisted) registration

HTML Email Wrapper

All emails are wrapped in a branded HTML shell with a header (logo + configurable background color), a content card, and a footer. Header background and primary accent color are configurable in Settings.

Theme Overrides

Email template PHP files can be overridden by placing files in your theme:

your-theme/cornerstone-events/emails/confirmation.php
your-theme/cornerstone-events/emails/receipt.php
your-theme/cornerstone-events/emails/followup.php
your-theme/cornerstone-events/emails/reminder.php
your-theme/cornerstone-events/emails/waitlist.php
your-theme/cornerstone-events/guest-form.php
Emails

Merge Tags Reference

Merge tags can be used in email subject lines and body content.

Customer & Registration

TagOutput
{customer_name}Full name (first + last)
{customer_first_name}First name
{customer_last_name}Last name
{customer_email}Email address
{customer_phone}Phone number
{customer_full_address}Street, City, State ZIP formatted
{registration_id}Registration number
{registration_date}Date the registration was created
{seat_count}Number of seats registered
{ticket_type}Ticket type name
{amount_paid}Total amount paid (formatted with currency symbol)
{subtotal}Subtotal before donation and discount
{donation_amount}Donation amount
{payment_method}Payment method (Free, Stripe, etc.)
{registration_status}Current status

Event

TagOutput
{event_name}Event title
{event_date}Formatted start date and time
{event_location}Venue name and address
{online_link}Virtual event URL
{event_details}Styled event card (name, date, location, View Event button)
{add_to_calendar}Formatted links for Google Calendar, Outlook, and iCal download

Tribute / Honor

TagOutput
{tribute_info}Full styled tribute card for admin notification emails
{tribute_type}"In Honor Of" or "In Memory Of"
{honoree_name}Name of the person being honored
{tribute_message}Personal message from the registrant
{tribute_from}Name of the person making the tribute
{recipient_name}Name of the tribute notification recipient

Invitation

TagOutput
{invitee_first_name}Invitee first name
{invitee_last_name}Invitee last name
{invite_code}The invitation code
{invitation_url}Direct registration URL with code pre-applied

Follow-up & Admin

TagOutput
{form_link}URL to the guest information form
{ticket_link}Raw URL of the registrant's QR ticket page
{ticket_button}Styled "View your ticket" CTA button (primary-colored) linking to the ticket page
{admin_registration_url}Direct link to the registration detail page in wp-admin
Emails

Event Reminders

Reminder emails are sent via WP-Cron (daily). The cron job fires the idem_daily_reminder_check action.

Per-Event Configuration

FieldDescription
Enable RemindersTurn on reminder emails for this event
Reminder TimingSelect one or more: 1 day before, 3 days before, 1 week before, 2 weeks before
The system checks the email log before sending to prevent duplicate reminders if the cron fires more than once on a given day.
Emails

Broadcast Emails to Registrants

Send filtered bulk email to the registrants of a single event. Events Manager → Broadcast.

Filters

FilterOptions
Registration statusConfirmed only · Confirmed + Pending · Pending only · Refunded · Cancelled
Ticket typeAll, or any single ticket type on the event
Check-in stateAny · Checked in · Not checked in — purpose-built for post-event thank-yous vs "we missed you" follow-ups

Composer

  • Subject line.
  • Rich-text body via wp_editor (TinyMCE).
  • All email merge tags available ({first_name}, {event_name}, {ticket_button}, etc.).
  • Live recipient count refreshes on filter change.
  • Send Test — delivers one copy to an admin-specified email using the first recipient's merge data (subject prefixed [TEST]).

Send behavior

Messages route through IDEM_Email::send() (full branded wrapper + log entry) with type broadcast. De-duplicated by lowercase email so one person with two registrations gets one copy. Synchronous send — comfortable for lists up to a few hundred; batching via AJAX progress bar is a roadmap item for larger lists.

Emails

Scheduled Summary Emails

Opt-in revenue digest that fires weekly or monthly to recipients of your choice — useful for keeping a board member in the loop without giving them a WP login.

Settings

Settings → General → Scheduled Summary Email:

OptionValues
idem_scheduled_report_frequencyoff (default), weekly, monthly
idem_scheduled_report_recipientsComma-separated emails. Blank = site admin.

Mechanics

  • Implemented as IDEM_Scheduled_Reports hooked into WP Cron via idem_scheduled_report.
  • Custom cron schedules weekly (7 days) and monthly (30 days) are registered by the plugin.
  • On setting change, the hook is unscheduled and re-scheduled automatically.
  • On plugin deactivation, the hook is cleared.

Contents

Last 7 or 30 days: registration count, Earned / Contributed / Donations / Fees / Gross totals, plus a per-event table. Logged as email type scheduled_summary.

Reports

Reports Overview

Events Manager → Reports. Ten tabs covering financial, constituent, and operational views. Every tab supports CSV export (nonce-protected), date-range presets (Last 7 / 30 / 90 days, YTD, Last Year, All Time, Custom), an event filter, and a registration-status filter.

TabWhat it shows
Revenue BreakdownSummary cards + stacked bar chart + per-event table. Splits Earned / Contributed (with gift-vs-donation sub-split) / Fees / Gross.
Event P&LPer-event Gross, Discounts, Refunds, Fees covered, Net (Gross − Refunds). Counts refunded rows separately from gross.
TrendMonth-by-month stacked column chart (6 / 12 / 24-month windows) with percentage change vs the prior equal-length period.
Transaction LedgerOne row per registration, chronological. 16-column CSV designed for bookkeeper reconciliation.
Refund LogEvery refunded registration in the date range with running total.
Coupon UsageBy-code summary (uses + total discount) plus per-transaction log.
ConstituentsUnique contacts keyed by email, with lifetime totals (events attended, earned, contributed, donations, total spent, first/last seen).
Top PatronsRanked list (top 50 on screen, 500 in CSV) with date range and sort-by (Total / Contributed / Earned / Events attended).
Repeat AttendeesMin-events filter (2 / 3 / 5 / 10) + optional "not seen since" date for re-engagement lists.
Year-End StatementsYear picker, eligibility roster, per-recipient preview, dry-run + batch-send with typed confirmation. See Year-End Donor Statements.

Data plumbing

All report queries aggregate directly from registration meta written at insert time by IDEM_Registration::store_revenue_split():

Meta keyStores
_earned_amountSum of FMV portion across ticket line items
_contributed_amountDonation + gift portion of Mixed tickets
_fee_amountFees covered by the registrant
_discount_amountTotal coupon discount applied

For registrations predating this storage (before DB v1.8.0), a fallback formula reads total_amount − donation_amount as earned and donation_amount as contributed — so historical data still renders meaningfully without a backfill.

Tools & Settings

Shortcodes

[id_events]

Displays the full event calendar with view toggle (month / list / agenda) and navigation.

AttributeDefaultDescription
viewmonthInitial view: month, list, or agenda
category(empty)Filter by category slug
limit10Number of events for list/agenda views
[id_events view="list" category="fundraisers" limit="5"]

[id_event_register]

Displays the registration form for a specific event.

AttributeDefaultDescription
idCurrent post IDEvent post ID
[id_event_register id="42"]

[id_event_capacity]

Displays the remaining seat count for an event. Outputs a <span> with one of four CSS classes: idem-capacity--unlimited, idem-capacity--available, idem-capacity--low (≤10 remaining), or idem-capacity--full.

[id_event_capacity id="42"]

[id_event_donate]

Displays a standalone donation form for an event. Requires Stripe to be configured.

[id_event_donate id="42"]
Tools & Settings

CSV Export

Located in Settings > Export. All exports can be filtered by event and date range. Files are UTF-8 with BOM for Excel compatibility.

Export TypeFields
EventsID, Title, status, Event Status, Start/End Date + Time, Venue (Name, Address, City, State, ZIP, Phone, Website), Revenue Type, Registration Type, Capacity, Description, Ticket Types (JSON), Permalink
VenuesID, Name, Address, City, State, ZIP, Phone, Website, Description, Linked Event Count
RegistrationsID, Event, Status, Name, Email, Phone, Address, Ticket Type, Quantity, Seats, Subtotal, Discount, Donation, Total, Payment Method, Payment ID, Date
GuestsEvent, Registrant Name, Registrant Email, Guest Name, Guest Email, Table, Dietary Restrictions, Accessibility Needs, Notes
TributesEvent, Registrant, Type, Honoree, Message, Status, Date
Financial SummaryEvent, Total Registrations, Ticket Revenue, Donation Revenue, Discounts Given, Net Revenue

Every report tab also has its own CSV export. For a full lossless WordPress-to-WordPress migration, Tools → Export (WXR) works with both the id_event and id_venue post types.

The Attendees admin page also has its own Export CSV button that exports all guests matching the current filter/search state.
Tools & Settings

Settings Reference

Found at Events Manager > Settings, organized in tabs.

General

OptionDescription
CurrencyCurrency code (USD, EUR, GBP, CAD, AUD)
Date FormatDate display format (defaults to WordPress setting)
Time FormatTime display format (defaults to WordPress setting)
Default CapacityDefault seat limit for new events
Registration Start NumberSets the AUTO_INCREMENT value for registration IDs

Email Templates

One editor per email type (Confirmation, Receipt, Follow-up, Reminder, Waitlist, Invitation, Tribute, Admin Notification). Each has a subject and body field with merge tag reference. Preview / Test button available for all templates.

  • From Name / From Email
  • Email Logo (media uploader)
  • Header Background Color (color picker)
  • Primary Accent Color (color picker)
  • Admin Notification Recipients (comma-separated)

Display

OptionDescription
Default Calendar ViewMonth / List / Agenda
Events Per PageFor list and agenda views
Show Past EventsInclude past events in calendar and listings
Tools & Settings

Import from The Events Calendar

Located in Settings > Import. Supports importing events from The Events Calendar plugin via WordPress XML export files.

TEC FieldCornerstone Events Field
Event titlePost title
Event descriptionPost content (page builder markup stripped)
Start/End date and time_idem_start_date, _idem_start_time, _idem_end_date, _idem_end_time
Venue name and address_idem_venue_name, _idem_venue_address
Category (tribe_events_cat)idem_event_category taxonomy
Virtual event URL_idem_online_link
  • Venues XML: Upload a separate venues XML file for venue resolution.
  • Skip existing: Avoid re-importing events that already exist (matched by title).

Content cleanup automatically strips WPBakery shortcodes, Tribe blocks, and Fusion Builder markup.

Developer

Database Tables

All tables use the WordPress table prefix (e.g., wp_idem_registrations).

TablePurpose
idem_registrationsOne row per registration. Stores customer info, ticket summary, amounts, payment details.
idem_registration_metaKey/value meta for registrations (line items, notes, flags).
idem_registration_itemsLine items for multi-ticket registrations (ticket_type_id, quantity, unit_price, subtotal).
idem_ticket_typesTicket type definitions per event (name, price, seat multiplier, flexible pricing settings).
idem_honorsTribute/honor records (type, honoree, message, recipient, delivery method, status).
idem_attendeesAttendee tracking records for follow-up (one per multi-seat registration).
idem_guestsIndividual guest details submitted via the follow-up form (name, dietary, accessibility, table number).
idem_couponsDiscount/coupon code definitions.
idem_invitationsInvitation records with codes, custom pricing, and quantity locks.
idem_email_logLog of all sent emails (type, recipient, subject, status, timestamp).

Registration Statuses

confirmed pending waitlisted cancelled refunded
Developer

Developer Reference

Action Hooks

idem_registration_created
Fires after a registration record is inserted.
$registration_id, $registration_data, $event_id
idem_registration_status_changed
Fires when a registration's status changes.
$registration_id, $new_status, $old_status
idem_payment_complete
Fires after payment is confirmed.
$registration_id, $amount
idem_refund_processed
Fires after a refund is processed.
$registration_id, $registration
idem_donation_processed
Fires after a standalone donation is processed.
$registration_id, $amount, $event_id
idem_attendee_record_created
Fires after an attendee tracking record is created.
$registration_id, $event_id
idem_form_link_sent
Fires after a guest form link email is sent.
$attendee_id, $registration_id, $attendee
idem_guest_info_received
Fires after guest info is submitted.
$attendee_id, $guest_count, $registration_id
idem_honor_status_changed
Fires when a tribute status changes.
$honor_id, $new_status, $old_status
idem_waitlist_notification_sent
Fires when a waitlist notification email is sent.
$registration_id, $event_id
idem_waitlist_promoted
Fires when a waitlist registration is promoted to confirmed.
$registration_id, $registration
idem_reminders_sent
Fires after reminders are processed for an event.
$event_id, $sent_count
idem_before_followup_email
Fires before a follow-up email is sent.
$registration_id, $registration
idem_event_settings_fields
Fires inside the Event Details meta box — use to inject custom fields.
$post

Filter Hooks

// Modify CSV export column headers
add_filter( 'idem_export_columns', function( $columns, $type ) {
    // return modified $columns array
}, 10, 2 );

// Modify CSV export row data
add_filter( 'idem_export_row_data', function( $row, $reg, $type ) {
    // return modified $row array
}, 10, 3 );

REST API Endpoints

MethodEndpointDescription
POST/wp-json/idem/v1/registerSubmit a registration
POST/wp-json/idem/v1/donateSubmit a standalone donation
POST/wp-json/idem/v1/submit-guestsSubmit guest information form
POST/wp-json/idem/v1/create-payment-intentCreate a Stripe Payment Intent
POST/wp-json/idem/v1/stripe-webhookStripe webhook receiver

Key Constants

ConstantValue
IDEM_VERSION2.10.2
IDEM_DB_VERSION1.10.0
IDEM_PLUGIN_DIRAbsolute path to plugin directory
IDEM_PLUGIN_URLURL to plugin directory

Helper Functions

FunctionDescription
idem_format_time( $time_string, $date_string )Formats a time string using the plugin's configured time format
idem_is_pro()Returns true — licensing is currently disabled; all features enabled