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.
Question 1 of 11
01
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!
No spam, ever. We’ll only use this to send you your result and the occasional relevant update.
Your result
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 skippedHubSpot 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.





