1. Centre / SHG meeting reminders and attendance capture, in local language
Today: the field officer sits down at 8pm the night before with the branch register and her own phone, and calls or WhatsApps eight group leaders one at a time — some pick up, some don't, and she has no record of which. At the meeting she ticks names on a printed attendance sheet on a clipboard, folds it into her bag, and rides to the next centre. That evening (or Friday, if the week is bad) a branch assistant types twelve of those sheets into an Excel file, guessing at two names that smudged in the rain. Nobody notices that the Tuesday centre has not actually met for three weeks until the month-end MIS is pulled.
Trigger: Webhook (meeting calendar from the LMS) / scheduled run
How the workflow runs
- Trigger
Tomorrow's centre meetings are listed. A scheduled Webhook trigger brings in the next day's centre/SHG meeting schedule. The LMS has no first-party connector — a Tool (MCP) node fetches the meeting calendar, the centre roster and each group's recorded language.
- Loop
Fan out per centre. A Loop node iterates each centre so one cheap agent pass drafts that centre's reminder — a 40-centre branch is handled exactly like a 4-centre one, and the officer's evening of phone calls disappears.
- Agent
Draft the reminder in the group's language. An economy-tier agent composes a short reminder — centre name, meeting place, time, what to bring (passbook, savings) — in the group's recorded language, grounded in the meeting SOP in a scoped Knowledge collection. It states facts only; it never mentions amounts due, penalties or any consequence of non-attendance.
- Output
Send on WhatsApp + voice note. An Output node sends the text to the group leader on WhatsApp and, for low-literacy groups, an ElevenLabs/Sarvam voice note in the local language on the same thread — inside the permitted contact-hour window only, and logged per centre so 'did she get the reminder?' is answerable.
- Voice
Capture attendance by voice at the centre. A Voice node lets the field officer dictate attendance and meeting notes in her own language, standing at the centre; Sarvam transcribes and the agent maps spoken names to member ids, marking anything uncertain rather than guessing. The clipboard sheet stops being the system of record.
- Code
Band the centre's attendance. A Code node calls the society's own user-defined SpEL tool to label the meeting HEALTHY / WATCH / CRITICAL from the roster and present counts — deterministic arithmetic, no model involved, and the thresholds are the branch's own.
- Approval
Officer confirms the register. An Approval node shows the mapped attendance register and its band back to the field officer for confirmation — the attendance record is an official document, so a human signs it off before anything is written.
- Output
File the register + flag silent centres. On confirmation a Tool (MCP) node posts the register to the LMS, and centres that missed their meeting are listed for the branch manager the same day — not chased automatically, and not discovered at month-end.
Channels & connectors
- Webhook
- Voice / Call
- ElevenLabs (voice)
- Sarvam (Indian languages)
- Knowledge base
- Approval / HITL
- Tool (MCP → LMS)
Outcome
Every centre gets a same-language reminder the evening before without the officer making a single call, and the attendance register exists as structured, banded data before she gets home — instead of a clipboard sheet typed up on Friday.
Why it helps
The mechanism is timing and language, not persuasion: reminders reach the group leader on the channel they already use, in the language they actually speak, and attendance is captured by voice while the officer is still standing at the centre — so a centre that has stopped meeting surfaces within a day rather than in the month-end MIS.
Build spec
2 agents — 1 reminder drafter (runs once per centre via the Loop node) + 1 attendance mapper (runs once per meeting transcript). Loop / Voice / Code / Approval are workflow nodes. · Pattern: Loop fan-out for reminders → voice capture → mapper → SpEL banding in a Code node → human confirms the register
System prompt (paste-ready)
(Reminder drafter) Write ONE short meeting reminder for a microfinance centre/SHG group. You are given {centre_name, meeting_place, meeting_time, group_language, items_to_bring[]}. Write in group_language, at a primary-school reading level, under 40 words. State ONLY: which centre, where, when, what to bring. You must NOT mention any amount due, arrears, penalty, interest, or any consequence of not attending — this is a meeting reminder, not a collection message. Do not add greetings that name individual members. Return {text, tts_text} where tts_text is the same message written to be read aloud naturally.Agent roles & model tiers
Reminder drafter (per centre) — Economy tier, with a fallback model configured for provider outages — runs once per centre every meeting day, so this routing choice dominates total cost
Compose one short, factual, local-language meeting reminder from the given fields. No amounts, no arrears, no consequences, no invented details. Return text + a read-aloud variant.
Attendance mapper (per meeting) — Standard tier, fallback configured — matching real names out of noisy field-recorded speech is the one step that needs the reasoning
From a Sarvam transcript of the officer's spoken attendance, map each spoken name to a member id in the supplied centre roster. Return {present[], absent[], unmatched[]}. If a spoken name is ambiguous or not clearly on the roster, put it in unmatched with the raw text — never guess a member id, and never mark someone present who was not clearly named.
MCP connectors
- LMS / loan-management system — via Tool (MCP): fetch tomorrow's centre meeting calendar, the centre roster and each group's recorded language
- LMS / loan-management system — via Tool (MCP): post the officer-confirmed attendance register, keyed to (centre id, meeting date)
- WhatsApp — deliver the reminder text and the voice note to the group leader's existing thread
- Sarvam — transcribe the officer's spoken attendance and render the reminder in the group's language
Built-in tools
- knowledge_search (centre-meeting SOP, group roster and recorded language — scoped Knowledge collection)
- http_request (read the meeting schedule; post the confirmed register)
- user-defined tool `centre_attendance_band` (SpEL): input.rosterSize == 0 ? 'NO_ROSTER' : (input.presentCount * 100 / input.rosterSize >= 80 ? 'HEALTHY' : (input.presentCount * 100 / input.rosterSize >= 50 ? 'WATCH' : 'CRITICAL')) — a tenant-authored formula tool, not a script: it does arithmetic on the tool input and returns a label. The branch encodes ITS OWN attendance thresholds (a 12-member SHG and a 30-member JLG centre are judged differently) without a developer or a redeploy, and because it is deterministic the same counts always produce the same band. It only labels a meeting — it never touches a member's loan.
Guardrails
- No credit decision, ever: this workflow schedules and records attendance only — it never approves, rejects, re-prices or disburses anything, and any credit judgement belongs to a human at an Approval node
- Reminders are meeting notices, not collection messages — the drafter is forbidden from mentioning dues, arrears, penalties or consequences, and outbound sends respect the permitted contact-hour window, a per-group frequency cap and any opt-out already recorded
- The attendance register is written only after the field officer confirms it at the Approval node; unmatched names stay unmatched rather than being guessed onto a member id
- The `centre_attendance_band` SpEL tool classifies a meeting only — a CRITICAL band is a prompt for a human to look, never an action against a group or a member
- The register post is idempotent per (centre id, meeting date) so a re-run never duplicates or overwrites a confirmed register
Cost strategy
Cost is N centres × (economy-tier drafter, hard token cap) + one standard-tier mapper per meeting actually held. The drafter is the high-volume step and must stay on the economy tier — a 40-word factual reminder from structured fields needs no reasoning budget — and a fallback model is configured so a provider outage degrades the tier rather than stopping tomorrow's reminders. The mapper is the genuinely hard step (noisy speech, real names) and is the only place the standard tier is justified. The SpEL banding costs nothing at all: it is arithmetic in a Code node, not a model call. Run the reminder loop in Parallel batches for wall-clock speed without changing per-centre cost.
Output & delivery
Loop drafts one cheap local-language reminder per centre → an Output node delivers it on WhatsApp as text plus an ElevenLabs/Sarvam voice note inside the contact-hour window → after the meeting a Voice node captures spoken attendance → the mapper matches names to member ids → a Code node applies the society's `centre_attendance_band` SpEL tool → the field officer confirms at the Approval node → a Tool (MCP) node files the register in the LMS and lists silent centres for the branch manager the same day.