=== PosLimitless Booking === Contributors: poslimitless Tags: booking, reservation, escape-game, gift-card, events Requires at least: 5.8 Tested up to: 6.9 Requires PHP: 7.4 Stable tag: 2.5.2 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html Online booking system, client portal, gift cards and events for leisure centers. == Description == PosLimitless Booking integrates PosLimitless booking modules directly into your WordPress site. **Included modules:** * **Booking** — Full booking system with calendar, time slot selection and online payment (Stripe, Monetico, Sogecommerce, CAWL) * **Confirmation** — Summary and payment page with promo codes, gift cards and options * **Client Portal** — Secure client portal with booking history, gift cards and photos * **Gift Card** — Online gift card purchase with customization and live preview * **Events** — Display public center events with registration **Features:** * 5 visual styles per module (Classic, Grid, Glassmorphism, Immersive, Dashboard) * Full customization of colors, fonts and effects * 6 pre-configured color packs * Live preview in the WordPress admin * Dark mode / light mode * Mobile responsive * Secure multi-gateway payment == Installation == 1. Upload the `poslimitless-booking` folder to `/wp-content/plugins/` 2. Activate the plugin in the Plugins menu 3. Go to PosLimitless > Configuration 4. Enter your Center ID and API Key (available in POS Limitless > API Keys) 5. Insert shortcodes into your pages == Shortcodes == * `[poslimitless_booking]` — Booking module * `[poslimitless_espace_client]` — Client portal * `[poslimitless_bon_cadeau]` — Gift cards * `[poslimitless_verif_bon_cadeau]` — Gift card balance check * `[poslimitless_event]` — Events == Frequently Asked Questions == = Where can I find my Center ID and API Key? = Log in to POS Limitless (poslimitless.web.app), go to Configuration > API Keys. You will find your Center ID there and can generate your API Key. = How do I customize the appearance? = Each module has its own appearance page in the PosLimitless menu. You can choose from 5 visual styles and customize all colors. = Which payment methods are supported? = Stripe, Monetico, Sogecommerce and CAWL. Configuration is done in POS Limitless. == Changelog == = 2.5.2 = * Fix: variable-priced services now display the correct total when the customer uses the "extra players" option to exceed the maxPeople defined in the pricing grid. Previously the widget looked up `mapPriceByNb[nbPeople]` directly, and when no entry existed for that exact count (e.g. mapping defined for 2→6 players but client picks 7 or 8), the unit price fell back to 0 €, so the total and deposit both showed 0,00 €. The widget now falls back to the highest defined key in the mapping, so 7 players on a 2→6 grid is billed as 7 × price(6). = 2.5.1 = * Fix: paid traffic attribution. Visitors arriving with only a click-ID (`gclid`, `fbclid`, `ttclid`) and no `utm_source` were previously bucketed as "Direct" in the Acquisition report, even though they clearly came from a paid ad. The tracking loader now mirrors GA4's default behavior: when no explicit UTM is present but a `gclid` / `fbclid` / `ttclid` is, the source is inferred (`google/cpc`, `facebook/paid`, `tiktok/paid`). This restores accurate attribution for advertisers who have not configured a Google Ads tracking template or are running Performance Max (which never propagates UTM params). * Added: `ttclid` and `fbclid` are now persisted in localStorage like `gclid`, enabling future server-side Conversion API (Meta CAPI / TikTok Events API) deduplication. = 2.5.0 = * Fix: Google Ads / Meta / TikTok purchase conversion events are now correctly fired on the booking widget after returning from the payment provider. Previously the widget always mounted at "booking" step on return, never rendering the success page — so no `purchase` event was pushed to the dataLayer and no conversion was sent. The widget now detects success URL params (`session_id` for Stripe, `ref` for CAWL/Monetico/Sogecommerce) and switches to the success step on mount. * Fix: gift card purchases now fire the same set of conversion events (dataLayer purchase + conversion, Google Ads gtag conversion, GA4 purchase, Meta Pixel Purchase, TikTok CompletePayment) that the booking flow already had. Previously the gift card success state showed a "Bon cadeau acheté !" message but did not push any tracking. Conversion data (amount, currency, transaction ID, client info for Enhanced Conversions) is stored before redirecting to the payment provider and replayed on return. * New: gift card success page now redirects to a configurable "thank you" page (`sitewebmercibon` field on the center, falls back to `sitewebmerci` if empty), aligned with the existing booking flow. The redirect waits for Meta / TikTok / Google Ads pixel network requests to actually fire (PerformanceObserver, 5s safety timeout) before navigating away, so pixel/server deduplication is preserved. = 2.4.9 = * Fix: tracking loader is now served as an external static JS file (`assets/tracking-loader.js`) instead of inline. Pixel IDs are passed via `data-*` attributes on the `