Photography CRM Flow
Before you run this
By default this skill uses local CSV files for its data (input and output) — nothing to connect, works offline, your data stays on your machine. The CSVs live next to the skill in ./data/ (input: data/input.csv, output: data/output.csv), or point it at any path you like.
If you'd rather read/write a Google Sheet instead, just say so and I'll switch you over. It's a one-time setup: you'll paste a Google service-account JSON (or authorize once), share your Sheet with that account's email, and give me the Sheet URL. After that it behaves exactly the same, just backed by your Sheet. Say "use Google Sheets" to start that, or "keep CSVs" (default) to just go.
What it does
Three-part CRM automation for a photography business. A new lead comes in (from a website form, a spreadsheet, wherever) and this skill:
- Creates a ClickUp task for the client with all their details as custom fields (name, email, phone, package, amount, shoot date).
- Sends three emails immediately: a booking confirmation, an invoice summary, and a prep-tips reminder.
- On a separate run, sends reminder emails to every open task in the list a day before the session.
- On a separate run, sends reminder SMS messages via Twilio to every open task in the list.
Original Make.com workflow: 3 scenarios — "New Lead in ClickUp", "Reminder Email", "Reminder Texts".
Env vars required
CLICKUP_API_KEY # ClickUp personal API token
CLICKUP_LIST_ID # ClickUp list ID where tasks live (default: 901701902540)
CLICKUP_ASSIGNEE_ID # ClickUp user ID to assign tasks to
SMTP_HOST # SMTP server hostname
SMTP_PORT # SMTP port (e.g. 587)
SMTP_USER # SMTP login
SMTP_PASS # SMTP password
SMTP_FROM # From address for outgoing emails
TWILIO_ACCOUNT_SID # Twilio account SID
TWILIO_AUTH_TOKEN # Twilio auth token
TWILIO_FROM_NUMBER # Twilio sending number (e.g. +15673472003)
When to trigger
- New lead: run
new_lead.py whenever a form submission or intake row lands in data/input.csv. Each unprocessed row = one new client to onboard.
- Reminder emails: run
reminder_email.py daily (morning of shoot day or day before) — it pulls all open ClickUp tasks and emails every client in the list.
- Reminder SMS: run
reminder_sms.py daily (typically day before the session) — same pull, sends a text instead.
Step-by-step procedure
Flow 1 — Onboard a new lead
- Add the client row to
data/input.csv (or let the CSV accumulate from a form intake):
- Columns:
first_name, last_name, email, phone, package, shoot_date (MM/DD/YYYY), amount
- Run:
python3 scripts/new_lead.py --input data/input.csv
- For each unprocessed row the script will:
- POST to ClickUp and create a task named
FirstName LastName with all custom fields populated.
- Send three emails to the client: booking confirmation, invoice, and prep tips.
- Write results (task_id, status) to
data/output.csv.
Flow 2 — Send reminder emails
- Run:
python3 scripts/reminder_email.py
- Pulls all open tasks from the configured ClickUp list and sends each client a session reminder email.
Flow 3 — Send reminder SMS
- Run:
python3 scripts/reminder_sms.py
- Pulls all open tasks from the configured ClickUp list and texts each client via Twilio.
Node map (Make → script)
| Make module |
Script |
Notes |
util:SetVariables (WordPress Webhook) |
read_rows() on input.csv |
Each CSV row = one trigger |
clickup:createTaskInList |
new_lead.py → create_clickup_task() |
Custom fields: FirstName, LastName, Email, Phone, Amount Paid, Package |
email:ActionSendEmail (×3 in Flow 1) |
new_lead.py → send_email() |
Confirmation, invoice, prep tips; 2s delay between each |
clickup:getListTasks (Flow 2) |
reminder_email.py → get_clickup_tasks() |
|
email:ActionSendEmail (Flow 2) |
reminder_email.py → send_email() |
Reminder email per task |
clickup:getListTasks (Flow 3) |
reminder_sms.py → get_clickup_tasks() |
|
twilio:SendSMS (Flow 3) |
reminder_sms.py → send_sms() |
|
Package options
The original workflow maps package names to ClickUp custom field option IDs. The skill uses the string names directly and maps them in the ClickUp POST body. Valid values: newborn, pregnancy, family.
1---2name: photography-crm-flow3description: Photography CRM Flow4---5# Photography CRM Flow67## Before you run this89By default this skill uses **local CSV files** for its data (input and output) — nothing to connect, works offline, your data stays on your machine. The CSVs live next to the skill in `./data/` (input: `data/input.csv`, output: `data/output.csv`), or point it at any path you like.1011If you'd rather read/write a **Google Sheet** instead, just say so and I'll switch you over. It's a one-time setup: you'll paste a Google service-account JSON (or authorize once), share your Sheet with that account's email, and give me the Sheet URL. After that it behaves exactly the same, just backed by your Sheet. Say **"use Google Sheets"** to start that, or **"keep CSVs"** (default) to just go.1213---1415## What it does1617Three-part CRM automation for a photography business. A new lead comes in (from a website form, a spreadsheet, wherever) and this skill:18191. **Creates a ClickUp task** for the client with all their details as custom fields (name, email, phone, package, amount, shoot date).202. **Sends three emails immediately**: a booking confirmation, an invoice summary, and a prep-tips reminder.213. On a separate run, **sends reminder emails** to every open task in the list a day before the session.224. On a separate run, **sends reminder SMS messages** via Twilio to every open task in the list.2324Original Make.com workflow: 3 scenarios — "New Lead in ClickUp", "Reminder Email", "Reminder Texts".2526---2728## Env vars required2930```31CLICKUP_API_KEY # ClickUp personal API token32CLICKUP_LIST_ID # ClickUp list ID where tasks live (default: 901701902540)33CLICKUP_ASSIGNEE_ID # ClickUp user ID to assign tasks to34SMTP_HOST # SMTP server hostname35SMTP_PORT # SMTP port (e.g. 587)36SMTP_USER # SMTP login37SMTP_PASS # SMTP password38SMTP_FROM # From address for outgoing emails39TWILIO_ACCOUNT_SID # Twilio account SID40TWILIO_AUTH_TOKEN # Twilio auth token41TWILIO_FROM_NUMBER # Twilio sending number (e.g. +15673472003)42```4344---4546## When to trigger4748- **New lead:** run `new_lead.py` whenever a form submission or intake row lands in `data/input.csv`. Each unprocessed row = one new client to onboard.49- **Reminder emails:** run `reminder_email.py` daily (morning of shoot day or day before) — it pulls all open ClickUp tasks and emails every client in the list.50- **Reminder SMS:** run `reminder_sms.py` daily (typically day before the session) — same pull, sends a text instead.5152---5354## Step-by-step procedure5556### Flow 1 — Onboard a new lead57581. Add the client row to `data/input.csv` (or let the CSV accumulate from a form intake):59 - Columns: `first_name, last_name, email, phone, package, shoot_date (MM/DD/YYYY), amount`602. Run:61 ```bash62 python3 scripts/new_lead.py --input data/input.csv63 ```643. For each unprocessed row the script will:65 - POST to ClickUp and create a task named `FirstName LastName` with all custom fields populated.66 - Send three emails to the client: booking confirmation, invoice, and prep tips.67 - Write results (task_id, status) to `data/output.csv`.6869### Flow 2 — Send reminder emails70711. Run:72 ```bash73 python3 scripts/reminder_email.py74 ```752. Pulls all open tasks from the configured ClickUp list and sends each client a session reminder email.7677### Flow 3 — Send reminder SMS78791. Run:80 ```bash81 python3 scripts/reminder_sms.py82 ```832. Pulls all open tasks from the configured ClickUp list and texts each client via Twilio.8485---8687## Node map (Make → script)8889| Make module | Script | Notes |90|---|---|---|91| `util:SetVariables` (WordPress Webhook) | `read_rows()` on input.csv | Each CSV row = one trigger |92| `clickup:createTaskInList` | `new_lead.py` → `create_clickup_task()` | Custom fields: FirstName, LastName, Email, Phone, Amount Paid, Package |93| `email:ActionSendEmail` (×3 in Flow 1) | `new_lead.py` → `send_email()` | Confirmation, invoice, prep tips; 2s delay between each |94| `clickup:getListTasks` (Flow 2) | `reminder_email.py` → `get_clickup_tasks()` | |95| `email:ActionSendEmail` (Flow 2) | `reminder_email.py` → `send_email()` | Reminder email per task |96| `clickup:getListTasks` (Flow 3) | `reminder_sms.py` → `get_clickup_tasks()` | |97| `twilio:SendSMS` (Flow 3) | `reminder_sms.py` → `send_sms()` | |9899---100101## Package options102103The original workflow maps package names to ClickUp custom field option IDs. The skill uses the string names directly and maps them in the ClickUp POST body. Valid values: `newborn`, `pregnancy`, `family`.