Growth Strategy / GTM

Bali Concierge

Viral DistributionEngine

The go-to-market playbook for Michele Mauri's Bali Concierge - a four-engine system engineered to manufacture word-of-mouth and turn every guest into a new seed.

Read the strategy
30-day sprint · target 10,000
01High-Level Vision

10,000

signups in 30 days

The north-star number for the launch sprint.

1,000

Phase 1 milestone

Proof-of-loop checkpoint, cleared inside the first week.

K ≥ 0.45

viral coefficient floor

Every cohort must spawn at least 0.45 of the next.

The Virality Formula

Multiplier = 1 / (1 - K)

Engine 2 closes the loop, so every seeded user invites a companion who invites the next. As long as the viral coefficient K stays at or above 0.45, the seeded base compounds into a runaway multiplier.

Drag K · watch the loop compound

Live multiplier and the resulting 30-day total.

K-factor

0.45

Multiplier

1.82×

0.000.40 floor0.90
30-day projection at K=0.45:9,999 signups ✕ target missed

Sensitivity warning

If K drops below 0.40 OR the Paid Dial falls under 120/day, the 10k target is missed.

The model has almost no slack at the edges. Both levers - loop quality (K) and the paid floor (E4) - have to hold simultaneously. Guard them like the launch depends on it, because it does.

02The Four Engines

Four independent acquisition engines feed one shared loop. Each does a different job, and each is individually measurable.

E1

Villa Network

Webhooks wired straight into property-management systems (PMS) seed new users automatically at check-in. Every arriving guest is a fresh top-of-loop entry.

20 + 9·ddaily seeds (d = day)
Engine 1
E2

Companion Sync

Automated deep-links provision a companion the moment a guest lands, initializing the referral loop immediately instead of waiting for a manual share.

× 1/(1-K)loop amplifier
Engine 2
E3

Insider Curation

Organic shares and curated local-guide attribution. Tastemakers and insiders broadcast hand-picked itineraries, each share credited back to its cohort.

15 + 3·ddaily organic seeds
Engine 3
E4

Paid Dial

A controlled paid-acquisition engine that switches on once the loop is proven. It is the floor under the curve, not the curve itself.

120 / dayfrom Day 3 onward
Engine 4
03The Viral Loop

Six steps, one cycle. Every converted user is engineered to re-enter at the top as a new seed.

  1. 1

    Seed Acquisition

    E1E4

    PMS webhooks and the paid dial drop new users at the top of the loop.

  2. 2

    Onboarding & Value Loop

    First-session value lands fast, so the user has something worth sharing.

  3. 3

    Companion / Friend Referral Invite

    E2E3

    Deep-linked companions and insider shares push the invite outward.

  4. 4

    Redirection via /r/[slug]

    Each click hits the dynamic redirect route, logged to Supabase with its cohort ref intact.

  5. 5

    Secure Conversion via /api/first-text

    Phone numbers are hashed securely on conversion and attributed back to the originating cohort.

  6. 6

    Loop Multiplication (New Seed)

    The converted user becomes a fresh seed - and the cycle restarts.

New seed loops back to Step 1

04Growth Projection

Cumulative signups across 30 days, driven by all four engines and amplified by the loop.

tied to the K-slider
Cumulative signups10k target linePhase 1 (1,000)
02.5k5k7.5k10kD1D5D10D15D20D25D30Phase 1 · D7
Day 30 · 9,999 signups

9,999

projected Day 30

Day 7

Phase 1 (1,000) cleared

1.82×

active loop multiplier

05Under The Hood

The attribution layer is real code, not a diagram. Every click is logged and every cohort ref survives the redirect.

Next.js 15App RouterReact 19Server ComponentsSupabaseclick + cohort trackingTailwind CSSdesign system
app/r/[slug]/route.tsfully implemented
import { NextRequest, NextResponse } from "next/server";
import { createClient } from "@/lib/supabase/server";

// GET /r/:slug — log the click, preserve cohort ref, redirect.
export async function GET(
  req: NextRequest,
  { params }: { params: Promise<{ slug: string }> },
) {
  const { slug } = await params;
  const ref = req.nextUrl.searchParams.get("ref");
  const supabase = createClient();

  // fire-and-forget: never block the redirect on logging
  await supabase.from("clicks").insert({
    slug,
    ref,                       // cohort attribution survives
    ua: req.headers.get("user-agent"),
    ts: new Date().toISOString(),
  });

  const dest = new URL("/welcome", req.url);
  if (ref) dest.searchParams.set("ref", ref);
  return NextResponse.redirect(dest, { status: 307 });
}

The dynamic redirect at /app/r/[slug]/route.ts logs every click to Supabase while preserving the cohort ref, so conversions from /api/first-text attribute cleanly back to the engine that sourced them.

The bet

Four engines. One loop. Ten thousand.

Hold K at 0.45, keep the Paid Dial at 120, and the math carries Bali Concierge from a single check-in to a city-wide habit in thirty days.

Bali Concierge · Growth Strategy & GTM · Michele Mauri