The Run-Based Collection Loop: Stop chasing responses by hand
Recurring collection work breaks down in the follow-up. You send a request, responses trickle in, and you lose track of who is outstanding. The fix is not more emails. The fix is state.
We call this pattern the Run-Based Collection Loop: a reusable system that creates one status row per recipient per run, then drives completion with automated reminders and a clean close. It works for quarterly reporting, policy attestations, document collection, and any workflow where silence is not acceptable.
We have implemented this pattern for a client running 30+ recipients per quarterly cycle, but the structure is industry-agnostic and portable.
Tools used: Power Automate + SharePoint Lists + Microsoft Forms.
Follow-up is a state problem, not an email problem. If you do not store status per person per run, you will always chase by hand.
What this system does
One run = one collection cycle (for example, 2026-Q1). The system:
- Sends a personalized request to each recipient
- Tracks response status per person, per run
- Reminds only non-responders on a cadence you control
- Logs every reminder and submission timestamp
- Gives you a single completion view at any time
Mental model:
Kickoff -> Sync -> Remind -> CloseKickoff creates rows, sync updates rows, reminders chase the gaps.
What this replaces (outcome delta)
| Before | After |
|---|---|
| Manual follow-ups and ad-hoc reminder emails | Automated reminders to non-responders only |
| No single view of completion status | One source of truth per run |
| Unclear audit trail (who responded, when?) | Clean completion view with timestamps |
The time savings show up where it hurts most: follow-ups.
Why three flows instead of one
We split this into three flows for a reason:
- Reliability: each flow has a single responsibility
- Testability: you can run and debug flows independently
- Guardrails: you can pause reminders without breaking intake
Where it fits (and where it does not)
This pattern is ideal when silence is not acceptable and you have a known list of people:
- Quarterly or monthly status updates
- Grantee or portfolio reporting
- Policy attestations and training confirmations
- Client intake or document collection
- Budget requests and approvals
It is overkill if you only chase 3-5 people once a year. The setup cost is real: you are building a small system, not a single flow.
Minimum data model (SharePoint Lists)
The list names and column names are flexible. The structure is not.
1) Recipients list (projects, grantees, accounts)
Conceptual fields (examples in parentheses):
- Recipient identifier (ProjectKey, RecipientID)
- Primary contact email (PrimaryContactEmail)
- Internal owner (ProjectOwnerInternal)
- Recipient status (Active/Inactive)
2) Runs list (reporting periods)
Conceptual fields:
- Run identifier (PeriodKey, RunID)
- Open date
- Due date
- Kickoff sent flag (KickOffEmailSent)
- Run status (Open/Closed)
Example run from our build: RunID 2026-Q1, OpenDate 2026-01-18, DueDate 2026-01-20, Status Open.
3) Submissions list (one row per recipient per run)
Conceptual fields:
- Recipient identifier (links to recipient)
- Run identifier (links to run)
- Response status (ResponseSubmitted Yes/No)
- Submitted timestamp
- Reminder count
- Last reminder timestamp
- Response fields (whatever you collect)
Flow 1: Kickoff (manual trigger)
Purpose: Start the run, create submission rows, send initial emails.
Trigger: Manual (operator starts the run)
Steps:
- Get the open run
- Guardrail: if no open run, stop
- Guardrail: if kickoff already sent, stop
- Get all active recipients
- For each recipient, create a submission row, build a prefilled form URL, and send the kickoff email
- Mark the run as kicked off
Flow 2: Sync responses (Forms trigger)
Purpose: Update submission rows when responses arrive.
Trigger: Microsoft Forms response submitted
Steps:
- Get response details
- Find the submission row by RecipientID + RunID
- If the row exists, parse response fields and update the submission row
- If the row does not exist, terminate and notify
Flow 3: Reminders (scheduled)
Purpose: Chase non-responders without spamming everyone.
Trigger: Recurrence (e.g., daily at 9:00 AM)
Steps:
- Get open runs
- Guardrail: proceed only if exactly one open run
- Compute DaysToDue
- Decide if today is a reminder day
If yes, do the following:
- Get pending submissions
- For each pending row, look up recipient contact
- Build prefilled URL
- Send reminder email
- Update ReminderCount and LastReminderAt
Failure modes and guardrails
These are the common breakpoints and how the system handles them:
| Failure Mode | Guardrail |
|---|---|
| Orphan responses (no submission row found) | Terminate and notify the operator. Do not create a new row. |
| Double kickoff (duplicate emails and rows) | KickoffSent flag stops the flow before any emails go out. |
| Multiple open runs (reminders do not know what to chase) | Allow only one open run. Terminate otherwise. |
| Recipient list changes mid-run | Operator playbook (add rows manually or rerun kickoff with dedupe). |
| Reminder spam | Cadence logic + ReminderCount tracking. |
Copy/paste corner
Reminder cadence (pseudo-logic):
days_to_due = dateDiff(DueDate, utcNow())
send_today = days_to_due in [7, 3, 1]Prefilled URL (example shape):
https://forms.office.com/...&RecipientID={RecipientID}&RunID={RunID}Pending submissions filter (SharePoint example):
RunID eq '2026-Q1' and ResponseSubmitted eq falseOperator defaults (what we do every run)
- Every run gets a RunID. No exceptions.
- Kickoff creates submission rows before emails go out.
- We only remind when there is exactly one open run.
- Reminders are logged with count and timestamp.
- Form responses always update existing rows, never create new ones.
- Prefilled URLs are mandatory for reliable matching.
Quick start (build this in an afternoon)
- Create the three lists with the conceptual fields above
- Build the kickoff flow and send a test request
- Build the sync flow and confirm the row updates
- Build the reminder flow with a safe cadence
- Run a small pilot (5-10 recipients)
- Tune cadence and email copy, then scale
Who this is for
This pattern is best for teams running recurring collection cycles (quarterly or monthly) where:
- the recipient list is known
- silence is not acceptable
- compliance and audit trails matter
If you only chase a handful of people once a year, a lighter process may be enough.
The punchline
Once you stop thinking of this as "send a few emails" and start treating it as a run with state, the follow-up problem disappears.
If you want this pattern adapted to your workflows, book a Workflow Teardown. We will map your current process, then design the smallest system that makes the follow-up automatic.
Get notified when new Insights drop
One email per article. No spam, just builder notes from real AI work.
Related articles
Why I Don't Let My AI Agents Plan (When the Process Is Known)
When the process is known, fixed workflows beat autonomy. Here are the guardrails we now use.
Builders LogI Turned 21,000 Lines of Code Into 43 Files
I spent a month building a full-stack application: server, API, 11 pipeline phases, 21,000 lines of code. The thing that shipped was 43 files in a folder smaller than a hero image.
Want help putting this into practice?
Book a 15-minute call→