{"id":321319,"date":"2026-06-08T08:02:14","date_gmt":"2026-06-08T08:02:14","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/class-bookings-with-stripe\/"},"modified":"2026-06-09T17:27:42","modified_gmt":"2026-06-09T17:27:42","slug":"class-bookings-with-stripe","status":"publish","type":"plugin","link":"https:\/\/cn.wordpress.org\/plugins\/class-bookings-with-stripe\/","author":21104478,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Class Bookings with Stripe","header_author":"IORoot.com","header_description":"Class Bookings with Stripe \u2014 Stripe Checkout for classes. ACF-driven class types, capacity-aware date dropdowns, customer + admin emails, Elementor widget and shortcode.","assets_banners_color":"6f9d94","last_updated":"2026-06-09 17:27:42","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/ioroot.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":59,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"lonetraceur1","date":"2026-06-09 07:56:07"},"1.0.1":{"tag":"1.0.1","author":"lonetraceur1","date":"2026-06-09 17:27:42"}},"upgrade_notice":{"1.0.1":"<p>Improved class edit screen layout and schedule type controls.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3564367,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3564367,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Booking form on the front end.","2":"Class Bookings with Stripe settings.","3":"Reports dashboard."}},"plugin_section":[],"plugin_tags":[269,3148,6978,76538,5349],"plugin_category":[40,45],"plugin_contributors":[266153],"plugin_business_model":[],"class_list":["post-321319","plugin","type-plugin","status-publish","hentry","plugin_tags-booking","plugin_tags-checkout","plugin_tags-classes","plugin_tags-elementor","plugin_tags-stripe","plugin_category-calendar-and-events","plugin_category-ecommerce","plugin_contributors-lonetraceur1","plugin_committers-lonetraceur1"],"banners":{"banner":"https:\/\/ps.w.org\/class-bookings-with-stripe\/assets\/banner-772x250.png?rev=3564367","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/class-bookings-with-stripe\/assets\/icon-128x128.gif?rev=3564367","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>https:\/\/www.youtube.com\/watch?v=8B6TxXcDt2E<\/p>\n\n<p><strong>Class Bookings with Stripe<\/strong> helps studios, instructors, and venues sell places on scheduled classes using <strong>Stripe Checkout<\/strong> (Stripe\u2019s hosted payment page). Customers pick a date, choose seats, and pay securely without WooCommerce or a custom cart.<\/p>\n\n<p>The plugin uses <strong>Advanced Custom Fields (ACF) Free<\/strong> (built in). Each bookable class has schedule, price, capacity, and optional extras. Embed the form with a shortcode or Elementor widget. When a customer clicks <strong>Book &amp; pay with Stripe<\/strong>, the plugin creates a soft-hold, opens a Stripe Checkout Session, and redirects to Stripe. A signed webhook marks the booking paid and can send customer and admin emails.<\/p>\n\n<h4>Video tutorials \u2014 get started<\/h4>\n\n<p><strong>New to the plugin?<\/strong> Watch these first:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/youtu.be\/8B6TxXcDt2E\">Quick start: install, API keys &amp; first booking<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/7HBBGPZfZL0\">Full installation &amp; setup guide<\/a><\/li>\n<\/ul>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Classes<\/strong> \u2014 Weekly recurring classes, one-off events, or external booking links.<\/li>\n<li><strong>Capacity<\/strong> \u2014 Per class and date; counts paid bookings and active soft-holds.<\/li>\n<li><strong>Cancelled dates<\/strong> \u2014 Block individual dates without disabling the class.<\/li>\n<li><strong>Bookings<\/strong> \u2014 Pending, paid, and expired statuses with Stripe session references.<\/li>\n<li><strong>Reports<\/strong> \u2014 Yearly charts, upcoming attendance, and guest lists.<\/li>\n<li><strong>Form extras<\/strong> \u2014 Waiver, Mailchimp opt-in, and custom ACF fields.<\/li>\n<li><strong>Emails<\/strong> \u2014 Customer and admin templates with merge tags via <code>wp_mail()<\/code>.<\/li>\n<li><strong>Result pages<\/strong> \u2014 Booking Confirmed, Cancelled, and Error pages on activation.<\/li>\n<\/ul>\n\n<h4>Stripe Checkout<\/h4>\n\n<p>The plugin uses the bundled <strong>stripe-php<\/strong> SDK. It does not embed card fields on your site. Checkout Sessions use inline <code>price_data<\/code> (GBP), session metadata, and a 30-minute soft-hold aligned with session expiry. Configure webhooks for <code>checkout.session.completed<\/code>, <code>checkout.session.expired<\/code>, and <code>checkout.session.async_payment_failed<\/code>.<\/p>\n\n<h4>Shortcodes<\/h4>\n\n<ul>\n<li><code>[clasbowi_booking class_id=\"123\"]<\/code><\/li>\n<li><code>[clasbowi_booking_status type=\"success\"]<\/code> (or <code>cancelled<\/code>, <code>error<\/code>)<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.0+<\/li>\n<li>Stripe account (keys and webhook signing secret)<\/li>\n<li>ACF Free or Pro (bundled ACF Free loads if ACF is not active)<\/li>\n<li>Elementor (optional, for the Elementor widget)<\/li>\n<\/ul>\n\n<h4>Video tutorials \u2014 full series<\/h4>\n\n<p>Step-by-step guides on YouTube (IORoot):<\/p>\n\n<ul>\n<li><a href=\"https:\/\/youtu.be\/8B6TxXcDt2E\">Quick start: install, API keys &amp; first booking<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/7HBBGPZfZL0\">Full installation &amp; setup guide<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/54MQBsW8qWA\">Stripe webhook setup<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/8mMCkKxIH-s\">Result pages, Developer &amp; Help tabs<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/k5dlDzCyvoA\">Creating a weekly repeating class<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/gzN3yzXWajo\">One-off events &amp; workshops<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/BivPyMuCGbQ\">Extra fields &amp; ACF on the booking form<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/dqg_DweIVAo\">Email setup<\/a><\/li>\n<li><a href=\"https:\/\/youtu.be\/D2UpGlkhJWs\">Bookings list &amp; reports<\/a><\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to third-party services to process payments and, optionally, add customers to a mailing list. You must configure your own accounts and API keys for these services in <strong>Class Bookings with Stripe \u2192 Settings<\/strong>.<\/p>\n\n<h4>Stripe<\/h4>\n\n<p>This plugin uses <a href=\"https:\/\/stripe.com\/\">Stripe<\/a> Checkout to collect payments. Stripe hosts the payment page; card details are entered on Stripe\u2019s site, not in WordPress.<\/p>\n\n<p><strong>When data is sent<\/strong><\/p>\n\n<ul>\n<li>When a customer submits the booking form, your WordPress site calls the Stripe API to create a Checkout Session, then redirects the browser to Stripe\u2019s hosted checkout page.<\/li>\n<li>When payment completes, fails, or the session expires, Stripe sends signed webhook events to your site (<code>\/wp-json\/clasbowi\/v1\/stripe-webhook<\/code>).<\/li>\n<li>If webhooks are delayed, the plugin may call the Stripe API again to retrieve the Checkout Session status when the customer returns to your success page.<\/li>\n<\/ul>\n\n<p><strong>What data is sent<\/strong><\/p>\n\n<ul>\n<li>To Stripe\u2019s API (server-side): your Stripe secret key (authentication), customer name and email, class and booking details (class name, date, time, location, seats, booking ID), line-item title and price (GBP), and success\/cancel return URLs.<\/li>\n<li>On Stripe Checkout (customer-facing): payment and billing details the customer enters on Stripe\u2019s hosted page.<\/li>\n<li>From Stripe to your site (webhooks): event payloads about the Checkout Session and payment status (no card numbers are stored in WordPress).<\/li>\n<\/ul>\n\n<p>This service is provided by Stripe, Inc.: <a href=\"https:\/\/stripe.com\/legal\/ssa\">Terms of Service<\/a>, <a href=\"https:\/\/stripe.com\/privacy\">Privacy Policy<\/a>.<\/p>\n\n<h4>Mailchimp<\/h4>\n\n<p>If enabled in plugin settings, this plugin can subscribe customers to a Mailchimp audience when they opt in on the booking form.<\/p>\n\n<p><strong>When data is sent<\/strong><\/p>\n\n<ul>\n<li>After a booking is marked paid (via Stripe webhook), and only when all of the following are true: Mailchimp opt-in is enabled in settings, you have saved a Mailchimp API key and Audience ID, the customer checked the opt-in box on the form, and the booking has not already been synced.<\/li>\n<\/ul>\n\n<p><strong>What data is sent<\/strong><\/p>\n\n<ul>\n<li>To the Mailchimp Marketing API: the customer\u2019s email address, first name, last name (parsed from the booking name), and subscription status (<code>pending<\/code> if double opt-in is enabled, otherwise <code>subscribed<\/code>). Your Mailchimp API key is sent in the request for authentication.<\/li>\n<\/ul>\n\n<p>This service is provided by Intuit Mailchimp: <a href=\"https:\/\/mailchimp.com\/legal\/terms\/\">Terms of Use<\/a>, <a href=\"https:\/\/mailchimp.com\/legal\/privacy\/\">Privacy Policy<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code> or install via <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Activate <strong>Class Bookings with Stripe<\/strong>.<\/li>\n<li>Open <strong>Class Bookings with Stripe \u2192 Settings<\/strong> in the admin menu.<\/li>\n<li>Enter Stripe publishable and secret keys (test or live).<\/li>\n<li>In Stripe Dashboard \u2192 <strong>Developers \u2192 Webhooks<\/strong>, add an endpoint: <code>https:\/\/yoursite.com\/wp-json\/clasbowi\/v1\/stripe-webhook<\/code> with events <code>checkout.session.completed<\/code>, <code>checkout.session.expired<\/code>, and <code>checkout.session.async_payment_failed<\/code>.<\/li>\n<li>Paste the webhook signing secret into plugin settings.<\/li>\n<li>Add classes under <strong>Class Bookings with Stripe \u2192 Classes<\/strong>.<\/li>\n<li>Place <code>[clasbowi_booking class_id=\"123\"]<\/code> on a page or add the <strong>Class Booking with Stripe<\/strong> Elementor widget.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20store%20credit%20card%20numbers%3F\"><h3>Does this plugin store credit card numbers?<\/h3><\/dt>\n<dd><p>No. Card data is handled on Stripe Checkout. WordPress stores booking metadata only.<\/p><\/dd>\n<dt id=\"do%20i%20need%20woocommerce%3F\"><h3>Do I need WooCommerce?<\/h3><\/dt>\n<dd><p>No.<\/p><\/dd>\n<dt id=\"do%20i%20need%20acf%20pro%3F\"><h3>Do I need ACF Pro?<\/h3><\/dt>\n<dd><p>No. ACF Free or Pro works; bundled ACF Free loads if ACF is not already active.<\/p><\/dd>\n<dt id=\"do%20i%20need%20stripe%20products%3F\"><h3>Do I need Stripe Products?<\/h3><\/dt>\n<dd><p>No. Checkout uses inline <code>price_data<\/code> from each class price.<\/p><\/dd>\n<dt id=\"which%20webhook%20events%20are%20required%3F\"><h3>Which webhook events are required?<\/h3><\/dt>\n<dd><p>checkout.session.completed, <code>checkout.session.expired<\/code>, and <code>checkout.session.async_payment_failed<\/code>.<\/p><\/dd>\n<dt id=\"how%20long%20is%20a%20seat%20held%3F\"><h3>How long is a seat held?<\/h3><\/dt>\n<dd><p>30 minutes, matching the Checkout Session expiry. Stale holds are cleared by webhook and cron.<\/p><\/dd>\n<dt id=\"which%20currency%20is%20supported%3F\"><h3>Which currency is supported?<\/h3><\/dt>\n<dd><p>GBP (pence) by default.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20elementor%3F\"><h3>Does it work with Elementor?<\/h3><\/dt>\n<dd><p>Yes. Use the <strong>Class Booking with Stripe<\/strong> widget or the shortcode.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Class edit screen: external booking is now a schedule type option (Weekly class \/ One-off event \/ External link) instead of a separate toggle.<\/li>\n<li>Class edit screen: schedule type and active switch share one row (75% \/ 25% width).<\/li>\n<li>Class edit screen: reorganised field rows for weekly classes and one-off events into compact four-column layouts.<\/li>\n<li>Class edit screen: fixed schedule type button group styling so middle buttons no longer have rounded corners.<\/li>\n<li>Legacy external-link classes continue to load and save correctly.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>Class and booking custom post types with ACF-driven fields.<\/li>\n<li>Stripe Checkout Sessions via bundled stripe-php SDK.<\/li>\n<li>REST checkout, signed webhooks, status polling, and availability API.<\/li>\n<li>Soft-holds, capacity limits, and cron expiry.<\/li>\n<li>Shortcodes, Elementor widget, result pages, and email templates.<\/li>\n<li>Reports, waiver, Mailchimp opt-in, and custom form fields.<\/li>\n<li>Bundled ACF Free when ACF is not active.<\/li>\n<\/ul>","raw_excerpt":"Stripe Checkout booking for classes: capacity-aware dates, soft holds, webhooks, emails, reports, Elementor widget, and shortcode.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/321319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=321319"}],"author":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lonetraceur1"}],"wp:attachment":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=321319"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=321319"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=321319"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=321319"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=321319"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=321319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}