Add booking stack, client deploys, and back-office updates
- deploy/booking: shared Easy!Appointments stack with brand-matched wizard (flatpickr recolor, single-tenant provider hide, iframe auto-fit height reporter) - deploy/clients: per-client isolated nginx compose stacks with _template scaffold, new-client.sh, and happynails live site - deploy/backup: smb-db backup script - n8n: booking-sync workflow; onboarding tweaks - playbooks: lead-to-customer lifecycle + outreach - templates: nail-studio landing previews - backoffice: app/db/init/compose updates Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# 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 feed**
|
||||
`…/crm/api/bookings.ics?client_id=C-xxxx&token=…` to subscribe in 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).
|
||||
@@ -0,0 +1,82 @@
|
||||
# Playbook — Outreach (getting the first real leads)
|
||||
|
||||
Goal: turn local SMBs **without a (decent) website** into booked calls. The winning angle for
|
||||
local businesses is **preview-first**: don't ask "do you want a website?" — show them one you
|
||||
already built for *their* business. Costs you ~20 min per prospect (clone a demo, rebrand the
|
||||
name/colours/hours) and converts far better than a cold pitch.
|
||||
|
||||
## The funnel (track every prospect in the CRM)
|
||||
Each prospect is a row in **Leads** (`source = outreach`), moving through status:
|
||||
`new` → `contacted` → `qualified` (they replied / want to talk) → `won` (booked/closed) / `lost`.
|
||||
So the same dashboard you already run doubles as the outreach pipeline.
|
||||
|
||||
## Step 1 — Build the target list (aim for 20–30 to start)
|
||||
Search Google Maps for a niche + town (e.g. "Friseur <Stadt>", "Physiotherapie <Stadt>",
|
||||
"Pizzeria <Stadt>"). For each result, record:
|
||||
- Business name, owner name (if visible), phone, email, Instagram/FB handle, Maps URL.
|
||||
- **Website?** none / outdated / "only Facebook" / "only Lieferando". These are your best targets.
|
||||
- A 1-line hook (no online booking, ugly mobile site, no menu online, etc.).
|
||||
|
||||
Prioritise: **no website at all** > only-Facebook > outdated site. Skip anyone with a clean,
|
||||
modern, booking-enabled site — not worth your time.
|
||||
|
||||
## Step 2 — Build the preview (the hook)
|
||||
Clone the matching demo and rebrand it in ~20 min:
|
||||
- Casual/booking (barber, salon, café) → `templates/landing/demo-tier-a/`
|
||||
- Privacy/practice (physio, tax, clinic) → `templates/landing/demo-tier-b/`
|
||||
- Food/ordering (pizzeria, imbiss) → `templates/landing/demo-pizzeria/`
|
||||
|
||||
Swap name, colours, hours, services, a couple of photos. Deploy under a throwaway path
|
||||
(e.g. `demos.mivanchenko.de/preview-<name>`). That personalised URL is what you send.
|
||||
|
||||
## Step 3 — Reach out (pick ONE primary channel, follow up on a second)
|
||||
|
||||
### A) Cold email (best when you have the address)
|
||||
> **Betreff:** Kurze Website-Idee für [BUSINESS]
|
||||
>
|
||||
> Hallo [NAME / „Team von BUSINESS"],
|
||||
>
|
||||
> ich bin [MY_NAME] aus [CITY] und baue einfache, schnelle Websites mit Online-Terminbuchung
|
||||
> für lokale Betriebe. Für [BUSINESS] habe ich schon eine Beispielseite gebaut, damit Sie sehen,
|
||||
> wie es aussehen könnte — ganz unverbindlich:
|
||||
>
|
||||
> 👉 [PREVIEW_URL]
|
||||
>
|
||||
> Wenn es Ihnen gefällt, mache ich daraus in wenigen Tagen Ihre echte Seite (inkl. Terminbuchung
|
||||
> und Anfragen direkt aufs Handy). Hätten Sie diese Woche 10 Minuten für einen kurzen Anruf?
|
||||
>
|
||||
> Viele Grüße
|
||||
> [MY_NAME] · [PHONE] · [BUSINESS_DOMAIN/EMAIL]
|
||||
|
||||
### B) Instagram / Facebook DM (best for food, salons, cafés)
|
||||
> Hallo [BUSINESS] 👋 ich baue Websites mit Online-Terminbuchung/-Bestellung für lokale Betriebe.
|
||||
> Hab für euch mal eine Beispielseite gebaut — schaut mal: [PREVIEW_URL]. Wenn's gefällt, mache
|
||||
> ich daraus eure echte Seite. Interesse an einem kurzen Gespräch?
|
||||
|
||||
### C) Phone / walk-in opener
|
||||
> „Guten Tag, ich bin [MY_NAME], ich baue Websites mit Online-Terminbuchung für Betriebe hier in
|
||||
> [CITY]. Ich hab für [BUSINESS] schon eine Beispielseite gebaut — darf ich Ihnen den Link
|
||||
> schicken, dann schauen Sie unverbindlich rein?"
|
||||
|
||||
Walk-in is the strongest for food/retail — bring the preview on your phone and show it live.
|
||||
|
||||
### Follow-up (once, after ~3 days, if no reply)
|
||||
> Hallo nochmal — falls die Beispielseite untergegangen ist: [PREVIEW_URL]. Kein Stress, ich
|
||||
> wollte nur kurz nachhaken, ob's für Sie interessant ist. 🙂
|
||||
|
||||
## Step 4 — On reply → qualify → onboard
|
||||
- Reply = move the lead to `qualified`, book a 10-min call.
|
||||
- On the call: confirm what they want (page, booking, online orders), agree setup fee + monthly
|
||||
(see `tier-a-google.md` / `tier-b-selfhosted.md` for pricing), pick the tier.
|
||||
- Closed = run the **Onboarding-Formular** (onboard.mivanchenko.de) → creates the Client + Project
|
||||
in the CRM. Then follow the matching tier playbook to build the real site.
|
||||
|
||||
## Cadence & targets
|
||||
- Daily: 5–10 new prospects added + contacted. ~20 min/preview, so batch previews for your best 3–5.
|
||||
- Expect rough numbers: ~20 contacted → ~3–5 replies → ~1 first paying client. Volume is the lever.
|
||||
- Log everything in Leads so you can see reply-rate by niche/channel and double down on what works.
|
||||
|
||||
## Don'ts
|
||||
- Don't mass-blast identical emails (spam + low reply). Personalise the name + preview link.
|
||||
- Don't write "DSGVO-konform" or make compliance promises on the public pages.
|
||||
- Don't over-polish the preview — it's a hook, not the final product. 20 min, then send.
|
||||
Reference in New Issue
Block a user