{
  "name": "Event Espresso 4 Registration Variations",
  "slug": "eea-registration-variations",
  "version": "0.3.1",
  "download_url": "https://gitea.mulligan.casa/ee-extensions/foh-updates/raw/branch/main/eea-registration-variations/eea-registration-variations-0.3.1.zip",
  "homepage": "https://gitea.mulligan.casa/ee-extensions/eea-registration-variations",
  "requires": "6.4",
  "tested": "7.0",
  "requires_php": "8.1",
  "last_updated": "2026-06-23 19:59:17",
  "icons": {
    "1x": "https://gitea.mulligan.casa/ee-extensions/foh-updates/raw/branch/main/eea-registration-variations/icon-128x128.png",
    "2x": "https://gitea.mulligan.casa/ee-extensions/foh-updates/raw/branch/main/eea-registration-variations/icon-256x256.png"
  },
  "author": "Mike Mulligan",
  "author_homepage": "https://gitea.mulligan.casa/mmulligan",
  "tags": [
    "event espresso",
    "variations",
    "inventory",
    "merchandise",
    "registration"
  ],
  "sections": {
    "description": "<p>Registration Variations turns an Event Espresso ticket into a product with selectable options — sizes, colors, meal plans — each carrying its own remaining-stock inventory, price modifier, and SKU. It is the practical way to sell ticket-attached merchandise and meal choices without creating a separate ticket for every combination.</p>\n<p><strong>What it adds:</strong></p>\n<ul>\n<li><strong>A variation set per ticket.</strong> Define the options for a ticket directly in the classic ticket editor's advanced details. Each variation has a label, a price modifier, a SKU, and its own stock count.</li>\n<li><strong>Composed pricing.</strong> A variation's price is a modifier on the ticket's base price and composes correctly with Event Espresso's own surcharges and discounts, shown as a single combined line item.</li>\n<li><strong>Oversell-safe inventory.</strong> Per-variation remaining stock is held in an atomic counter guarded so concurrent registrations can never sell past zero. Sold-out variations are disabled in selection; sales totals are derived from registrations, not a second counter that can drift.</li>\n<li><strong>A generated selection question.</strong> Each variation set materializes a native Event Espresso registration question with the variations as options, decorated in checkout with price/SKU/remaining labels and sold-out removal.</li>\n<li><strong>Required selection.</strong> When a ticket has variations, the selection is enforced server-side at the registration step — checkout cannot continue without a valid choice.</li>\n<li><strong>Variation sales report.</strong> A read-only admin report under the Event Espresso menu breaks sales down per ticket and per variation.</li>\n</ul>\n<p><strong>Front-of-house point of sale (optional).</strong> When <strong>Front of House for Event Espresso</strong> is installed, a ticket with variations opens a \"Sell options\" modal at the station with per-variation quantity steppers, fed through that app's generic payload contract. The integration is feature-detected and inert when the app is absent.</p>\n<p><strong>Self-contained on Event Espresso.</strong> All of the variation model — definitions, inventory, pricing, generated questions, and the wp-admin exchange/refund flow — works on a plain Event Espresso install through wp-admin and the standard checkout. Front of House is purely an optional consumer.</p>\n<p>For full documentation and design notes, see the <code>docs/</code> directory included with the plugin.</p>",
    "installation": "<ol>\n<li>Install and activate Event Espresso.</li>\n<li>Upload this plugin to <code>wp-content/plugins/</code> and activate it. Activation creates the per-variation stock table.</li>\n<li>Open a ticket in the classic ticket editor and define its variations in the advanced details section.</li>\n<li>(Optional) If you use Front of House for Event Espresso, the station automatically gains a variation-aware \"Sell options\" modal.</li>\n</ol>",
    "faq": "<p><strong>Do I need Front of House for Event Espresso?</strong></p>\n<p>No. The variation model, inventory, pricing, generated questions, and admin exchange/refund all work on plain Event Espresso. Front of House adds a point-of-sale selling modal when present.</p>\n<p><strong>Which ticket editor is supported?</strong></p>\n<p>The variation definitions are edited in the classic ticket editor's advanced details.</p>\n<p><strong>How is pricing handled?</strong></p>\n<p>Each variation carries a price modifier (a positive or negative delta) on the ticket's base price. The charged amount composes with Event Espresso's native surcharges and discounts and is shown as one combined line item.</p>\n<p><strong>Can two people buy the last unit at the same time?</strong></p>\n<p>No. Remaining stock is decremented through an atomic, conditional update, so concurrent registrations cannot oversell a variation.</p>",
    "changelog": "<p><strong>0.3.1</strong><br />\n* Migrate to the shared release pipeline; richer View-details modal (readme.txt sections, tags). No functional change.</p>\n<p><strong>0.3.0</strong><br />\n* Added a color-coded plugin icon (delivered through the update channel) and declared WordPress 7.0 compatibility. No functional change.</p>\n<p><strong>0.2.4</strong><br />\n* Updates are now handled by the Manifest Updater plugin (via the standard \"Update URI\" header) instead of a bundled updater. No functional change.</p>\n<p><strong>0.2.3</strong><br />\n* Security: escape variation label/SKU at the public option-render seam and sanitize them on save (stored-XSS fix).<br />\n* Fix: SPCO (vanilla EE checkout) purchases of a variation ticket now decrement the variation counter — the chosen key is seeded from the saved answer before the lifecycle commit, closing an oversell gap.<br />\n* Fix: admin exchange is now retry-safe after a partial failure (resume-aware reprice + idempotent refund), and never double-refunds on retry.<br />\n* Fix: admin exchange validates the target variation server-side (same ticket, live non-archived key) before running, with a clear message instead of a raw exception.<br />\n* Fix: fail closed on a shared multi-unit sale line (mirrors the reverse/exchange guards) — prevents a silent mischarge.</p>\n<p><strong>0.2.2</strong><br />\n* Update channel + repository URLs moved to the ee-extensions org. No functional change.</p>\n<p><strong>0.2.1</strong><br />\n* Variation sets per ticket with per-variation inventory, price modifier, and SKU.<br />\n* Oversell-safe atomic stock counter bound to the registration status lifecycle.<br />\n* Auto-generated, decorated selection question with server-side required-selection enforcement.<br />\n* Composed base-plus-modifier pricing as a single combined line item.<br />\n* wp-admin exchange/refund flow and a variation sales report.<br />\n* Optional Front of House \"Sell options\" modal with per-variation quantity steppers.</p>"
  }
}
