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
Requirements & Installation
Minimum Requirements
- WordPress 6.0 or higher
- PHP 7.4 or higher
Installation
- Upload the
cornerstone-eventsfolder to/wp-content/plugins/. - Activate through Plugins in WordPress admin.
- On activation, all database tables are created automatically and default settings are saved.
- 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)
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
| Field | Description |
|---|---|
| Start Date / Start Time | Event start datetime |
| End Date / End Time | Event end datetime |
| Venue Name | Name of the venue |
| Venue Address | Street address (textarea) |
| Show map on event page | Enables a map embed on the public event page |
| Hide street address | Hides the address from the public event page |
| Hide "Add to Calendar" links | Removes Google, Outlook, and iCal links from the event page |
| Hide remaining capacity count | Hides the seat counter from the public event page |
| Hide "Includes X seats" message | Hides the seat count note on multi-seat ticket types |
| Online Event Link | URL for streaming or virtual meetings. Used by the {online_link} merge tag. Option to show the link publicly when the event is live. |
| Event Status | Upcoming / In Progress / Past / Cancelled |
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.
Registration Types
Set per-event under the Registration Settings meta box.
| Type | Description |
|---|---|
| Disabled | No registration form is shown. |
| Free RSVP | Registrants select a quantity. No payment collected. Supports donations. |
| Paid Tickets | Registrants select from defined ticket types. Payment via Stripe. |
Registration Settings Fields
| Field | Description |
|---|---|
| Registration Type | Disabled / Free RSVP / Paid Tickets |
| Capacity | Maximum seats. 0 = unlimited. |
| Enable waitlist when full | When capacity is reached, new registrations are placed on the waitlist. |
| Collect phone number | Adds a phone field to the registration form. |
| Collect mailing address | Adds Street, City, State, ZIP fields to the form. |
| Collect dietary restrictions | Adds a dietary restrictions field. |
| Collect accessibility needs | Adds an accessibility needs field. |
| Allow registrants to cover processing fees | Shows a "cover fees" checkbox on paid events. |
| Cover fees by default | Pre-checks the cover fees option. |
| RSVP Mode | Enables a Yes / No response selector. Ticket types can be filtered by RSVP group (Yes / No / Both). |
| Custom Note | Optional note shown on the registration form, with 5 position options. |
| Invitations Required | When enabled, only registrants with a valid invitation code can register. |
| Show Invitation Code Input | Controls whether the invitation code input is shown on the form (vs. URL-only). |
Ticket Types
Ticket types are stored in the idem_ticket_types database table (not post meta). Each event can have multiple ticket types.
| Field | Description |
|---|---|
| Name | Display name of the ticket type |
| Price | Base price (0 = free) |
| Seat Multiplier | How many seats one ticket counts as (e.g., a "Table of 10" ticket = 10 seats) |
| Description | Optional description shown on the registration form |
| RSVP Group | Which RSVP response this ticket applies to: Yes / No / Both |
| Auto-send guest form | Automatically sends the attendee follow-up email when this ticket type is purchased |
| Flexible Pricing | Enables "pay what you can" with optional min, max, and suggested price amounts |
| Sort Order | Controls display order on the form |
idem_registration_items table.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
| Field | Storage |
|---|---|
| Name | post_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 |
| Description | post_content |
| Featured image | standard 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).
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
waitlistedstatus. 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.
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.
| Field | Description |
|---|---|
| Recurrence Pattern | None / Daily / Weekly / Biweekly / Monthly |
| End Date | Stop generating occurrences after this date |
| Occurrence Count | Alternative to end date — generate this many occurrences |
| Exception Dates | Comma-separated dates to skip |
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
| Type | Meaning | Frontend 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" |
| Contributed | Pure donation — the buyer receives nothing of material value. Fully tax-deductible. | "Make a Gift" |
| Mixed | Quid-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.
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:
| Option | Description |
|---|---|
| Mode | Test or Live — toggled with a segmented button (green = Test, red = Live) |
| Test / Live Keys | Publishable and Secret keys for each mode |
| Webhook Secret | For verifying Stripe webhook events |
| Processing Fee % | Default 2.9% |
| Processing Fee Fixed | Default $0.30 |
Payment Flow
- Frontend calls
POST /wp-json/idem/v1/create-payment-intentto create a Payment Intent. - Stripe.js collects card details and confirms the payment on the client.
- On success, the registration is submitted to
POST /wp-json/idem/v1/registerwith thepayment_intent_id. - The backend verifies the Payment Intent via the Stripe API and confirms the registration.
- 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.
Donations
Donations can be collected alongside ticket purchases or as standalone contributions.
Event-Level Configuration
| Field | Description |
|---|---|
| Enable Donations | Show donation section on registration form |
| Suggested Amounts | Comma-separated dollar amounts shown as quick-select buttons |
| Allow Custom Amount | Let 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_amountand 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.
Tributes (Honors)
Tributes allow registrants to make a donation in honor or in memory of someone. Managed under Events Manager > Tributes.
Per-Event Configuration
| Field | Description |
|---|---|
| Enable Tributes | Show the "Dedicate This Donation" section on the form (only visible when a donation amount is entered) |
| Tribute Types | Which types to allow: In Honor Of, In Memory Of, or both |
| Enable Email Tributes | Allow delivery by email to a recipient |
| Enable Mailed Tributes | Allow delivery by physical mail (collects mailing address) |
| Auto-send Email Tribute | Automatically send the tribute notification email when a registration is submitted |
| Tribute Email Subject / Body | Custom email template for the tribute notification sent to the recipient |
Tribute Status
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.
Coupon / Discount Codes
Managed under Events Manager > Coupons. Codes are stored and compared in uppercase.
| Field | Description |
|---|---|
| Code | Unique code (stored and compared in uppercase) |
| Description | Internal note |
| Discount Type | Percentage or Fixed amount |
| Discount Value | Amount of the discount |
| Apply To | Per registration or per ticket |
| Usage Limit | Maximum total uses (0 = unlimited) |
| Usage Limit Per Customer | Maximum uses per email address |
| Minimum Amount | Minimum cart subtotal required |
| Event Restrictions | Optionally limit to specific events |
| Ticket Type Restrictions | Optionally limit to specific ticket types |
| Start Date / Expiry Date | Active date range |
| Status | Active / Disabled |
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:
| Setting | Option | Appears on statement |
|---|---|---|
| Legal name | idem_org_legal_name | Header + footer (falls back to site name) |
| Address | idem_org_address | Header block |
| EIN / Tax ID | idem_org_ein | Header + small-print footer |
| Statement footer | idem_statement_footer | Disclaimer 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').
statement_{year}, so you can verify delivery for each year independently.Invitations
Invitations allow admins to create personalized registration links with optional pricing overrides and quantity locks. Managed under Events Manager > Invitations.
| Field | Description |
|---|---|
| Event | Which event the invitation is for |
| Invitee First/Last Name | Name of the invitee |
| Email, Phone, Address | Optional contact info |
| Ticket Type | Pre-selects a specific ticket type on the form |
| Custom Price | Overrides the ticket type's price for this invitee |
| Ticket Quantity | Locks the quantity input to this value |
| Hide Other Tickets | Hides non-matching ticket types on the registration form |
| Show Donation | Whether to show the donation section for this invitee |
| Status | Pending / Used / Expired |
| Expiry Date | Optional 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.
Attendee & Guest Management
For multi-seat registrations, the plugin collects guest details via a follow-up form sent after registration.
How It Works
- When a registration with
seat_count > 1is created, an attendee tracking record is created inidem_attendees. - An admin sends a follow-up email, or it sends automatically if the ticket type has auto-send enabled.
- The email contains a unique tokenized link to a guest information form.
- The registrant fills in name, email, dietary restrictions, accessibility needs, and notes for each guest.
- 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.
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
| Endpoint | Purpose |
|---|---|
GET /idem/v1/checkin/roster | Event stats + searchable attendee/guest roster. |
POST /idem/v1/checkin/scan | Mark a token as checked in (guest or group). |
POST /idem/v1/checkin/mark | Check in or un-check a specific guest ID. |
POST /idem/v1/checkin/walkin | Create a walk-in registration and mark attending. |
manage_options capability. Open-link volunteer check-in (without a WP user) is on the roadmap.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
| Type | Trigger |
|---|---|
| Registration Confirmation | Immediately on free registration, or after payment confirmation |
| Payment Receipt | After successful Stripe payment |
| Attendee Follow-up | Manually by admin, or automatically if ticket type has auto-send enabled |
| Event Reminder | Automatically via WP-Cron on configured days before the event |
| Waitlist Notification | Automatically when a seat opens up |
| Invitation | Manually sent from the Invitations admin page |
| Tribute Notification | Automatically on registration (if auto-send enabled) or manually from Tributes admin |
| Admin Notification | Automatically 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
Event Reminders
Reminder emails are sent via WP-Cron (daily). The cron job fires the idem_daily_reminder_check action.
Per-Event Configuration
| Field | Description |
|---|---|
| Enable Reminders | Turn on reminder emails for this event |
| Reminder Timing | Select one or more: 1 day before, 3 days before, 1 week before, 2 weeks before |
Broadcast Emails to Registrants
Send filtered bulk email to the registrants of a single event. Events Manager → Broadcast.
Filters
| Filter | Options |
|---|---|
| Registration status | Confirmed only · Confirmed + Pending · Pending only · Refunded · Cancelled |
| Ticket type | All, or any single ticket type on the event |
| Check-in state | Any · 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.
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:
| Option | Values |
|---|---|
idem_scheduled_report_frequency | off (default), weekly, monthly |
idem_scheduled_report_recipients | Comma-separated emails. Blank = site admin. |
Mechanics
- Implemented as
IDEM_Scheduled_Reportshooked into WP Cron viaidem_scheduled_report. - Custom cron schedules
weekly(7 days) andmonthly(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 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.
| Tab | What it shows |
|---|---|
| Revenue Breakdown | Summary cards + stacked bar chart + per-event table. Splits Earned / Contributed (with gift-vs-donation sub-split) / Fees / Gross. |
| Event P&L | Per-event Gross, Discounts, Refunds, Fees covered, Net (Gross − Refunds). Counts refunded rows separately from gross. |
| Trend | Month-by-month stacked column chart (6 / 12 / 24-month windows) with percentage change vs the prior equal-length period. |
| Transaction Ledger | One row per registration, chronological. 16-column CSV designed for bookkeeper reconciliation. |
| Refund Log | Every refunded registration in the date range with running total. |
| Coupon Usage | By-code summary (uses + total discount) plus per-transaction log. |
| Constituents | Unique contacts keyed by email, with lifetime totals (events attended, earned, contributed, donations, total spent, first/last seen). |
| Top Patrons | Ranked list (top 50 on screen, 500 in CSV) with date range and sort-by (Total / Contributed / Earned / Events attended). |
| Repeat Attendees | Min-events filter (2 / 3 / 5 / 10) + optional "not seen since" date for re-engagement lists. |
| Year-End Statements | Year 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 key | Stores |
|---|---|
_earned_amount | Sum of FMV portion across ticket line items |
_contributed_amount | Donation + gift portion of Mixed tickets |
_fee_amount | Fees covered by the registrant |
_discount_amount | Total 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.
Shortcodes
[id_events]
Displays the full event calendar with view toggle (month / list / agenda) and navigation.
| Attribute | Default | Description |
|---|---|---|
view | month | Initial view: month, list, or agenda |
category | (empty) | Filter by category slug |
limit | 10 | Number 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.
| Attribute | Default | Description |
|---|---|---|
id | Current post ID | Event 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"]
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 Type | Fields |
|---|---|
| Events | ID, 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 |
| Venues | ID, Name, Address, City, State, ZIP, Phone, Website, Description, Linked Event Count |
| Registrations | ID, Event, Status, Name, Email, Phone, Address, Ticket Type, Quantity, Seats, Subtotal, Discount, Donation, Total, Payment Method, Payment ID, Date |
| Guests | Event, Registrant Name, Registrant Email, Guest Name, Guest Email, Table, Dietary Restrictions, Accessibility Needs, Notes |
| Tributes | Event, Registrant, Type, Honoree, Message, Status, Date |
| Financial Summary | Event, 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.
Settings Reference
Found at Events Manager > Settings, organized in tabs.
General
| Option | Description |
|---|---|
| Currency | Currency code (USD, EUR, GBP, CAD, AUD) |
| Date Format | Date display format (defaults to WordPress setting) |
| Time Format | Time display format (defaults to WordPress setting) |
| Default Capacity | Default seat limit for new events |
| Registration Start Number | Sets 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
| Option | Description |
|---|---|
| Default Calendar View | Month / List / Agenda |
| Events Per Page | For list and agenda views |
| Show Past Events | Include past events in calendar and listings |
Import from The Events Calendar
Located in Settings > Import. Supports importing events from The Events Calendar plugin via WordPress XML export files.
| TEC Field | Cornerstone Events Field |
|---|---|
| Event title | Post title |
| Event description | Post 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.
Database Tables
All tables use the WordPress table prefix (e.g., wp_idem_registrations).
| Table | Purpose |
|---|---|
idem_registrations | One row per registration. Stores customer info, ticket summary, amounts, payment details. |
idem_registration_meta | Key/value meta for registrations (line items, notes, flags). |
idem_registration_items | Line items for multi-ticket registrations (ticket_type_id, quantity, unit_price, subtotal). |
idem_ticket_types | Ticket type definitions per event (name, price, seat multiplier, flexible pricing settings). |
idem_honors | Tribute/honor records (type, honoree, message, recipient, delivery method, status). |
idem_attendees | Attendee tracking records for follow-up (one per multi-seat registration). |
idem_guests | Individual guest details submitted via the follow-up form (name, dietary, accessibility, table number). |
idem_coupons | Discount/coupon code definitions. |
idem_invitations | Invitation records with codes, custom pricing, and quantity locks. |
idem_email_log | Log of all sent emails (type, recipient, subject, status, timestamp). |
Registration Statuses
Developer Reference
Action Hooks
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
| Method | Endpoint | Description |
|---|---|---|
POST | /wp-json/idem/v1/register | Submit a registration |
POST | /wp-json/idem/v1/donate | Submit a standalone donation |
POST | /wp-json/idem/v1/submit-guests | Submit guest information form |
POST | /wp-json/idem/v1/create-payment-intent | Create a Stripe Payment Intent |
POST | /wp-json/idem/v1/stripe-webhook | Stripe webhook receiver |
Key Constants
| Constant | Value |
|---|---|
IDEM_VERSION | 2.10.2 |
IDEM_DB_VERSION | 1.10.0 |
IDEM_PLUGIN_DIR | Absolute path to plugin directory |
IDEM_PLUGIN_URL | URL to plugin directory |
Helper Functions
| Function | Description |
|---|---|
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 |