24d9aca812
Test backoffice (smb-crm) / test (push) Has been cancelled
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>
58 lines
2.7 KiB
Markdown
58 lines
2.7 KiB
Markdown
# 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`, 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:
|
|
```bash
|
|
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).
|