Storytelling Program — POC Dashboard
POC

Pre-Go-Live Setup Checklist

Complete every item below before running acceptance tests. Your progress is saved automatically in this browser.

0 of 0 items complete
✓ All items complete — you're ready to run acceptance tests.
Reset checklist
Last updated: —
Storytellers — Total
— approved
Sourcing Pipeline — Total
— added today
Unsigned Release Forms
release_status = sent
PII Review — Pending
awaiting staff review
Critical Mentions Leads
added in last 24 hours
Approved & Partner-Visible
vetted + release signed
Table What it's for Filled by
Storytellers Master record for every storyteller — bio, demographics, district, vetting and release status, contact info Automation + staff
Sourcing Pipeline Incoming leads before they become storytellers — Cal.com bookings, Critical Mentions hits, manual referrals Automation + staff
Vetting Log Record of every vetting check — LexisNexis, social media review, findings, outcome Staff
Partner Requests Inbound requests from partner orgs for storyteller matches — issue area, district, media tier, deadline Staff
Press Pipeline Active press pitches — outlet, reporter, pitch status, interview date, media prep links Staff
Products & Lands Completed placements — publication, date, URL, content type, audience reach Staff
Retention Check-ins Scheduled check-ins to keep storytellers engaged — due date, status, updated issue areas Automation + staff
PII Review Queue Demographic suggestions (and any flagged content) queued for staff to approve, redact, or discard before saving Automation; resolved by staff
Config System-level settings — used by automations, not for day-to-day editing Tech
Goals Tracker Per-district sourcing targets vs. live actuals — storytellers, issues, and press lands, refreshed nightly Automation + staff
Donor KPIs Program KPI snapshot for funders — reach, activation, unique storytellers used Staff
Associates Team directory — email, Slack, Cal.com link — powers routing and Herald @-mentions Staff
Distribution Projects Op-eds, LTEs, and other owned content tied to a storyteller Staff
Photo Submissions Storyteller photo uploads from the form, matched back to records Automation + staff
Partner Tracker Partner organizations and their engagement history Staff
Feedback POC acceptance-testing submissions from this dashboard Staff
#storytelling-ops
Stories team · activity notifications
  • New Cal.com intake booking
  • Release form sent / signed
  • Release form follow-up reminders sent
  • ⚠️ PII review required
  • New Critical Mentions leads added
  • Inbound SMS from a storyteller
#storytelling-tech
Tech (Shar) · system health only
  • Lambda errors
  • Cron job failures
  • API error rate alerts
CAL Booking confirmed → Sourcing Pipeline record + Slack
SIGN Release form sent → Release Status = sent + Slack
SIGN Release form signed → Release Status = signed, Has Signed Release checked + Slack
SMS Unsigned after 3 days → text reminder sent automatically (daily cron)
GRA Interview notes pasted into a record → a daily job suggests demographics into the PII Review Queue for staff to approve
CM Critical Mentions RSS polled hourly → Claude scores each item → high/medium leads written to Sourcing Pipeline + Slack
Release Status
unsigned — not yet sent sent — awaiting signature signed — complete expired — lapsed, resend needed
Vetting Status
pending — not yet vetted approved — cleared flagged — issue found hold — paused, check back
Lead Status
new — just arrived in_outreach — contacted no_response — no reply yet converted — became storyteller declined — passed
PII Review Status
pending — awaiting staff review approved — ok to use redacted — used with edits discarded — do not use
Cal.com — intake interview booking page; sends webhook on confirmation
OpenSign — release form sending and signature collection; sends webhooks on status changes
Granola — records and summarizes intake calls; the associate pastes the notes into the record
Critical Mentions — media monitoring; saved keyword searches produce RSS feeds the system polls hourly
AWS Comprehend — scans intake notes for sensitive content (names, SSNs, addresses) before anything is stored
Claude (AWS Bedrock) — scores Critical Mentions leads for storyteller potential; never receives PII
AWS End User Messaging — sends SMS reminders for unsigned release forms via toll-free number +1-855-560-6294
Airtable — everything lives here; the system reads from and writes to it across its automations

Goals & KPIs

Sourcing goals by district (Sage's target: 2 storytellers per priority issue per district) vs. the current storyteller bank, plus the KPI set. District counts refresh nightly (goals_actuals); in-platform KPIs refresh nightly (kpi_rollup) and grow as lands/requests are logged.

163
Storytellers in priority districts
48
District×issue goals met (of 125)
3
Districts with no storytellers yet
25
Priority districts tracked

Sourcing goals by district

cell = # storytellers · target 2 · met 1 0
District# storytellersMedicaidSNAPePTCTariffsUtilities
AZ-01840001
AZ-02310013
AZ-06864002
CO-03110000
CO-05200001
CO-081191002
IA-011063023
IA-02100011
IA-031485263
MI-04600011
MI-071132012
MI-10950002
NC-11820000
OH-07300033
OH-10220022
OH-15200002
PA-01632022
PA-071262035
PA-081344028
PA-101140011
TX-15000000
TX-23000000
TX-35000000
WI-01534012
WI-031766063

Program KPIs — snapshot

from the 2026 analysis
MetricValue
$ behind earned media lands— only 8 lands have ad spend; source too sparse to total
Reach — new/digital media≈ 5.2M 2026 YTD (partial)
Reach — traditional media lands≈ 34.7M 2026 YTD · press lands with a reach value (partial)
Storytellers activated38 2026 YTD
Storytellers with multiple product types12 2026 YTD
Unique storytellers landed with press20 2026 YTD
Unique storytellers used by digital20 2026 YTD
Unique storytellers used by partners— needs Sage's org-classification rule
Unique storytellers used by political entities (candidates, PACs, American Bridge, Porchlight)— needs Sage's org rule

Live in-platform counts

auto · grow as the team logs lands & requests
MetricValue
$ behind logged ads (in-platform)$0 auto · sum ad_spend on logged lands · updated 2026-07-22
Partner requests logged329 auto · partner_requests · updated 2026-07-22
Press lands logged (in-platform)1 auto · products_and_lands · updated 2026-07-22
Reach — logged press lands (in-platform)0 auto · sum audience_reach on logged lands · updated 2026-07-22
Unique storytellers landed (in-platform)0 auto · distinct storytellers on lands · updated 2026-07-22
Unique storytellers matched to partner requests25 auto · distinct storytellers linked from partner_requests · updated 2026-07-22

Reading it: each district cell is the count of storytellers there tagged with that issue; green = target of 2 met, amber = 1, red = 0. Sage's Jul-21 KPI asks map here: reach & product counts populate from logged lands; reach-by-quarter and the reach-grows-over-time refresh need the Critical Mention saved searches; candidate / elected-official / PAC vs partner usage needs Sage's org-classification rule (marked "pending").

System Overview

The technology platform behind the CAP/CAPAF Storytelling Program — automating the storyteller lifecycle from sourcing through vetting, onboarding, distribution, and impact tracking, plus a partner-access layer. A one-page map of what's inside and what it does. 141 commits since June 5, 2026.

7,930
Lines of Python
18
Scheduled crons
5
Webhook Lambdas
16
Airtable tables
126
Passing tests
800+
Storytellers
Inputs — external events
Cal.com bookings OpenSign signatures Slack @Herald Inbound SMS Critical Mentions RSS Google Forms
Processing — event-driven + scheduled
API Gateway → 5 Lambdas (calcom · opensign · sms · Herald entry + worker) EC2 → 18 crons (sync · vetting · email · reporting)
Intelligence + data
Bedrock — Claude Sonnet 4.5 Comprehend — PII scan Airtable — 16 tables · source of truth
Outputs
SES email (managed opt-out) SMS Slack / Herald replies Partner portal (Cloudflare Pages)

All secrets in one AWS Secrets Manager entry · env-gated poc/prod (SMS + email dry-run until go-live).

Sourcing & Intake

Cal.com bookings create sourcing leads and self-assign an associate; converted leads become storyteller records; media leads flow in from hourly Critical Mentions scanning + Claude classification.

calcom_intake · lead_conversion_sync · critical_mentions_poll

Vetting

AI surfaces reputational concerns from associate-gathered findings as advisory notes — human-in-loop, never auto-deciding. Re-vetting alerts and Comprehend PII scanning included.

vetting_analysis · revetting_alerts · comprehend_scanner

Onboarding

Welcome email with the onboarding-form link; Google-Form responses sync photos, demographics, and interests onto records; OpenSign release-form events update signing status.

onboarding_email · onboarding_form_sync · opensign_webhook

Distribution — Herald

A conversational Slack bot: @-mention it to log a press pitch, a result, a land, or request a partner match. It reads the thread, plans the turn, writes the record, and pings the owning associate.

slack_events · slack_worker · claude_client

Partner Access

AI-ranked storyteller matching for partner requests (eligibility + geography filtered, issues ranked semantically) and pasted-request → outreach-draft generation.

storyteller_match · partner_outreach_draft

Reporting & Impact

Impact scoring per storyteller; nightly per-district goal actuals (storytellers, issues, press lands) behind the Goals & KPIs dashboard; donor KPI snapshots; retention check-ins.

impact_scoring · goals_actuals · retention_checkins
AWS Lambda · API Gateway EC2 · cron Bedrock · Claude Sonnet 4.5 Comprehend · PII SES · SMS Airtable Slack · bot + webhooks Cloudflare Pages Python · pytest

How to read this. Counts are live from the repository (7,930 Python LOC across app + tests; 126 tests green). Environment is poc — SMS and email stay in dry-run until the production cutover. For per-feature status and ownership, see the Feature Status tab.

Open “The Journey” as a full page ↗

Operational Cost

What it costs to run the platform, by seat and by service. Modeled for 3 users (the two current associates + one planned hire). Slack and the EC2 host are provided through the shared IT CORE / DIGITAL CORE offerings, so they carry no marginal cost here; AWS is a usage estimate.

$473
Per month · 3 users
$5,670
Per year · 3 users
+$1,600
Per added user / yr
$6.88
Per storyteller / yr
PlatformAnnual / user3 users
Airtable$500$1,500
Critical Mentions$800$2,400
Cal.com$150$450
Granola$150$450
Per-user subtotal$1,600$4,800
ItemAnnualNotes
AWS platform~$720est. ~$60/mo — Bedrock (Claude Sonnet 4.5), SMS, Secrets, SES, API Gateway
OpenSign$150flat account
Slack$0baked in IT CORE offering
EC2 host$0baked in DIGITAL CORE offering
Fixed subtotal$870
Incremental cost per user: +$1,600/yr (≈ $133/mo). Each new team member adds four per-seat licenses (Airtable, Critical Mentions, Cal.com, Granola). AWS, OpenSign, Slack, and EC2 do not grow with headcount.
Team sizePer yearPer month
3 users (today)$5,670$473
4 users$7,270$606
5 users$8,870$739
6 users$10,470$873

Baseline today: Google Alerts arriving by email, and everything else done by hand — reading and triaging alerts, typing leads, tracking forms, logging pitches, counting KPIs. The platform runs that flow end to end — here's what it would take by hand versus with the platform, at current volume.

~19
Hours / week reclaimed
~970
Hours / year (~½ FTE)
~$48k
Labor value / year
~8.5×
Return on the ~$5.7k cost

At current volume, the operational flow that runs ~26.5 hrs/week done by hand takes about ~7 hrs/week with the platform — the system absorbs the other ~19.

FlowBy hand (hr/wk)With platform (hr/wk)
Media monitoring & lead triage (Google Alerts → read, judge, enter)6.01.0
Interview notes → fields + demographics3.01.0
Partner matching + outreach drafts3.01.0
Press pipeline logging (pitch / result / land)2.50.8
Reporting · KPIs · goals counting2.50.5
Vetting logging + re-vet flags (AI assist; staff still decide)2.51.5
Onboarding email + form sync + photos2.00.4
Intake booking → record + assignment1.50.2
Release-form tracking + reminders1.50.3
Lead → storyteller conversion (re-typing)1.00.1
Retention check-in tracking1.00.3
Total (hr/wk)~26.5~7
Net: the platform costs ~$5,670/yr and returns ~$48k/yr of reclaimed staff time — about half an FTE — before counting the coverage and speed gains below. Even at a conservative labor rate it pays for itself several times over.
  • Coverage. Scans ~90 news items every hour, around the clock, AI-scoring each — vs. a person skimming Google Alerts a few times a day. Leads that used to slip through are now caught.
  • Speed. Article → scored lead in the pipeline in ~5 minutes, any hour — vs. hours-to-next-day by hand.
  • Nothing dropped. Every booking, signature, pitch, and land is logged the moment it happens; unsigned forms and overdue re-vets flag themselves.
  • Better matches. Ranks 800+ storytellers by issue and geography instantly, surfacing people a manual search would miss.
  • Judgment preserved. AI suggests (concerns, demographics, matches); staff always decide — speed without losing the human call.

Assumptions. Seat prices are the annual list rates you provided (Airtable $500, Critical Mentions $800, Cal.com $150, Granola $150 per user/yr; OpenSign $150/yr flat). AWS is an estimate — most of it is Bedrock for Critical Mentions, which batches 50 items per call (~1,440 calls/mo, roughly constant regardless of team size). Per-storyteller figure uses the current 824 storytellers. Slack and EC2 excluded as shared-CORE services. Efficiency figures are estimates of team-wide manual hours at current volume, valued at a $100,000/yr fully-loaded FTE (≈ $50/hr over ~2,000 productive hours) — adjust the rate or hours and the value scales linearly.

Herald — your Slack helper

🤖 AI-enabled helper

Herald lives in Slack (#storytellers-press) and powers the press and partner steps. It's fully conversational — @-mention it and say what you want in plain English, and it does the typing. Not sure where to start? Just ask. It only ever suggests and records; you always make the call.

In #storytellers-press
SG
Shar3:23 PM
@Herald what can I do here?
HeraldApp3:23 PM
What would you like to do? You can pitch a storyteller, report a pitch result, log a published piece, or find storytellers matching specific criteria.
How to talk to it: tag @Herald once at the top of a thread and say what you want in plain English. It reads the thread, figures out which of the four things you mean, and replies right there — usually within seconds. After that first tag you can keep chatting in the same thread without re-tagging.

📣 Log a pitch

Tell Herald you're pitching a storyteller to an outlet. It creates the press-pipeline row and pings the owning associate.

@Herald pitch Jane Doe to the State Journal on Medicaid

✅ Update a result

When a pitch moves — confirmed, interviewed, published, declined — just say so and Herald updates the row.

@Herald Jane Doe's pitch got confirmed

🎉 Record a land

Drop the storyteller and the link when a piece publishes. Herald logs it and pings the liaison to track reach.

@Herald Jane Doe landed https://… in the Journal

🤝 Find a match

Ask for storytellers for a partner request. Herald filters approved storytellers, AI-ranks by fit, and posts a shortlist in-thread.

@Herald 5 storytellers in WI on Medicaid for a partner

Herald is live and end-to-end verified. Behind the scenes it reads the thread, plans the intent with Claude, writes to Airtable (press_pipeline / products_and_lands / partner_requests), and @-mentions the owning associate — all from your plain-language message.