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>
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:
new → contacted → qualified (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, statusonboarding) + 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
- Copy the embed URL from the new client's
stack_notesin the CRM. - Clone a template/preview (
templates/landing/…), rebrand it (name, colours, services, hours, photos), and wire the booking section to the client's EA. - Ship the isolated stack:
→ scp to the homelab → add the printed Caddy block + reload →
cd deploy/clients ./new-client.sh <slug> <slug>.mivanchenko.de <their-site-dir>docker compose up -d. Live athttps://<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/settingspage (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).