COMPARE

Compare Bokun to Rezgo

  

overlay

COMPARE BOKUN

Your Best Alternative to Bokun

At Rezgo, we value our independence. It allows us to offer our clients more choice, and lets us work with experience providers to create tools they can really use.

As part of TripAdvisor, Bokun can leave users feeling like they’re being pushed into the TripAdvisor ecosystem, with an obligation to distribute through Viator, TripAdvisor’s OTA. We offer connections with many OTAs—including Viator—so you can distribute your inventory wherever you want, and manage it all in one place. It’s always your choice.

Bokun also requires a monthly subscription. Monthly rates can seem like a deal, but when you’re off season, still setting up, or coping with economic downturns, a monthly bill can easily turn into a burden. Plus, with Bokun’s booking fee on top of that monthly rate, you can still be surprised by unexpected expenses. With Rezgo, you only pay when you’re taking bookings and you can pass those fees to your customers. You’re always completely in control of your costs.

Loading quiz…

FIND OUT

Is Your Booking Software
Holding You Back?

Answer 11 quick questions to find out how your current setup stacks up — and where you might be losing time, bookings, and money.

3 minutes 11 questions

Question 1 of 11

01

Scoring your responses…
Finding your biggest bottlenecks…
Building your personalized report…

Almost there

Enter your email
to see the results

Enter your details below and we’ll show you your result right away — no waiting. Let’s see if it’s time for you to switch!

Please enter a valid email address.

No spam, ever. We’ll only use this to send you your result and the occasional relevant update.

Your result

 

MORE CHOICE + MORE CONTROL

4 Reasons Rezgo Is Better Than The Competition

slide

Pricing

Many systems charge your customers a 6% fee, some charge a monthly subscription. Rezgo charges a 0.9% fee for point-of-sale bookings (+4% for web bookings) and we give you the choice to pass the fee on to your customers or absorb it yourself. How much you actually pay is totally up to you.

slide

Customization

Rezgo offers the widest range of customization options available. You can add a simple widget, like the competition, use a customized WordPress plugin, or use our pre-built source code and develop your own fully customized interface.

slide

Payments

With the competition, you have to use their payment system at their rates. That can mean waiting for payouts, wondering where your money is, and customer service challenges. Rezgo integrates with a number of leading global payment gateways so you can choose the option best for you and get paid directly.

slide

Independently Owned

Unlike our competitors, some of whom are wholly owned by online travel agencies like Booking.com or TripAdvisor, we are independently owned. This means we always have your best interests in mind. We will never compete with you and we will always protect your privacy and confidentiality.

Highly Rated and Trusted

 

TESTIMONIALS

What Our Customers Have To Say

slide

“Game Changer

Rezgo’s booking systems have been a gamechanger for productivity and efficiency in the booking process for Atlantic Scuba Adventures. One of the biggest problems we struggled with prior to Rezgo was not being able to find a booking system that could reflect the variety of experiences an instructor could offer without risking a double booking.”

Atlantic Scuba Adventures

Read the Full Story >

slide

“Very Impressed

Before Rezgo, our booking system was very basic and not as user friendly as Rezgo. Customers had many problems attempting to book in, but with Rezgo this process has been streamlined. After viewing the Rezgo demo we were very impressed with the easy flow, layout and functions.”

Zipit Forest Adventures

Read the Full Story >

slide

“The Perfect Solution

Rezgo offered the perfect solution at a low cost and flexible enough for us to work with! The onboarding process was smooth and customer service is always responsive and helpful. What we intended to be a band-aid to get us through a transition year has been so easy and wonderful to work with we hope to work with this system for many years!”

McKinley Creekside Cabins and Café

slide

“Unique Partner

[Rezgo] quickly found ways to customize the platform to our needs. Their ability to adapt and provide tailored solutions has made them a unique partner to work with. Overall, we are grateful for the partnership we have with Rezgo and for their ongoing commitment to improving our operations.”

Kissimmee Guest Services

Read the Full Story >

slide

“Designed With Tour Operators in Mind

A few months back, we switched from WooCommerce to Rezgo, and it’s been a total game-changer for us. One of the biggest advantages of Rezgo has been its ease of use. The platform effortlessly integrates into our daily operations, simplifying processes that once seemed overwhelming. It’s clear that Rezgo was designed with tour operators like us in mind.”

Atlantic Sea Kayaking

Read the Full Story >

slide

“Greatly Improved Efficiency

In addition to boosting sales figures, Rezgo has also greatly improved efficiency within our company. The automated processes for managing reservations and tracking availability have eliminated double bookings or scheduling conflicts that used to take up much time when relying solely on manual systems. ”

Tofino Water Taxi

Read the Full Story >

COMPARE REZGO

The Tools You Need To Run Your Business

Online Bookings

Get direct bookings from customers who are online and on their phones no matter where or when they book.

Channel Management

Expand your reach by managing OTAs, resellers and other sales channels in one place, with real-time availability.

Point Of Sale

Let customers book events in person or over the phone while you manage their bookings and secure payments with ease.

Management Tools

You get all the tools you need to manage your business better with Rezgo. Inventory, bookings, customers, payments, and more.

Resource Management

Keep your availability accurate in every situation with dynamic management of resources like vehicles, rentals or available staff.

Digital Waivers

Protect your business and keep your guests informed of any risks with a fully-integrated waiver system.

HELPING YOU THRIVE

Support You Can Count On

slide

Dedicated Setup

Our customer success specialists will help you start taking bookings quickly. We offer a one-on-one pre-launch review to help you start strong and boost conversions.

slide

Multiple Support Channels

If you ever have a question or need help, you can reach our experienced support team via phone, live chat or email. We get back to you quickly with expert input during our global office hours.

slide

Comprehensive Knowledgebase

The Rezgo platform has the most complete knowledgebase and online user manual of any tour or activity system. Answers to your questions are just a click or two away.

slide

icon_green_care

Personalized Account Manager

Enjoy tierless support and a dedicated account manager who knows your business personally. You’ll save time and resources with people who understand your use case and your concerns.

FAQ

Any Questions?

  • Does Rezgo offer more flexibility than Bokun?

    Yes. Rezgo gives operators more flexibility and control over their business. Unlike Bokun, which heavily emphasizes distribution through its own network, Rezgo allows you to choose how and where you sell — whether directly on your website, through OTAs, or at your front desk. You also have the freedom to choose your own payment gateway, pass or absorb fees, and customize your booking experience.

  • How do Rezgo and Bokun compare in pricing?

    Bokun’s low entry price often looks appealing at first, but costs quickly add up through commissions, restrictions, and add-ons. Rezgo offers transparent, flexible pricing with no hidden fees. You can pay as you go, with no monthly fees or set up costs, or talk to us about high-volume rates or premium onboarding options. With Rezgo, you always know exactly what you’re paying for, without surprise expenses cutting into your margins.

  • Which platform provides better customer support, Rezgo or Bokun?

    Rezgo is well known for its hands-on, local customer support and dedicated account managers. Bokun, being owned by a large OTA, tends to prioritize scale over personal service — which can leave smaller operators feeling overlooked. With Rezgo, you get fast, personalized support from an in-house team that understands the unique challenges of tour and activity operators and gets to know your business personally.

  • Can Rezgo integrate with the same tools as Bokun?

    Rezgo integrates with a wide range of OTAs, payment gateways, and business tools, giving you similar – and often greater – connectivity compared to Bokun. Plus, Rezgo’s integrations are designed with flexibility in mind, so you’re not locked into one ecosystem. Bokun, on the other hand, is more tightly tied to its parent company’s marketplace, which can limit your choices.

  • Which system is easier to use for managing bookings?

    Rezgo’s interface is designed for simplicity and efficiency. Our clients find it easier to manage inventory, track resources, and process bookings in Rezgo compared to Bokun’s more marketplace-driven approach. With Rezgo, our focus is always on making day-to-day management smoother for you and your staff.

  • Which booking platform is best for small vs large businesses?

    <!– wp:html –>
    <!–
    outcome-quiz-wp-hubspot.html
    ============================================================
    TEST FILE — HubSpot Integration Branch (testing-hubspot-integration)
    Do NOT modify outcome-quiz-wp-center.html — that is the production file.

    Integration architecture:
    1. Quiz submit → Supabase rz_quiz_leads INSERT (unchanged from production)
    2. Supabase DB webhook (INSERT on rz_quiz_leads) fires the Edge Function:
    supabase/functions/sync-to-hubspot/index.ts
    3. Edge Function:
    – Looks up outcome headline from rz_quiz_outcomes (by total_score)
    – Fetches full Q&A from rz_quiz_lead_answers view (by lead UUID)
    – Creates/updates a HubSpot contact (firstname, lastname, email,
    quiz_outcome, quiz_score custom properties)
    – Attaches a HubSpot note with the full Q&A breakdown
    (mirrors the rz_quiz_lead_answers view data in HubSpot)
    4. No email → Supabase only, HubSpot skipped

    HubSpot setup required before this works:
    – Private App with scopes (only these two are visible in the Private App UI):
    crm.objects.contacts.read
    crm.objects.contacts.write
    (notes write + associations are covered by contacts.write for Private Apps)
    – Custom contact properties: quiz_outcome (text), quiz_score (number)
    – Supabase secret: HUBSPOT_API_KEY=pat-na1-…
    – Supabase DB webhook: INSERT on rz_quiz_leads → sync-to-hubspot function
    ============================================================
    –>
    <style>
    @font-face {
    font-family: ‘TT Norms Pro’;
    src: url(‘fonts/TT_Norms_Pro_Light.woff2’) format(‘woff2’);
    font-weight: 300;
    font-style: normal;
    font-display: swap;
    }
    @font-face {
    font-family: ‘TT Norms Pro’;
    src: url(‘fonts/TT_Norms_Pro_Regular.woff2’) format(‘woff2’);
    font-weight: 400;
    font-style: normal;
    font-display: swap;
    }
    @font-face {
    font-family: ‘TT Norms Pro’;
    src: url(‘fonts/TT_Norms_Pro_Medium.woff2’) format(‘woff2’);
    font-weight: 500;
    font-style: normal;
    font-display: swap;
    }
    @font-face {
    font-family: ‘TT Norms Pro’;
    src: url(‘fonts/TT_Norms_Pro_Bold.woff2’) format(‘woff2’);
    font-weight: 700;
    font-style: normal;
    font-display: swap;
    }
    @font-face {
    font-family: ‘TT Norms Pro’;
    src: url(‘fonts/TT_Norms_Pro_ExtraBold.woff2’) format(‘woff2’);
    font-weight: 800;
    font-style: normal;
    font-display: swap;
    }

    /* =============================================
    EASY CUSTOMIZATION — edit these variables
    ============================================= */
    .rz-quiz {
    –brand-bg: #F7F4EF; /* page background */
    –brand-surface: #FFFFFF; /* card background */
    –brand-accent: #F47022; /* buttons, highlights */
    –brand-accent-light: #fff0e4;/* selected answer bg */
    –brand-text: #1A1A1A; /* main text */
    –brand-muted: #7A7A7A; /* secondary text */
    –brand-border: #E4E0D8; /* borders */
    –brand-result-bg: #FFF5EC; /* result card background */
    –brand-result-text: #1A1A1A; /* result card text */

    –font-display: ‘TT Norms Pro’, system-ui, sans-serif;
    –font-body: ‘TT Norms Pro’, system-ui, sans-serif;

    –radius: 12px;
    –max-width: 1024px;

    box-sizing: border-box;
    font-family: var(–font-body);
    color: var(–brand-text);
    background-color: var(–brand-surface);
    border: 1px solid var(–brand-border);
    border-radius: 16px;
    width: 100%;
    max-width: var(–max-width);
    padding: 40px;
    margin: 0 auto;
    overflow: visible;
    position: relative;
    }

    /* No outer border on result screen — the orange card is the visual container */
    .rz-quiz:has(#screen-result.active) {
    border-color: transparent;
    }

    .rz-quiz *, .rz-quiz *::before, .rz-quiz *::after { box-sizing: border-box; }

    /* —- SCREENS —- */
    .rz-quiz .screen { display: none; }
    .rz-quiz .screen.active { display: block; animation: rzFadeUp 0.4s ease both; }

    /* Quiz screen: fixed height so Back/Continue buttons never move on desktop */
    #screen-quiz.active {
    height: auto;
    display: flex;
    flex-direction: column;
    }
    #screen-quiz .nav-row { margin-top: auto; }

    #screen-analysis.active {
    height: 478px;
    display: flex;
    align-items: center;
    justify-content: center;
    }

    @keyframes rzFadeUp {
    from { opacity: 0; transform: translateY(16px); }
    to { opacity: 1; transform: translateY(0); }
    }

    @keyframes rzFadeUpDeep {
    from { opacity: 0; transform: translateY(28px); }
    to { opacity: 1; transform: translateY(0); }
    }

    #screen-capture.active {
    animation: rzFadeUpDeep 0.7s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
    }

    /* —- ANALYSIS SCREEN —- */
    .rz-quiz .analysis-wrap {
    display: flex;
    flex-direction: column;
    width: fit-content;
    }

    .rz-quiz .analysis-step {
    display: flex;
    align-items: left;
    gap: 16px;
    padding: 16px 0;
    border-bottom: 1px solid var(–brand-border);
    opacity: 0;
    transform: translateY(10px);
    transition: opacity 0.45s ease, transform 0.45s ease;
    }
    .rz-quiz .analysis-step:first-child { border-top: 1px solid var(–brand-border); }
    .rz-quiz .analysis-step.visible { opacity: 1; transform: translateY(0); }

    .rz-quiz .analysis-icon {
    width: 24px;
    height: 24px;
    flex-shrink: 0;
    position: relative;
    }

    .rz-quiz .a-spinner {
    display: block;
    width: 22px;
    height: 22px;
    border: 2.5px solid rgba(244, 112, 34, 0.18);
    border-top-color: var(–brand-accent);
    border-radius: 50%;
    animation: rzSpin 0.75s linear infinite;
    position: absolute;
    inset: 0;
    transition: opacity 0.25s ease;
    }

    .rz-quiz .a-check {
    display: block;
    width: 22px;
    height: 22px;
    position: absolute;
    inset: 0;
    opacity: 0;
    transform: scale(0.5);
    transition: opacity 0.3s ease 0.08s, transform 0.4s cubic-bezier(0.34, 1.4, 0.64, 1) 0.08s;
    }

    .rz-quiz .analysis-step.done .a-spinner { opacity: 0; }
    .rz-quiz .analysis-step.done .a-check { opacity: 1; transform: scale(1); }

    .rz-quiz .analysis-label {
    font-size: 15px;
    font-weight: 500;
    color: var(–brand-text);
    transition: color 0.3s ease;
    }
    .rz-quiz .analysis-step.done .analysis-label { color: var(–brand-muted); }

    /* —- LOADING SCREEN —- */
    .rz-quiz .loading-wrap {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 248px;
    gap: 16px;
    }

    .rz-quiz .loading-spinner {
    width: 32px;
    height: 32px;
    border: 3px solid var(–brand-border);
    border-top-color: var(–brand-accent);
    border-radius: 50%;
    animation: rzSpin 0.8s linear infinite;
    }

    @keyframes rzSpin {
    to { transform: rotate(360deg); }
    }

    .rz-quiz .loading-text {
    font-size: 14px;
    color: var(–brand-muted);
    }

    /* —- INTRO SCREEN —- */
    #rz-quiz .intro-eyebrow {
    font-family: var(–font-body);
    font-size: 16px;
    font-weight: 300;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(–brand-accent);
    margin-top: 0 !important;
    margin-bottom: 8px !important;
    }

    #rz-quiz .intro-title {
    font-family: var(–font-display);
    font-weight: 700;
    font-size: clamp(2rem, 5vw, 3rem);
    line-height: 1.15;
    color: var(–brand-text);
    margin-top: 0 !important;
    padding-top: 0 !important;
    margin-bottom: 20px !important;
    }

    .rz-quiz .intro-title em {
    font-style: italic;
    color: var(–brand-accent);
    }

    #rz-quiz .intro-desc {
    font-size: 16px;
    line-height: 1.7;
    color: var(–brand-muted);
    margin-bottom: 36px !important;
    max-width: 520px;
    }

    .rz-quiz .intro-meta {
    display: flex;
    gap: 24px;
    margin-bottom: 40px;
    }

    .rz-quiz .intro-meta-item {
    font-size: 13px;
    color: var(–brand-muted);
    display: flex;
    align-items: center;
    gap: 6px;
    }

    .rz-quiz .intro-meta-item svg { opacity: 0.5; }

    /* —- PROGRESS —- */
    .rz-quiz .progress-bar-wrap {
    background: var(–brand-border);
    border-radius: 999px;
    height: 3px;
    margin-bottom: 20px;
    overflow: hidden;
    }

    .rz-quiz .progress-bar-fill {
    background: var(–brand-accent);
    height: 100%;
    border-radius: 999px;
    transition: width 0.4s ease;
    }

    .rz-quiz .progress-label {
    font-size: 12px;
    color: var(–brand-muted);
    margin-bottom: 8px;
    letter-spacing: 0.05em;
    }

    /* —- QUESTION SCREEN —- */
    .rz-quiz .question-number {
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(–brand-accent);
    margin-top: 0 !important;
    margin-bottom: 8px !important;
    }

    #rz-quiz .question-text {
    font-family: var(–font-display);
    font-weight: 700;
    font-size: clamp(1.3rem, 3.5vw, 1.5rem);
    line-height: 1.3;
    color: var(–brand-text);
    margin-top: 0 !important;
    padding-top: 0 !important;
    margin-bottom: 32px !important;
    }

    .rz-quiz .answers-list {
    display: flex;
    flex-direction: column;
    gap: 12px;
    margin-bottom: 36px;
    }

    .rz-quiz .answer-btn {
    background: var(–brand-surface);
    border: 1.5px solid var(–brand-border);
    border-radius: var(–radius);
    padding: 18px 22px;
    text-align: left;
    cursor: pointer;
    font-family: var(–font-body);
    font-size: 16px;
    line-height: 1.55;
    color: var(–brand-text);
    transition: border-color 0.15s, background 0.15s, transform 0.1s;
    position: relative;
    }

    .rz-quiz .answer-btn:hover {
    border-color: var(–brand-accent);
    background: var(–brand-accent-light);
    }

    .rz-quiz .answer-btn.selected {
    border-color: var(–brand-accent);
    background: var(–brand-accent-light);
    padding-right: 44px;
    }

    .rz-quiz .answer-btn.selected::after {
    content: ‘✓’;
    position: absolute;
    right: 18px;
    top: 50%;
    transform: translateY(-50%);
    font-size: 14px;
    color: var(–brand-accent);
    font-weight: 600;
    }

    .rz-quiz .answer-option-key {
    font-weight: 600;
    color: var(–brand-accent);
    margin-right: 6px;
    }

    /* —- NAV —- */
    .rz-quiz .nav-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 12px;
    }

    .rz-quiz .btn {
    font-family: var(–font-body);
    font-size: 14px;
    font-weight: 500;
    padding: 13px 28px;
    border-radius: 999px;
    border: none;
    cursor: pointer;
    transition: opacity 0.15s, transform 0.1s;
    }

    .rz-quiz .btn:active { transform: scale(0.97); }

    .rz-quiz .btn-primary {
    background: var(–brand-accent);
    color: #fff;
    }

    .rz-quiz .btn-primary:hover { opacity: 0.88; }
    .rz-quiz .btn-primary:disabled { opacity: 0.35; cursor: not-allowed; }

    .rz-quiz .btn-ghost {
    background: transparent;
    color: var(–brand-muted);
    padding: 13px 12px;
    }

    .rz-quiz .btn-ghost:hover { color: var(–brand-text); }

    /* —- RESULT SCREEN —- */
    .rz-quiz .result-tag {
    display: inline-block;
    font-size: 16px;
    font-weight: 300;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(–brand-accent);
    margin-top: 0 !important;
    margin-bottom: 4px !important;
    }

    .rz-quiz .result-card {
    background: var(–brand-result-bg);
    border: none;
    border-radius: var(–radius);
    padding: 40px;
    margin-bottom: 32px;
    }

    #rz-quiz .result-headline {
    font-family: var(–font-display);
    font-weight: 600;
    font-size: 26px !important;
    line-height: 1.3 !important;
    color: var(–brand-accent);
    margin-top: 0 !important;
    margin-bottom: 12px !important;
    display: flex;
    align-items: center;
    gap: 12px;
    }
    #rz-quiz .result-headline svg,
    #rz-quiz .result-headline img {
    display: block;
    flex-shrink: 0;
    align-self: center;
    width: 36px;
    height: 36px;
    }

    #rz-quiz .result-headline-sub {
    font-family: var(–font-display);
    font-size: clamp(1.8rem, 5vw, 2.6rem);
    font-style: italic;
    font-weight: 700;
    color: var(–brand-text);
    line-height: 1.15;
    margin-top: 0 !important;
    padding-top: 0 !important;
    margin-bottom: 20px !important;
    }

    .rz-quiz .result-desc {
    font-size: 16px;
    line-height: 1.75;
    color: var(–brand-result-text);
    opacity: 0.85;
    margin-bottom: 28px;
    }

    .rz-quiz .result-ctas {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 12px;
    }

    .rz-quiz .result-cta {
    display: inline-block;
    background: var(–brand-accent);
    color: #fff;
    font-family: var(–font-body);
    font-size: 14px;
    font-weight: 500;
    padding: 13px 28px;
    border-radius: 999px;
    text-decoration: none;
    transition: opacity 0.15s;
    }

    .rz-quiz .result-cta:hover { opacity: 0.85; }

    .rz-quiz .result-cta-secondary {
    display: inline-block;
    background: transparent;
    color: var(–brand-accent);
    font-family: var(–font-body);
    font-size: 14px;
    font-weight: 500;
    padding: 13px 28px;
    border-radius: 999px;
    border: 1.5px solid var(–brand-accent);
    text-decoration: none;
    transition: opacity 0.15s;
    }

    .rz-quiz .result-cta-secondary:hover { opacity: 0.75; }

    .rz-quiz .result-footnote {
    font-size: 16px;
    color: var(–brand-result-text);
    opacity: 0.85;
    line-height: 1.6;
    margin-bottom: 24px;
    }

    .rz-quiz .restart-btn {
    background: none;
    border: none;
    font-family: var(–font-body);
    font-size: 13px;
    color: var(–brand-muted);
    cursor: pointer;
    text-decoration: underline;
    text-underline-offset: 3px;
    padding: 0;
    }

    .rz-quiz .restart-btn:hover { color: var(–brand-text); }

    /* —- EMAIL CAPTURE SCREEN —- */
    #rz-quiz .capture-eyebrow {
    font-size: 16px;
    font-weight: 300;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(–brand-accent);
    margin-top: 0 !important;
    margin-bottom: 8px !important;
    }

    #rz-quiz .capture-title {
    font-family: var(–font-display);
    font-weight: 700;
    font-size: clamp(1.5rem, 4vw, 2.1rem);
    line-height: 1.2;
    color: var(–brand-text);
    margin-top: 0 !important;
    padding-top: 0 !important;
    margin-bottom: 14px !important;
    }

    .rz-quiz .capture-title em {
    font-style: italic;
    color: var(–brand-accent);
    }

    .rz-quiz .capture-desc {
    font-size: 16px;
    line-height: 1.7;
    color: var(–brand-muted);
    margin-bottom: 36px;
    max-width: 480px;
    }

    .rz-quiz .capture-fields {
    display: flex;
    flex-direction: column;
    gap: 14px;
    margin-bottom: 20px;
    }

    .rz-quiz .field-row {
    display: flex;
    gap: 14px;
    }

    .rz-quiz .field-row .capture-input { flex: 1; }

    .rz-quiz .capture-input {
    width: 100%;
    background: var(–brand-surface);
    border: 1.5px solid var(–brand-border);
    border-radius: var(–radius);
    padding: 15px 18px;
    font-family: var(–font-body);
    font-size: 15px;
    color: var(–brand-text);
    outline: none;
    transition: border-color 0.15s;
    }

    .rz-quiz .capture-input::placeholder { color: #B0ADA6; }

    .rz-quiz .capture-input:focus {
    border-color: var(–brand-accent);
    }

    .rz-quiz .capture-submit {
    width: 100%;
    margin-top: 6px;
    }

    .rz-quiz .capture-privacy {
    font-size: 12px;
    color: var(–brand-muted);
    margin-top: 14px;
    line-height: 1.6;
    }

    .rz-quiz .capture-skip {
    background: none;
    border: none;
    font-family: var(–font-body);
    font-size: 13px;
    color: var(–brand-muted);
    cursor: pointer;
    text-decoration: underline;
    text-underline-offset: 3px;
    margin-top: 18px;
    padding: 0;
    display: block;
    }

    .rz-quiz .capture-skip:hover { color: var(–brand-text); }

    .rz-quiz .field-error {
    font-size: 12px;
    color: #C0392B;
    margin-top: -6px;
    display: none;
    }

    .rz-quiz .field-error.visible { display: block; }

    /* =============================================
    RESPONSIVE — Tablet (≤ 768px)
    ============================================= */
    @media (max-width: 768px) {
    .rz-quiz {
    padding: 24px 16px;
    }

    .rz-quiz .result-card {
    padding: 28px;
    }

    .rz-quiz .intro-meta {
    gap: 16px;
    }
    }

    /* =============================================
    RESPONSIVE — Phone (≤ 480px)
    ============================================= */
    @media (max-width: 480px) {
    .rz-quiz {
    padding: 16px 12px;
    margin: 0 8px;
    width: auto;
    }

    .rz-quiz .field-row {
    flex-direction: column;
    }

    .rz-quiz .result-card {
    padding: 24px 20px;
    }

    .rz-quiz .answer-btn {
    padding: 15px 18px;
    font-size: 14px;
    }

    .rz-quiz .answer-btn.selected::after {
    right: 14px;
    }

    .rz-quiz .btn {
    padding: 13px 22px;
    }

    .rz-quiz .nav-row {
    gap: 8px;
    }

    #screen-quiz .nav-row {
    position: fixed;
    bottom: 0;
    left: 8px;
    right: 8px;
    background: var(–brand-surface);
    border-top: 1px solid var(–brand-border);
    padding: 12px 8px 20px;
    z-index: 100;
    }

    #screen-quiz .answers-list {
    padding-bottom: 90px;
    }

    .rz-quiz .btn-ghost {
    padding: 13px 8px;
    flex-shrink: 0;
    }

    .rz-quiz #btn-next {
    flex: 1;
    }

    .rz-quiz .intro-meta {
    flex-direction: column;
    gap: 10px;
    align-items: center;
    }

    .rz-quiz .progress-bar-wrap {
    margin-bottom: 28px;
    }

    #rz-quiz .question-text {
    margin-bottom: 24px !important;
    }

    .rz-quiz .answers-list {
    margin-bottom: 28px;
    }
    }

    /* =============================================
    Touch devices — disable hover slide animation
    ============================================= */
    @media (hover: hover) {
    .rz-quiz .answer-btn:hover {
    transform: translateX(3px);
    }
    }

    /* =============================================
    CENTER ALIGNMENT TEST — SCREENS 1, 3, 4
    Applied only in outcome-quiz-wp-center.html
    ============================================= */

    /* SCREEN 1: INTRO */
    #screen-intro {
    text-align: center;
    }
    #screen-intro .intro-desc {
    margin-left: auto;
    margin-right: auto;
    }
    #screen-intro .intro-meta {
    justify-content: center;
    }
    #screen-intro .btn {
    display: block;
    width: fit-content;
    margin-left: auto;
    margin-right: auto;
    }

    /* SCREEN 3: EMAIL CAPTURE */
    #screen-capture {
    text-align: center;
    }
    #screen-capture .capture-desc {
    margin-left: auto;
    margin-right: auto;
    }
    #screen-capture .capture-fields {
    max-width: 480px;
    margin-left: auto;
    margin-right: auto;
    text-align: left;
    }
    #screen-capture .capture-submit {
    max-width: 480px;
    margin-left: auto;
    margin-right: auto;
    }
    #screen-capture .capture-privacy {
    text-align: center;
    }

    /* SCREEN 4: RESULT */
    #screen-result {
    text-align: center;
    }
    #screen-result .result-tag {
    display: block;
    text-align: center;
    }
    #screen-result .result-card {
    text-align: center;
    }
    #screen-result .result-headline {
    justify-content: center;
    }
    #screen-result .result-ctas {
    justify-content: center;
    }
    #screen-result .restart-btn {
    display: block;
    margin-left: auto;
    margin-right: auto;
    }

    /* MOBILE OVERRIDES for center-alignment screens */
    @media (max-width: 480px) {
    #screen-result .result-headline {
    flex-direction: column;
    align-items: center;
    gap: 8px;
    }
    }
    </style>

    <div class=”rz-quiz” id=”rz-quiz”>

    <!– =============================================
    SCREEN 0: LOADING
    ============================================= –>
    <div class=”screen active” id=”screen-loading”>
    <div class=”loading-wrap”>
    <div class=”loading-spinner”></div>
    <p class=”loading-text” id=”loading-text”>Loading quiz…</p>
    </div>
    </div>

    <!– =============================================
    SCREEN 1: INTRO
    ============================================= –>
    <div class=”screen” id=”screen-intro”>
    <p class=”intro-eyebrow”>FIND OUT</p>
    <h1 class=”intro-title”>Is Your Booking Software<br><em>Holding You Back?</em></h1>
    <p class=”intro-desc”>
    Answer 11 quick questions to find out how your current setup stacks up — and where you might be losing time, bookings, and money.
    </p>
    <div class=”intro-meta”>
    <span class=”intro-meta-item”>
    <svg width=”14″ height=”14″ fill=”none” stroke=”currentColor” stroke-width=”2″ viewBox=”0 0 24 24″><circle cx=”12″ cy=”12″ r=”10″/><path d=”M12 6v6l4 2″/></svg>
    3 minutes
    </span>
    <span class=”intro-meta-item”>
    <svg width=”14″ height=”14″ fill=”none” stroke=”currentColor” stroke-width=”2″ viewBox=”0 0 24 24″><path d=”M9 11l3 3L22 4″/><path d=”M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11″/></svg>
    11 questions
    </span>
    </div>
    <button class=”btn btn-primary” onclick=”startQuiz()”>Start The Quiz →</button>
    </div>

    <!– =============================================
    SCREEN 2: QUESTIONS
    ============================================= –>
    <div class=”screen” id=”screen-quiz”>
    <p class=”progress-label” id=”progress-label”>Question 1 of 11</p>
    <div class=”progress-bar-wrap”>
    <div class=”progress-bar-fill” id=”progress-bar” style=”width:0%”></div>
    </div>

    <p class=”question-number” id=”q-number”>01</p>
    <h2 class=”question-text” id=”q-text”></h2>
    <div class=”answers-list” id=”answers-list”></div>

    <div class=”nav-row”>
    <button class=”btn btn-ghost” id=”btn-back” onclick=”goBack()”>← Back</button>
    <button class=”btn btn-primary” id=”btn-next” onclick=”goNext()” disabled>Continue</button>
    </div>
    </div>

    <!– =============================================
    SCREEN 3: EMAIL CAPTURE
    ============================================= –>
    <div class=”screen” id=”screen-analysis”>
    <div class=”analysis-wrap”>
    <div class=”analysis-step” id=”analysis-step-1″>
    <span class=”analysis-icon”>
    <span class=”a-spinner”></span>
    <svg class=”a-check” viewBox=”0 0 22 22″ fill=”none” xmlns=”http://www.w3.org/2000/svg”>
    <circle cx=”11″ cy=”11″ r=”10″ stroke=”var(–brand-accent)” stroke-width=”2″/>
    <path d=”M6.5 11l3 3 6-6″ stroke=”var(–brand-accent)” stroke-width=”2″ stroke-linecap=”round” stroke-linejoin=”round”/>
    </svg>
    </span>
    <span class=”analysis-label”>Scoring your responses…</span>
    </div>
    <div class=”analysis-step” id=”analysis-step-2″>
    <span class=”analysis-icon”>
    <span class=”a-spinner”></span>
    <svg class=”a-check” viewBox=”0 0 22 22″ fill=”none” xmlns=”http://www.w3.org/2000/svg”>
    <circle cx=”11″ cy=”11″ r=”10″ stroke=”var(–brand-accent)” stroke-width=”2″/>
    <path d=”M6.5 11l3 3 6-6″ stroke=”var(–brand-accent)” stroke-width=”2″ stroke-linecap=”round” stroke-linejoin=”round”/>
    </svg>
    </span>
    <span class=”analysis-label”>Finding your biggest bottlenecks…</span>
    </div>
    <div class=”analysis-step” id=”analysis-step-3″>
    <span class=”analysis-icon”>
    <span class=”a-spinner”></span>
    <svg class=”a-check” viewBox=”0 0 22 22″ fill=”none” xmlns=”http://www.w3.org/2000/svg”>
    <circle cx=”11″ cy=”11″ r=”10″ stroke=”var(–brand-accent)” stroke-width=”2″/>
    <path d=”M6.5 11l3 3 6-6″ stroke=”var(–brand-accent)” stroke-width=”2″ stroke-linecap=”round” stroke-linejoin=”round”/>
    </svg>
    </span>
    <span class=”analysis-label”>Building your personalized report…</span>
    </div>
    </div>
    </div>

    <div class=”screen” id=”screen-capture”>
    <p class=”capture-eyebrow”>Almost there</p>
    <h2 class=”capture-title”>Enter your email<br><em>to see the results</em></h2>
    <p class=”capture-desc”>
    Enter your details below and we’ll show you your result right away — no waiting. Let’s see if it’s time for you to switch!
    </p>
    <div class=”capture-fields”>
    <div class=”field-row”>
    <input class=”capture-input” id=”capture-firstname” type=”text” placeholder=”First name” autocomplete=”given-name” />
    <input class=”capture-input” id=”capture-lastname” type=”text” placeholder=”Last name” autocomplete=”family-name” />
    </div>
    <input class=”capture-input” id=”capture-email” type=”email” placeholder=”Work email address” autocomplete=”email” />
    <span class=”field-error” id=”capture-error”>Please enter a valid email address.</span>
    </div>
    <button class=”btn btn-primary capture-submit” id=”capture-submit” onclick=”submitCapture()”>See My Result →</button>
    <p class=”capture-privacy”>No spam, ever. We’ll only use this to send you your result and the occasional relevant update.</p>
    </div>

    <!– =============================================
    SCREEN 4: RESULT
    ============================================= –>
    <div class=”screen” id=”screen-result”>
    <p class=”result-tag”>Your result</p>
    <div class=”result-card”>
    <h2 class=”result-headline” id=”result-headline”></h2>
    <p class=”result-headline-sub” id=”result-headline-sub”></p>
    <p class=”result-desc” id=”result-desc”></p>
    <p class=”result-footnote” id=”result-footnote”></p>
    <div class=”result-ctas”>
    <a href=”#” id=”result-cta” class=”result-cta”></a>
    <a href=”#” id=”result-cta-secondary” class=”result-cta-secondary”>Try for Free</a>
    </div>
    </div>
    <button class=”restart-btn” onclick=”restartQuiz()”>Start over</button>
    </div>

    </div>

    <script>
    // ============================================================
    // CONFIGURATION — fill these in before deploying
    // Get these from your Supabase project: Settings → API
    // ============================================================
    const SUPABASE_URL = ‘https://jcytkvqpdjxyqspqieef.supabase.co’;
    const SUPABASE_ANON_KEY = ‘eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpjeXRrdnFwZGp4eXFzcHFpZWVmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzMzNDMwMTcsImV4cCI6MjA4ODkxOTAxN30.LDnsLAsw1n8ZcW5I67e-idNZH4pjDFdMpdDFQr_L62k’;
    // The anon key is safe to include here — it is intentionally public.
    // Security is enforced by Row Level Security policies in Supabase, not by key secrecy.
    // NEVER put your service_role key here.

    // ============================================================
    // STATE
    // ============================================================
    let QUESTIONS = []; // [{ id, order_index, text, answers: [{id, option_key, label, score}] }]
    let OUTCOMES = []; // [{id, min_score, max_score, headline, headline_italic, description, cta_text, cta_link, footnote}]

    let currentQ = 0;
    let answers = []; // array of { question_id, answer_id, score } | null — one per question index

    // ============================================================
    // SUPABASE REST HELPERS — no external library required
    // ============================================================
    const SB_REST = SUPABASE_URL + ‘/rest/v1/’;
    const SB_HDR = { ‘apikey’: SUPABASE_ANON_KEY, ‘Authorization’: ‘Bearer ‘ + SUPABASE_ANON_KEY };

    async function sbSelect(table, orderCol) {
    const res = await fetch(SB_REST + table + ‘?select=*&order=’ + orderCol + ‘.asc’, { headers: SB_HDR });
    if (!res.ok) throw new Error(table + ‘ SELECT failed (‘ + res.status + ‘)’);
    return res.json();
    }

    async function sbInsert(table, data) {
    const res = await fetch(SB_REST + table, {
    method: ‘POST’,
    headers: Object.assign({ ‘Content-Type’: ‘application/json’, ‘Prefer’: ‘return=minimal’ }, SB_HDR),
    body: JSON.stringify(data)
    });
    if (!res.ok) throw new Error(table + ‘ INSERT failed (‘ + res.status + ‘)’);
    }

    // ============================================================
    // INIT — loads data from Supabase on page load
    // ============================================================
    async function init() {
    try {
    const [questionsData, answersData, outcomesData] = await Promise.all([
    sbSelect(‘rz_quiz_questions’, ‘order_index’),
    sbSelect(‘rz_quiz_answers’, ‘order_index’),
    sbSelect(‘rz_quiz_outcomes’, ‘min_score’)
    ]);

    // Nest answers under their parent question
    const answersByQuestion = {};
    for (const a of answersData) {
    if (!answersByQuestion[a.question_id]) answersByQuestion[a.question_id] = [];
    answersByQuestion[a.question_id].push(a);
    }

    QUESTIONS = questionsData.map(q => ({
    …q,
    answers: (answersByQuestion[q.id] || []).sort((a, b) => a.order_index – b.order_index)
    }));

    OUTCOMES = outcomesData;
    answers = new Array(QUESTIONS.length).fill(null);

    showScreen(‘screen-intro’);
    } catch(e) {
    document.getElementById(‘loading-text’).textContent = ‘Could not load quiz: ‘ + e.message;
    }
    }

    document.addEventListener(‘DOMContentLoaded’, init);

    // ============================================================
    // QUIZ FLOW
    // ============================================================
    function startQuiz() {
    quizStarted = true;
    currentQ = 0;
    answers = new Array(QUESTIONS.length).fill(null);
    showScreen(‘screen-quiz’);
    renderQuestion();
    }

    function renderQuestion() {
    const q = QUESTIONS[currentQ];
    const total = QUESTIONS.length;

    document.getElementById(‘progress-label’).textContent = `Question ${currentQ + 1} of ${total}`;
    document.getElementById(‘progress-bar’).style.width = `${(currentQ / total) * 100}%`;
    document.getElementById(‘q-number’).textContent = String(currentQ + 1).padStart(2, ‘0’);
    document.getElementById(‘q-text’).textContent = q.text;
    document.getElementById(‘btn-back’).style.visibility = currentQ === 0 ? ‘hidden’ : ‘visible’;

    const list = document.getElementById(‘answers-list’);
    list.innerHTML = ”;

    const selectedAnswerId = answers[currentQ] ? answers[currentQ].answer_id : null;

    q.answers.forEach((a, i) => {
    const btn = document.createElement(‘button’);
    btn.className = ‘answer-btn’ + (a.id === selectedAnswerId ? ‘ selected’ : ”);
    btn.innerHTML = `<span class=”answer-option-key”>${a.option_key}.</span>${a.label}`;
    btn.addEventListener(‘click’, () => selectAnswer(i));
    list.appendChild(btn);
    });

    document.getElementById(‘btn-next’).disabled = answers[currentQ] === null;
    }

    function selectAnswer(i) {
    const q = QUESTIONS[currentQ];
    const a = q.answers[i];
    answers[currentQ] = { question_id: q.id, answer_id: a.id, score: a.score };

    document.querySelectorAll(‘.answer-btn’).forEach((btn, idx) => {
    btn.classList.toggle(‘selected’, idx === i);
    });
    document.getElementById(‘btn-next’).disabled = false;
    }

    function goNext() {
    if (answers[currentQ] === null) return;
    if (currentQ < QUESTIONS.length – 1) {
    currentQ++;
    renderQuestion();
    } else {
    document.getElementById(‘progress-bar’).style.width = ‘95%’;
    runAnalysis();
    }
    }

    function runAnalysis() {
    showScreen(‘screen-analysis’);

    // Reset step states (in case quiz is restarted)
    [1, 2, 3].forEach(function(n) {
    var el = document.getElementById(‘analysis-step-‘ + n);
    el.classList.remove(‘visible’, ‘done’);
    });

    function completeStep(n, callback) {
    var el = document.getElementById(‘analysis-step-‘ + n);
    el.classList.add(‘done’);
    if (callback) setTimeout(callback, 220);
    }

    // Step 1 slides in immediately, completes at 1200ms
    setTimeout(function() {
    document.getElementById(‘analysis-step-1’).classList.add(‘visible’);
    }, 60);

    setTimeout(function() {
    completeStep(1, function() {
    // Step 2 slides in, completes at 2600ms
    document.getElementById(‘analysis-step-2’).classList.add(‘visible’);
    setTimeout(function() {
    completeStep(2, function() {
    // Step 3 slides in, completes at 4000ms
    document.getElementById(‘analysis-step-3’).classList.add(‘visible’);
    setTimeout(function() {
    completeStep(3, function() {
    // Capture screen fades in with deep animation
    setTimeout(function() { showScreen(‘screen-capture’); }, 400);
    });
    }, 1200);
    });
    }, 1200);
    });
    }, 1200);
    }

    function goBack() {
    if (currentQ > 0) {
    currentQ–;
    renderQuestion();
    }
    }

    // ============================================================
    // SCORING
    // ============================================================
    function computeResult() {
    const totalScore = answers.reduce((sum, sel) => sum + (sel ? sel.score : 0), 0);
    const outcome = OUTCOMES.find(o => totalScore >= o.min_score && totalScore <= o.max_score);
    return { totalScore, outcome };
    }

    // ============================================================
    // EMAIL CAPTURE
    // ============================================================
    async function submitCapture() {
    const email = document.getElementById(‘capture-email’).value.trim();
    const firstName = document.getElementById(‘capture-firstname’).value.trim();
    const lastName = document.getElementById(‘capture-lastname’).value.trim();
    const errorEl = document.getElementById(‘capture-error’);

    const emailOk = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
    if (!emailOk) {
    errorEl.classList.add(‘visible’);
    document.getElementById(‘capture-email’).focus();
    return;
    }
    errorEl.classList.remove(‘visible’);

    const submitBtn = document.getElementById(‘capture-submit’);
    submitBtn.disabled = true;
    submitBtn.textContent = ‘Saving…’;

    const { totalScore, outcome } = computeResult();

    await insertLead({ firstName, lastName, email, totalScore, skipped: false });

    showResult(outcome);
    }

    function skipCapture() {
    const { totalScore, outcome } = computeResult();
    insertLead({ firstName: null, lastName: null, email: null, totalScore, skipped: true });
    showResult(outcome);
    }

    async function insertLead({ firstName, lastName, email, totalScore, skipped }) {
    try {
    await sbInsert(‘rz_quiz_leads’, {
    email: email || null,
    first_name: firstName || null,
    last_name: lastName || null,
    total_score: totalScore,
    answer_selections: answers.filter(Boolean),
    skipped_capture: skipped
    });
    } catch(e) {
    console.warn(‘Lead insert failed:’, e.message);
    // Non-fatal — the user still sees their result
    }
    }

    // ============================================================
    // RESULT
    // ============================================================
    var OUTCOME_ICONS = {
    ‘The Danger Zone’: ‘<img src=”https://www.rezgo.com/wp-content/uploads/2026/03/thedangerzone1.png” alt=”” class=”result-icon”>’,
    ‘The Efficiency Engine’: ‘<img src=”https://www.rezgo.com/wp-content/uploads/2026/03/theefficiencyengine1.png” alt=”” class=”result-icon”>’,
    ‘The Leaky Bucket’: ‘<img src=”https://www.rezgo.com/wp-content/uploads/2026/03/theleakingbucket1.png” alt=”” class=”result-icon”>’,
    ‘The Operation Overload’: ‘<img src=”https://www.rezgo.com/wp-content/uploads/2026/03/theoperationoverload1.png” alt=”” class=”result-icon”>’,
    };

    function showResult(outcome) {
    if (!outcome) {
    outcome = OUTCOMES[OUTCOMES.length – 1];
    }

    var icon = OUTCOME_ICONS[outcome.headline] || ”;
    document.getElementById(‘result-headline’).innerHTML = icon + outcome.headline;
    document.getElementById(‘result-headline-sub’).textContent = outcome.headline_italic;
    document.getElementById(‘result-desc’).textContent = outcome.description;
    document.getElementById(‘result-cta’).textContent = outcome.cta_text;
    document.getElementById(‘result-cta’).href = outcome.cta_link;
    document.getElementById(‘result-cta-secondary’).textContent = outcome.cta_secondary_text;
    document.getElementById(‘result-cta-secondary’).href = outcome.cta_secondary_link;
    document.getElementById(‘result-footnote’).textContent = outcome.footnote;

    document.getElementById(‘progress-bar’).style.width = ‘100%’;
    showScreen(‘screen-result’);
    }

    function restartQuiz() {
    answers = new Array(QUESTIONS.length).fill(null);
    currentQ = 0;

    document.getElementById(‘capture-firstname’).value = ”;
    document.getElementById(‘capture-lastname’).value = ”;
    document.getElementById(‘capture-email’).value = ”;
    document.getElementById(‘capture-error’).classList.remove(‘visible’);
    const submitBtn = document.getElementById(‘capture-submit’);
    submitBtn.disabled = false;
    submitBtn.textContent = ‘See My Result →’;

    showScreen(‘screen-intro’);
    }

    // ============================================================
    // SCREEN TRANSITIONS
    // ============================================================
    let quizStarted = false;

    new ResizeObserver(() => {
    if (quizStarted) {
    document.getElementById(‘rz-quiz’).scrollIntoView({ behavior: ‘smooth’, block: ‘nearest’ });
    }
    }).observe(document.getElementById(‘rz-quiz’));

    function showScreen(id) {
    document.querySelectorAll(‘.screen’).forEach(s => s.classList.remove(‘active’));
    document.getElementById(id).classList.add(‘active’);
    }
    </script>
    <!– /wp:html –>

    Rezgo works exceptionally well for established medium to large businesses who know what they want in a booking system, and scales easily to meet the complex needs of enterprise clients. Bokun can be attractive to smaller operators who want the added reach of its marketplace, but can feel restrictive for any business that wants to control its own distribution and work with other partners. Even small businesses love Rezgo for its price and well-supported features. Rezgo strikes the balance: powerful enough for enterprise-level needs, yet easy and affordable for operators of any size.