Files
smb-online/playbooks/lead-to-customer.md
T
mivanchenko 24d9aca812
Test backoffice (smb-crm) / test (push) Has been cancelled
Per-client ICS calendar feed, replacing the shared ICS_TOKEN (#22)
Each client now gets their own clients.ics_token (lazily generated on
first /owner/settings visit), which both authenticates and scopes
/api/bookings.ics -- closing the gap where any shared-token holder
could view another client's bookings by swapping the client_id query
param. The owner settings page now surfaces a copyable subscribe URL.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 11:55:35 +02:00

2.7 KiB

Playbook — Lead → Customer

The full lifecycle for turning a lead into a live, paying, bookable client. CRM lives at onboard.mivanchenko.de/crm. Booking is self-hosted (Easy!Appointments), embedded on the client's own site.

1. Lead exists

The lead is in the CRM Leads tab, status new — from outreach (see outreach.md) or an inbound form submission.

2. Reach out & qualify

Contact them (DM / call / walk-in). In the CRM, ✎-edit the lead's status: newcontactedqualified (interested) — or lost (dead).

3. Close the deal

On a short call, confirm scope (site + online booking), agree the setup fee + monthly (Tier-A pricing in tier-a-google.md), and note their services + opening hours.

4. Onboard → creates the customer (automated)

Click 📝 Onboarding-Formular in the CRM header (or go to onboard.mivanchenko.de). Fill: business name, owner, email, phone, niche, tier, domain = <slug>.mivanchenko.de, billing cycle, monthly fee → Submit.

This automatically:

  • creates the Client (C-xxxx, status onboarding) + Project in the CRM,
  • provisions their Easy!Appointments booking (service + provider, mapped to their C-id),
  • stores their booking embed URL in the client's stack_notes.

Then ✎-edit the original Lead → won.

5. Build & ship their site

  1. Copy the embed URL from the new client's stack_notes in the CRM.
  2. Clone a template/preview (templates/landing/…), rebrand it (name, colours, services, hours, photos), and wire the booking section to the client's EA.
  3. Ship the isolated stack:
    cd deploy/clients
    ./new-client.sh <slug> <slug>.mivanchenko.de <their-site-dir>
    
    → scp to the homelab → add the printed Caddy block + reload → docker compose up -d. Live at https://<slug>.mivanchenko.de (wildcard DNS + auto-TLS).

6. Tune their booking

In the EA backend (admin login — see .secrets/easyappointments.txt), set the provider's real services (duration / price) and working hours / timezone. Optionally hand the studio their provider login so they manage their own calendar.

7. Hand over & go live

  • Give them either their EA provider login (self-hosted calendar view) or the iCal subscribe URL shown on their own /owner/settings page (per-client token, #22) to add to Apple / Google Calendar.
  • A customer booking now flows: their site → EA → CRM bookings → your Telegram.
  • Set the Client → active.

8. Ongoing

Bookings auto-land in the CRM (source of truth); renewal reminders fire; bill monthly. Update status to churned if they leave (then docker compose down their stack to offboard).