Three numbers in the brief didn't add up. I found them before I built anything.
A ClickUp workspace and seven self-hosted n8n workflows for a fictional 12-room assisted-living facility, engineered around a 60-use lifetime custom-field budget and a 5-automation ceiling on the free tier.
A fictional facility. A very real set of constraints.
The brief described a 12-room assisted-living facility running since 2018 — three caregivers, a 1:3 ratio policy, cash-only billing, and a free-tier ClickUp plan expected to hold all of it together.
| Fact | Value |
|---|---|
| Licensed capacity | 12 rooms |
| Current census | 8 residents |
| Caregivers | 3, at a 1:3 ratio policy |
| Caregiver lunch break | 30 min, at noon, for each caregiver |
| Sales calls | 45/day, 8 min average, 22% stated conversion |
| Sales shift | 6 hours active |
| Billing | $2,000–$3,500/month per bed, cash only |
Two deliverables were required: a ClickUp workspace covering task management, medication tracking, a sales CRM, and a relatives directory (Part 1); and an n8n automation sending visit-day weather briefings to relatives (Part 2, the brief's one explicit automation requirement).
Three problems hiding in the brief's own arithmetic.
Not gaps the brief left open — numbers it stated that quietly contradicted each other.
All three caregivers break at the same time
Noon lunch, taken simultaneously, for thirty minutes — for that window the facility runs 0 staff to 8 residents, a daily breach of its own 1:3 ratio policy.
Three beds are structurally unsellable — and nobody had noticed
3 caregivers × 1:3 ratio caps safe census at 9. The facility is licensed for 12. Three beds sit empty for staffing reasons, not demand — about $99,000 a year in forgone revenue.
The stated conversion rate breaks the business model
45 calls × 8 minutes is the entire 6-hour shift, leaving no time to log a call or follow up. And a flat 22% dial-to-admit rate would mean roughly 10 new admissions a day into a 12-bed home.
A 60-use field budget, for the life of the workspace.
ClickUp's free plan doesn't cap custom fields — it caps uses: every value set on every task, counted once, forever. Eight residents on six ordinary fields would spend 80% of that budget on a single list. The design doctrine: a field earns its place only where a machine must read the value; everything else moves onto free, unlimited native objects.
Field-budget doctrine
Custom fields treated as a non-renewable resource — statuses, tags, checklists, and relationships carry meaning for free instead.
Four-Space workspace
Care Operations, Growth, Family Relations, and Business Office — 12 lists total, built around the doctrine above.
5 native automations, spent deliberately
Each of ClickUp Free's five automation slots assigned to the single highest-value trigger on its list.
Free-plan workarounds
No chart cards, no map view, no webhooks, no automation conditions — each gap engineered around rather than accepted.
n8n as the escape hatch
Self-hosted, unlimited execution — everything conditional, cross-list, scheduled, or chart-based that the free plan structurally cannot do.
Seven workflows, each covering a gap ClickUp Free cannot close natively.
Every workflow below was built, debugged against real API responses, and executed live against the actual workspace — not simulated.
| Workflow | Runs | What ClickUp Free can't do |
|---|---|---|
| W1 — Visit-Day Weather Briefing | Daily 06:00 | No task webhooks, no external API calls, no household grouping — the brief's one explicit Part 2 requirement |
| W2 — Medication Safety Net | Every 30 min | Can trigger on a status change, not evaluate a numeric threshold like '45 minutes late' or '3× in 7 days' |
| W3 — Sales Command Center | Daily 06:15 | No chart cards on Free, and Dashboards cap at 60 lifetime views |
| W4 — Shift Handover Digest | 06:45 & 18:45 | One automation is scoped to one List; this aggregates four Lists per caregiver |
| W5 — Cash & Arrears Control | Daily 08:00 | Can't total a column or compare consecutive receipt numbers for gaps |
| W6 — Capacity-Aware Lead Routing | Daily 08:30 | Cross-list comparison — beds vs. leads — against a policy ratio, then branching |
| W7 — Retention Radar & Hygiene | Weekly, Mon 07:30 | No trigger exists for 'this relationship doesn't exist' across two lists |
W1's idempotency was verified directly: run twice in immediate succession, the second run processed zero households — zero duplicate emails, proven rather than assumed.
The bugs are part of the work, not incidental noise.
Real debugging that shaped the final build.
A GET request disguised as a PUT
ClickUp's API silently defaulted the HTTP method, returning a 403 from CloudFront with no obvious cause. Fixed by explicitly setting the method on every write-back node — now a standing verification step.
One chain, two consumers, a silent overwrite
A linear node chain let a later step overwrite data an earlier step still needed downstream. Rewired into two parallel branches off the same source node so both consumers get their own copy.
A `400 – Comment is required` error with a comment already in the payload
The code referenced `$json.commentText`, but the upstream node's real output field was named `comment` — `JSON.stringify` silently drops keys that resolve to `undefined`. Fixed by cross-checking the exact field name in the actual upstream output before writing any downstream expression.
The video script ran over the assessment's 10-minute limit
Flagged plainly rather than hidden, with a prioritized, quantified cut plan — exactly what to shorten and how much time each cut recovers — so the final recording fits the constraint without losing the content that best demonstrates the reasoning.
This one lives in ClickUp and n8n, not a code repo.
The deliverables for this project are a ClickUp workspace, seven live n8n workflows, and a set of written guides rather than a public repository — so there's no "View source" link here. Get in touch and I'm glad to walk through the live workspace, the workflow canvases, or the full written report.