Engagement Status Digest
The client update you meant to send on Friday, drafted before you sit down.
What it does
Reads your Engagements sheet each morning and sorts every active engagement into three groups:
- Needs attention — anything with a blocker recorded, or marked
at risk - Update due — no client update logged in 7+ days, worst first, with the phase, the next milestone and how many days away it is
- Up to date — named, so you can see the whole book at a glance
What it does NOT do
It never contacts a client. Everything goes to the engagement lead, who edits and sends.
At six people the relationship is the product. An automated status note that gets one fact wrong — a milestone that moved, a blocker that cleared yesterday — costs more than the ten minutes it saved. The machine finds the engagements that need a note; a person writes it.
It does not read Slack, Jira or your calendar. Version 1.0.0 reads the sheet your firm keeps. That is deliberate for a firm this size: engagement truth usually lives in the lead's head and a spreadsheet, not in a queryable system, and a workflow that assumes otherwise reports confidently on nothing. See Customization for how to add a real feed once you have one.
Setup
1. Google Sheet
Tab Engagements with this header:
| client | engagement | lead | status | phase | next_milestone | milestone_date | blocker | last_update_sent | notes |
|---|---|---|---|---|---|---|---|---|---|
statusvalues:active|at risk|paused|closed— onlyactiveandat riskare consideredlast_update_sentdrives the cadence. Leave it blank and the engagement reports as "never sent"- Dates in
YYYY-MM-DD
2. Credential + contact
Replace the placeholders:
- <<GOOGLE_WORKSPACE_CREDENTIAL>> — Google Workspace credential with Sheets read scope
- <<ENGAGEMENTS_SHEET_ID>> — the sheet ID from its URL
- <<ENGAGEMENT_LEAD_PUBLISHER>> — who receives the digest
3. Schedule
Daily, early. Thursday-only also works if your firm writes updates on Friday.
Customization
- Cadence.
CADENCE_DAYSat the top of thecomposetask. Weekly is the default; fortnightly suits retained work. - Per-lead digests. Column C (
lead) is already read and printed. Filter on it incomposeand run once per lead so nobody reads someone else's book. - Adding a real activity feed. Once you have a Slack or Jira credential, add a fetch task ahead of
composeand merge its output into the per-engagement item. The structure is there —composebuilds one dict per engagement and formats at the end. - Drafting the note itself. Add an
anthropictask aftercomposethat receives{{compose.output}}and writes the update prose, the wayproposal-drafterdoes. Keep the facts computed incompose; let the model write only the sentences around them.
Source
workflow.iml