{
  "name": "Front of House — Collect for Stripe (Card-Present)",
  "slug": "eea-foh-collect",
  "version": "0.3.3",
  "download_url": "https://gitea.mulligan.casa/ee-extensions/foh-updates/raw/branch/main/eea-foh-collect/eea-foh-collect-0.3.3.zip",
  "homepage": "https://gitea.mulligan.casa/ee-extensions/eea-foh-collect",
  "requires": "6.4",
  "tested": "7.0",
  "requires_php": "8.1",
  "last_updated": "2026-06-27 01:43:33",
  "icons": {
    "1x": "https://gitea.mulligan.casa/ee-extensions/foh-updates/raw/branch/main/eea-foh-collect/icon-128x128.png",
    "2x": "https://gitea.mulligan.casa/ee-extensions/foh-updates/raw/branch/main/eea-foh-collect/icon-256x256.png"
  },
  "author": "Mike Mulligan",
  "author_homepage": "https://gitea.mulligan.casa/mmulligan",
  "tags": [
    "event espresso",
    "front of house",
    "stripe",
    "card present",
    "point of sale",
    "payment method"
  ],
  "sections": {
    "description": "<p>A payment-method provider for <strong>Front of House for Event Espresso</strong>. It registers a \"Credit Card\" method that takes a card-present charge at the point of sale: the station deep-links the sale out to the Collect for Stripe terminal app, the card is charged on the reader, control returns to the station, and the payment is recorded against the Event Espresso transaction.</p>\n<p>Key points:</p>\n<ul>\n<li><strong>Card-present, not online checkout.</strong> Charges happen on a physical Stripe reader at the counter, not through a web payment form.</li>\n<li><strong>Deep-link launch and return.</strong> The method emits a redirect descriptor that opens Collect for Stripe with the sale amount and description, and reads the charge result (status, charge ID, final amount) back from the return.</li>\n<li><strong>Availability aware.</strong> When it can determine that the Stripe Onsite payment method is not active in Event Espresso, the method advertises itself as unavailable so the station disables the button rather than launching a charge that cannot be recorded.</li>\n<li><strong>Off by default.</strong> The card method stays hidden until you enable it in Front of House's Settings ▸ Payment Methods section, so installing the plugin never changes an existing station without an explicit opt-in.</li>\n</ul>\n<p>This plugin extends Front of House for Event Espresso and does nothing on its own — it adds one method to that app's payment picker. It does not bundle or replace any Stripe integration; recording the charge relies on the Stripe Onsite payment method provided by Event Espresso's Stripe add-on.</p>",
    "installation": "<ol>\n<li>Install and activate Event Espresso, its Stripe add-on (with the Stripe Onsite payment method active), and Front of House for Event Espresso.</li>\n<li>Pair a Stripe M2 reader or a Tap-to-Pay capable device with the Collect for Stripe app.</li>\n<li>Upload this plugin to <code>wp-content/plugins/</code> and activate it.</li>\n<li>In Front of House's <strong>Settings ▸ Payment Methods</strong>, enable <strong>Credit Card</strong> (and optionally set a card surcharge).</li>\n</ol>",
    "faq": "<p><strong>What hardware do I need?</strong></p>\n<p>A Stripe M2 reader or a Tap-to-Pay capable device running the Collect for Stripe app, plus the Stripe Onsite payment method active in Event Espresso.</p>\n<p><strong>Does it work without Front of House for Event Espresso?</strong></p>\n<p>No. This plugin only adds a method to that app's station payment picker. It requires both Event Espresso and Front of House for Event Espresso.</p>\n<p><strong>Why is the card button disabled at the station?</strong></p>\n<p>The method marks itself unavailable when the Stripe Onsite payment method is not active in Event Espresso. Activate Stripe Onsite and the button enables.</p>",
    "changelog": "<p><strong>0.3.3</strong><br />\n* Fix (confirmed against a real card return): the return mapping and the Stripe verifier now match Collect's ACTUAL callback. On completion Collect returns <code>status=succeeded&amp;customerId=…&amp;paymentIntentId=pi_…</code> — so the status param is <code>status</code>=<code>succeeded</code> (the 0.3.2 switch to <code>result=success</code> was the regression that made every real charge read as \"declined\"), and the ref is a Stripe PaymentIntent (<code>pi_</code>), not a charge (<code>ch_</code>). The server verifier now retrieves the PaymentIntent (confirms succeeded + USD + amount_received, detects refunds via its charge) and records Stripe's true captured amount. Requires eea-foh 0.23.7+.</p>\n<p><strong>0.3.2</strong><br />\n* Fix: the card-present return mapping now matches Collect's actual callback (<code>result=success</code>), not the never-correct <code>status=succeeded</code>. Previously a successful charge returned to the app as \"declined\" — money taken, payment not recorded. Card sales now record on return. Requires eea-foh with the matching return handler.</p>\n<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.1</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.0</strong><br />\n* The card method is now registered through Front of House's payment-method registry (<code>eea_foh_register_payment_methods</code>), so Front of House owns enabling/disabling card, its button label, and an optional card surcharge in its own Settings ▸ Payment Methods section. This plugin's separate enable toggle has been removed (card enable lives in Front of House now); it keeps owning the Stripe gateway — the deep-link launch/return and the server-side charge verification are unchanged. Requires Front of House 0.21.0+.</p>\n<p><strong>0.1.2</strong><br />\n* Server-side verification: the card result is now confirmed against Stripe (charge retrieved with the merchant key, asserted succeeded/captured/USD/not-refunded) before Front of House records it, and the gateway's true captured amount is recorded — the return URL is no longer trusted. Transient gateway-unreachable failures retry, then surface distinctly so a clerk reconciles rather than re-charges.</p>\n<p><strong>0.1.1</strong><br />\n* Update channel + repository URLs moved to the ee-extensions org. No functional change.</p>\n<p><strong>0.1.0</strong><br />\n* Initial release: card-present \"Credit Card\" payment method that deep-links to the Collect for Stripe app and records the result against the Event Espresso transaction.<br />\n* Off-by-default settings toggle in Front of House settings.<br />\n* Availability check that disables the method when Stripe Onsite is not active.</p>"
  }
}
