Web Apps

How Tourly Reduced Trial Churn by Guiding Users Through Their First Session

A self-built onboarding walkthrough SaaS that increased user activation and delivered analytics most tools charge enterprise prices for - at ₹99/month.

Client: Tourly Type: SaaS Product - Full Stack Build Published: July 2026
7 min Average setup time From signup to first live walkthrough
1 tag Embed complexity A single <script> tag on any website
4-tier Pricing range ₹99 to ₹3,999/mo - Solo to Enterprise
2 Payment gateways Razorpay (INR) + Stripe (USD) globally

The challenge

⚠ Problem

Most onboarding tools on the market fall into two camps: free open-source libraries with zero analytics, or enterprise platforms costing $200–$500/month with vendor lock-in. Teams building small-to-medium SaaS products had no middle ground - a tool that was affordable, self-contained, and actually showed them where users were dropping off. Beyond pricing, the technical problem was also unsolved: existing libraries require manual integration per page, break on complex layouts, and offer no insight into what happens after the tour starts.

✓ Approach

We built Tourly from scratch as a fully owned SaaS platform. The core architecture separates configuration from delivery — users define walkthroughs in a dashboard, and the system generates a static JavaScript file per script. This file is served directly as a static asset with zero PHP overhead per load. A built-in trace system records every tour event server-side using sendBeacon, giving product teams step-level analytics without any third-party dependency. Dual-currency billing (Razorpay for India, Stripe for international) was added so the product could serve a global audience from day one.

Background

Tourly started as an internal tool built by ibarts to solve a recurring client problem: new users signing up for web applications and churning within the first session — not because the product was bad, but because they never found their way to its core value.

The brief was simple: build something that any developer could embed in two minutes, that any product manager could configure without writing code, and that gave real visibility into whether the onboarding was actually working.

What began as a single-feature experiment — a tooltip engine and an embed tag — grew into a full SaaS product with billing, analytics, domain security, multi-page tour support, and a global payment layer. The entire product was built on Laravel 13 and deployed to shared hosting, proving that SaaS-grade infrastructure doesn’t require a cloud platform or a DevOps team.

Tourly launched publicly at tourly.bugsmonkey.com with a 7-day free trial and four paid plans starting at ₹99/month.

We built the analytics layer we always wished existed - not just "did the tour run" but "at which step did they leave, and why."

— Bugs Monkey

What we built

The Walk.js core engine is a self-contained JavaScript tooltip library with SVG spotlight overlays, smart viewport positioning (auto-fallback across bottom, top, right, left, and centered modal), keyboard navigation, dot navigation, and a progress bar. It’s generated as a static file per customer script — meaning it loads as a direct asset, not through a PHP framework on every request.

The multi-page tour system uses localStorage as a coordination layer. Each step can declare a target URL. When a user completes the last step on the current page, the system saves the next step index to localStorage and shows a contextual “continue on next page” prompt with a direct link. When the user arrives on the target page, the tour resumes automatically — no server round-trip, no session dependency.

The trace analytics system records six event types per tour: load, start, step view, complete, skip, and exit. All events are sent via navigator.sendBeacon (with fetch fallback) to a single public endpoint. Domain allowlisting means any unauthorized embed is silently recorded and flagged in the admin Alerts panel rather than throwing an error to the end user.

Billing uses IP geolocation to detect the visitor’s country and presents INR pricing with Razorpay checkout for Indian users, and USD pricing with Stripe Checkout for everyone else. Both gateways use server-side signature verification. Every transaction is recorded with an auto-generated invoice number, and all plan changes are tracked in a plan history table — subscribe, upgrade, downgrade, cancel, and admin-assign events are all logged with timestamps.

Project timeline

01
Core engine
Week 1

Built the Walk.js tooltip library with SVG spotlight, smart positioning, keyboard nav, dot nav, and progress bar

walk-core.js - self-contained tooltip engine
02
Script generator
Week 1–2

Built ScriptGeneratorService - generates static .js files per customer with baked-in colour scheme and step config

Static file generation pipeline
03
Dashboard & auth
Week 2

Laravel auth, script CRUD, ACF-style step builder UI with colour presets and live preview

Admin dashboard with script builder
04
Trace analytics
Week 2–3

Built trace table, beacon endpoint, admin trace log, alerts for unauthorized domains

Analytics pipeline + admin log
05
Billing (Razorpay)
Week 3

Razorpay order creation, HMAC signature verification, plan activation, trial system, EnsureActivePlan middleware

INR billing flow
06
Billing (Stripe + global)
Week 3–4

IP detection, USD pricing, Stripe Checkout, webhook backup, dual-currency transaction history, invoice PDF

Global billing with dual gateway
07
Multi-page tours
Week 4

URL-per-step config, localStorage resume, continuation banner, global progress badge

Cross-page tour system
08
Landing page & legal
Week 4

Marketing landing page, privacy policy, terms of service, refund policy

Public-facing site ready for Razorpay approval

Results — before and after

Metric Before After Change
Setup time (new walkthrough) 2–3 hours with manual Intro.js config Under 7 minutes via dashboard −95%
Onboarding tool monthly cost $249+/mo (Appcues entry tier) ₹99–₹3,999/mo Up to −98%
Analytics visibility None (client-side only) 6 event types, step-level, server-side Full trace log
Unauthorized embed detection None Real-time domain alerts 100% visibility
Payment currencies supported N/A INR + USD (auto-detected) Global from day one
Pages supported per tour 1 Unlimited (multi-page resume) No ceiling

Technology used

Backend

Laravel 13 Application framework
PHP 8.5 Runtime
MySQL Primary database
Eloquent ORM Database layer

Frontend

Blade + Tailwind Dashboard UI
Vite Asset pipeline
Vanilla JS Walk.js core engine

Payments

Razorpay INR payments (UPI, cards, netbanking)
Stripe Checkout USD payments (international cards)

Ready to build something worth a case study?