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

Work through each test below. Expand a card, follow the steps, mark each one done, then record your verdict. When you're done with all five, enter your name and submit.

During POC: SMS messages are logged but not actually sent to phones. All Slack notifications start with [POC]. Both are expected.

Test 1 — Cal.com Intake Booking
Booking → Airtable sourcing record + Slack notification
  1. 1Open cal.com/cap-storytelling/intake in a browser.
  2. 2Book a time slot using a test name (e.g., "Acceptance Test Booking") and any email address.
  3. 3Complete the booking through to the confirmation page.
  4. 4Wait up to 60 seconds, then check Airtable → Sourcing Pipeline for the new record.
  5. 5Check #storytelling-ops Slack for a [POC] notification about the booking.
What you should seeNew record in Sourcing Pipeline with Lead Source = cal.com and your test name. In #storytelling-ops, a message like:
[POC] 📅 New intake booking: Acceptance Test Booking
Scheduled: 2026-06-10T14:00:00Z
Airtable Record: recXXXXXXXX
Test 2 — OpenSign Release Form
Form sent → status update → signed → release confirmed → 3-day SMS reminder
  1. 1In OpenSign, send your release form template to a test email you control. Note the document ID.
  2. 2Wait 60 seconds. Check Airtable → Storytellers: the matching record's Release Status should be "sent".
  3. 3Open the email, click the OpenSign signing link, and complete the signature.
  4. 4Wait 60 seconds. Check Airtable: Release Status = "signed", Has Signed Release = checked.
  5. 5For the SMS follow-up test: ask Shar to manually trigger the follow-up check against a record with a sent date older than 3 days.
What you should seeAfter step 2: Release Status = "sent" + [POC] Slack "Release form sent." After step 4: status = "signed", Has Signed Release checked + [POC] Slack "Release form signed." After step 5: [POC] Slack "Release form follow-up reminders sent: 1" (no real SMS in POC).
Test 3 — Granola Intake Notes
Granola saves to Drive → PII scan → Airtable record created
  1. 1Start a Zoom or Google Meet call with Granola running. (A call with yourself on two devices works fine.)
  2. 2Speak a few sentences about a fictional healthcare or housing story. Don't include real personal info.
  3. 3End the call and wait 1–2 minutes for Granola to produce its summary.
  4. 4Finalize/save the summary in Granola and confirm the file appears in the designated Google Drive folder.
  5. 5Wait 2 minutes. Check Airtable → Storytellers for a new record with the Intake Notes Drive URL filled in.
What you should seeNew record in Airtable Storytellers with Intake Notes Drive URL populated. [POC] Slack: "New intake notes processed: [filename]." If PII was flagged instead: a record in PII Review Queue + a warning Slack message — this is also correct behavior.
Test 4 — Critical Mentions Lead Sourcing
RSS poll → Claude classification → leads in Airtable + Slack
  1. 1Open Critical Mentions and find a recent result (past 24 hours) that looks like a good storyteller lead. Note the headline.
  2. 2Ask Shar to trigger a manual RSS poll right now (rather than waiting for the next hourly run).
  3. 3Wait 2–3 minutes, then check Airtable → Sourcing Pipeline for new records with Lead Source = "critical_mentions".
  4. 4Check #storytelling-ops Slack for a [POC] notification showing how many leads were added.
What you should seeNew records in Sourcing Pipeline with Lead Source = "critical_mentions", an Issue Area, and a Potential Score. [POC] Slack: "X new lead(s) added from Critical Mentions." If no leads appear, the items may have scored low — note the headline and flag it so the scoring can be tuned.
Test 5 — PII Review Queue
Review flagged content and mark it approved, redacted, or discarded
  1. 1Open Airtable → PII Review Queue.
  2. 2If there's a record with Review Status = "pending" (from Test 3 or earlier), open it. Otherwise ask Shar to create a test record.
  3. 3Read the "Raw Content Summary" field — it describes what was flagged without showing the actual sensitive text.
  4. 4Change the Review Status to "approved", "redacted", or "discarded".
What you should seeThe record updates immediately. If you set the status to approved, an Airtable automation will create a new stub record in the Storytellers table within seconds — you then fill in the name, phone, and issue areas from the Drive notes. No automation fires for redacted or discarded.

Results Summary

TestStatusNotes
Test 1 — Cal.comPending
Test 2 — OpenSignPending
Test 3 — GranolaPending
Test 4 — Critical MentionsPending
Test 5 — PII Review QueuePending
Last updated: —
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

Storytelling Program Automation — Stories Team Guide

Who this is for: Stories team members who will use and test the new storytelling system.
What this covers: What to set up before go-live, how to seed the database with initial data, and how to confirm that each automation is working correctly.

No technical background needed. If something does not go as described, see Something Looks Wrong at the bottom.

What the System Does

The automation stack handles four things that the Stories team currently does by hand:

  1. Cal.com bookings create database records automatically. When a prospective storyteller books an intake interview through Cal.com, a new record appears in Airtable immediately — no manual entry needed.
  2. OpenSign release forms are tracked automatically, with SMS reminders. When you send a release form, the system watches for it to be signed. If it is not signed within three days, the system automatically texts the storyteller a reminder. When it is signed, the record updates instantly.
  3. Granola interview notes are processed and stored automatically. After you finish an intake interview, Granola saves your notes to a designated Google Drive folder. The system picks them up, checks them for sensitive information, and creates an Airtable record with the Drive link attached — without you having to copy anything.
  4. Critical Mentions surfaces new storyteller leads automatically. The system checks your Critical Mentions keyword feeds every hour. Relevant mentions are analyzed by AI and high- and medium-potential leads are added to Airtable's sourcing pipeline, with a summary posted to Slack.

All four automations run on their own once set up. The Stories team manages the Airtable database — the automation fills it.


Before Go-Live: Your Setup Checklist

The following items are yours to complete before acceptance testing begins.

Airtable

  • Confirm you have been added as a user on the Team plan. You should receive an email invitation from Airtable.
  • Confirm you can see the base called "Storytelling Program" after accepting the invitation.
  • Familiarize yourself with the nine tables: Storytellers, Sourcing Pipeline, Vetting Log, Partner Requests, Press Pipeline, Products & Lands, Retention Check-ins, PII Review Queue, and Config.
  • Set up the PII approval automation — when a PII Review Queue record is approved, Airtable should automatically create a Storyteller stub. Steps below.

PII Approval Automation — Setup Steps

This is a one-time configuration inside Airtable. It takes about five minutes.

  1. In the Storytelling Program base, click Automations in the top toolbar.
  2. Click + New automation.
  3. Set the trigger to "When a record matches conditions", table: PII Review Queue, condition: Review Status is approved.
  4. Add action: "Create record", table: Storytellers. Map fields:
    • Intake Notes Drive URL → Source Identifier (the Drive file ID from the queue record)
    • Vetting Status → set to pending
    • Release Status → set to unsigned
  5. Optionally add a second action: "Update record" on the PII Review Queue record — set Reviewed At to the current time.
  6. Name the automation "PII Approved → Create Storyteller" and turn it on.
After approval, the new Storyteller stub will appear in seconds. Open it and fill in the storyteller's name, phone, issue areas, and other details from the Granola notes in Drive.

Cal.com

  • Create or confirm the intake interview event type at cal.com/cap-storytelling/intake — this is the link you will send to prospective storytellers.
  • Confirm with Shar that the Cal.com webhook is connected and active.

OpenSign

  • Create your standard release form template in OpenSign — the document you send every storyteller before they can be used in any external capacity.
  • Send a test document to yourself to confirm the account is active and delivery works.
  • Confirm with Shar that the OpenSign webhook is connected and active.

Granola

  • Install Granola on the computer(s) the Stories team uses for intake interviews.
  • Configure Granola to save notes to the designated Google Drive folder. In Granola settings, look for "Save to Google Drive" and point it to that folder.
  • Make sure everyone knows to inform storytellers at the start of every call that it is being recorded and transcribed for internal use only. This is required.

Critical Mentions

  • Build and save your keyword searches in Critical Mentions — these should cover the issue areas and geographic terms most relevant to the storyteller program.
  • Confirm with Shar that your RSS feeds are connected to the system.

Slack

  • Confirm you are in #storytelling-ops. This is where all system activity notifications will appear.
  • Ping Shar if the channel does not exist — they will create it.

Seeding the Database

Already done. All storyteller records from the Stories team's existing Airtable tables have been synced into this base as of June 6, 2026. You do not need to add initial records manually — your real data is already here.

Going forward — adding new records

For any new storyteller who comes in outside of the automated flows, just create a record directly in Airtable:

  1. Open Airtable and go to the Storytellers table.
  2. Click the + at the bottom of the table to add a new row.
  3. Fill in at minimum: first name, last name, phone number (in the format +12025551234), state, issue areas, and set SMS opt-in to checked.
  4. Set Release Status to unsigned and Vetting Status to pending.

The automated flows (Cal.com, Granola, Critical Mentions) will continue adding new records on their own — manual entry is only needed for one-off additions.


Acceptance Testing

Run these tests in order. Each test tells you exactly what to do, what you should see if it is working, and what to note if it is not.

During POC testing: Text messages will not actually be delivered to phones — they will appear as log entries. Slack messages will appear with a [POC] label. This is intentional and expected.

Test 1 — Cal.com Intake Booking

What this tests: When a prospective storyteller books an intake interview, a new record automatically appears in Airtable and a Slack notification fires.

Steps:

  1. Open cal.com/cap-storytelling/intake in a browser.
  2. Book a time slot using a test name (e.g., "Acceptance Test Booking") and a real or fake email address.
  3. Complete the booking all the way through to the confirmation page.

What you should see within 60 seconds:

  • In Airtable → Sourcing Pipeline: a new record with Lead Source = cal.com, the name you used, and the scheduled time filled in.
  • In #storytelling-ops Slack: a message like [POC] 📅 New intake booking: Acceptance Test Booking followed by the scheduled time and Airtable record ID on separate lines.

What to note if it does not work:

  • Screenshot the Cal.com confirmation page.
  • Note the exact time you completed the booking.
  • Check whether the record appeared in Airtable at all — even without the Slack notification.

Test 2 — OpenSign Release Form

What this tests: When you send a release form, Airtable updates. When it is signed, the record updates again. If it is not signed within three days, an SMS reminder fires.

Part A — Form sent:

  1. In Airtable, find one of the test storyteller records you created during seeding.
  2. In OpenSign, send your standard release form to a test email address you control.
  3. Note the document ID shown in OpenSign after sending.

What you should see within 60 seconds:

  • In Airtable → Storytellers: the record's Release Status changes to sent and the OpenSign Document ID field is populated.
  • In #storytelling-ops Slack: [POC] Release form sent: [name].

Part B — Form signed:

  1. Open the email inbox you sent the test form to.
  2. Open the OpenSign signing link and sign the document.

What you should see within 60 seconds:

  • In Airtable → Storytellers: Release Status changes to signed and Has Signed Release is now checked.
  • In #storytelling-ops Slack: [POC] Release form signed: [name].

Part C — SMS reminder (3-day follow-up):

Ask Shar to trigger the follow-up check manually against a record with Release Status = sent and a sent date older than three days.

What you should see:

  • In #storytelling-ops Slack: [POC] Release form follow-up reminders sent: 1.
  • No real SMS is sent in POC mode — that is expected.

Test 3 — Granola Intake Notes

What this tests: After a Granola-captured interview, notes saved to the designated Drive folder automatically become an Airtable record.

  1. Start a Zoom or Google Meet call with Granola running in the background. (A call with yourself on two devices is fine.)
  2. Speak a few sentences — anything will do, but do not include real personal information.
  3. End the call and wait 1–2 minutes for Granola to produce its summary.
  4. Review the summary in Granola and click to finalize/save it. Confirm the file appears in the designated Google Drive folder.
  5. Wait 2 minutes. Check Airtable → Storytellers for a new record with the Intake Notes Drive URL field populated.

What you should see:

  • New record in Airtable Storytellers with Intake Notes Drive URL filled in.
  • In #storytelling-ops Slack: [POC] New intake notes processed: [filename].

What if content is flagged for PII review:

  • In Airtable → PII Review Queue: a new record with Review Status = pending.
  • In #storytelling-ops Slack: [POC] ⚠️ PII review required: [filename].

This is the system working correctly. Open the PII Review Queue record, review what was flagged, and set the status to approved or discarded.


Test 4 — Critical Mentions Lead Sourcing

What this tests: The system polls your Critical Mentions feeds every hour, classifies mentions with AI, and adds high- and medium-potential leads to Airtable.

  1. In Critical Mentions, identify a recent result (from the past 24 hours) that looks like a good storyteller lead. Note the headline.
  2. Ask Shar to manually trigger one poll cycle right now.
  3. Wait 2–3 minutes, then check Airtable → Sourcing Pipeline for new records with Lead Source = critical_mentions.
  4. Check #storytelling-ops Slack for a [POC] notification showing how many leads were added.

What you should see:

  • New records in Sourcing Pipeline with Lead Source = critical_mentions, an Issue Area, and a Potential Score (high or medium).
  • In Slack: [POC] X new lead(s) added from Critical Mentions.

If the item was scored low: It will not appear in Airtable — that is correct behavior. Note the headline and flag it so the scoring can be tuned.


Test 5 — PII Review Queue

What this tests: The Stories team's ability to review and resolve flagged content.

  1. Open Airtable → PII Review Queue.
  2. If there are records with Review Status = pending (from Test 3 or otherwise), open one. Otherwise ask Shar to create a test record.
  3. Read the Raw Content Summary field — this describes what was flagged, not the actual sensitive content.
  4. Change the Review Status field to one of:
    • approved — the content is fine to use
    • redacted — the content had something removed
    • discarded — do not use this content

What you should see: The record updates immediately. If you set the status to approved, an Airtable automation creates a new stub record in the Storytellers table within seconds — you then fill in the name, phone, and issue areas from the Drive notes. No automation fires for redacted or discarded.


Acceptance Sign-Off

For each test, record the following and share the results with Shar:

TestDid it work?Notes / What you saw
Test 1 — Cal.com intakePass / Fail / Partial
Test 2A — OpenSign sentPass / Fail / Partial
Test 2B — OpenSign signedPass / Fail / Partial
Test 2C — SMS follow-upPass / Fail / Partial
Test 3 — Granola notesPass / Fail / Partial
Test 4 — Critical Mentions leadsPass / Fail / Partial
Test 5 — PII review queuePass / Fail / Partial

Any Fail or Partial results will be looked into before go-live.


Something Looks Wrong

Who to contact: Reach out in #storytelling-tech on Slack.

What to include:

  1. Which test step you were on
  2. The exact time you performed the action
  3. A screenshot of what you expected to see
  4. A screenshot of what you actually saw

Things that are not errors:

  • Slack messages prefixed with [POC] — intentional during POC.
  • No SMS received on a phone — SMS is logged only in POC mode.
  • A delay of up to 60 seconds before records appear in Airtable — normal.
  • No new Critical Mentions leads — correct if there are no relevant new mentions in the feed.

Things that are actual errors:

  • No Airtable record after more than 5 minutes.
  • No Slack notification after more than 5 minutes.
  • An error message appearing in Airtable or Slack.
  • Granola notes not appearing in the Drive folder after 5 minutes.
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 Interview notes flagged by Comprehend for sensitive content — held here until staff approves, redacts, or discards Automation; resolved by staff
Config System-level settings — used by automations, not for day-to-day editing Tech
#storytelling-ops
Stories team · activity notifications
  • New Cal.com intake booking
  • Release form sent / signed
  • Release form follow-up reminders sent
  • Granola notes processed
  • ⚠️ 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 Granola notes saved to Drive → Comprehend scan → Storyteller record created or PII queue entry + Slack
CM Critical Mentions RSS polled hourly → Claude scores each item → high/medium leads written to Sourcing Pipeline + Slack
PII PII queue record approved → Airtable automation creates Storyteller stub instantly
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; auto-creates storyteller 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 calls in the background; saves notes to Google Drive automatically
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
Google Drive — stores Granola summaries; the system watches the intake folder for new files
Airtable — everything lives here; the system reads from and writes to it across all four automations

Use Cases

Six concrete scenarios showing exactly what the automation handles — and what it hands back to the team.

1 — From Article to Airtable

Critical Mentions · AI Scoring · Airtable

Maria is a housing advocate in Phoenix who shares her story about a proposed HUD rule change in a local news article. Critical Mentions picks up the article at 9 AM on a Tuesday. By 9:05, Claude has read the full piece, scored Maria as a high-potential lead, tagged her under the Housing issue area, and written her into the Sourcing Pipeline in Airtable — headline, article URL, rationale, and all. A Slack notification lands in #storytelling-ops.

No one on the Stories team was monitoring the news at 9 AM. No one had to. When they open Slack mid-morning, Maria is already there waiting for outreach.

Time between article publication and lead in Airtable: five minutes. Staff time required: zero.

2 — The Booking That Created Its Own Record

Cal.com · Airtable · Slack

A team member reaches out to Maria, shares a Cal.com link, and asks her to book a 30-minute intake interview. Maria picks a slot for Thursday at 2 PM. The moment she clicks Confirm, a webhook fires to the system. Within seconds, a new Sourcing Pipeline record appears in Airtable with Maria's name, email, and scheduled time pre-filled. A Slack notification confirms the booking.

The team member never opens Airtable to enter anything. They simply show up to the Thursday call prepared — the record is already there.

Manual data entry for booking confirmation: none. The calendar and the database stay in sync automatically.

3 — The Interview That Wrote Itself

Granola · Google Drive · Comprehend · Airtable

Thursday's call with Maria runs on Granola in the background. The team member focuses on the conversation — Granola handles the rest. When the call ends, Granola generates a structured summary and saves it to the designated Google Drive folder. The system picks it up within two minutes.

AWS Comprehend scans the notes for sensitive information. The content is clean. The system creates a Storytellers record in Airtable, attaches the Drive link, and posts a Slack confirmation. By the time the team member closes their laptop after the call, Maria has a complete intake record — notes, Drive link, and all — waiting for review.

Time spent copying notes from Granola into Airtable: zero. The system moves the information so the team doesn't have to.

4 — The Flag That Protected Everyone

Granola · Comprehend · PII Review Queue · Airtable

A team member finishes an intake call with James, a Medicaid enrollee in rural Georgia. The conversation was candid — James shared details about a family member's diagnosis, a Social Security number mentioned in passing, and a home address. Granola saves the notes to Google Drive as usual. The system picks them up within two minutes.

This time, AWS Comprehend flags the content: names, a government ID number, and a street address detected. Instead of writing the notes into Airtable, the system holds them. It creates a record in the PII Review Queue with Review Status set to pending, a plain-language summary of what was flagged (entity types, not the sensitive values themselves), and posts a ⚠️ alert to #storytelling-ops: "PII review required: James intake call."

A team member opens the queue record, reads the summary, and decides the content is fine to use — James had consented and the details are relevant. They set Review Status to approved. Airtable's automation fires instantly, creating a storyteller stub for James. The team fills in his contact details and the intake process continues as normal.

Sensitive content never reaches Airtable or AI inputs without a human seeing it first. The system stops automatically — the team decides what happens next.

5 — The Unsigned Release

OpenSign · SMS · Airtable

After the interview, a team member sends Maria a standard release form through OpenSign. The system logs the send, updates her Release Status to sent, and stamps the date. Life gets busy. Maria means to sign it but forgets.

Three days later, at 9 AM, the system runs its daily follow-up check. It finds Maria's record: release sent, unsigned, three days ago. It sends her a text reminder automatically — no staff action required. Maria signs that afternoon. The webhook fires, her Release Status updates to signed, Has Signed Release is checked, and a Slack message confirms the change.

Follow-up reminders sent by hand: zero. Unsigned forms that slip through the cracks: also zero.

6 — The Policy Moment

Critical Mentions · AI Scoring · Airtable · Slack

On a Wednesday morning, Congress introduces a surprise immigration bill. Coverage spikes across local and national outlets. Critical Mentions picks up dozens of new mentions across the immigration keyword feed between 8 AM and noon. The system polls every hour. By lunchtime, Claude has read and scored every relevant result — filtering out op-eds, think-pieces, and pundit commentary, and surfacing only the articles quoting or featuring real people with lived immigration experiences.

The team opens Slack at noon to find a digest: 11 new high- or medium-potential leads added to the Sourcing Pipeline since morning, each with a headline, source URL, issue area tag, and Claude's one-line rationale for the score. The team immediately begins outreach. Without the system, scanning for those leads manually would have taken most of the afternoon — by which time the news cycle would already be moving on.

The system turns a fast-moving news cycle into an advantage instead of a bottleneck.

Storytelling Program Automation
Executive Brief  ·  CAP/AF  ·  June 2026
Page 1 of 2

The Stories team connects real people affected by policy — on healthcare, housing, immigration, and other issue areas — with press, partners, and advocacy campaigns. Finding, vetting, and managing those relationships has been entirely manual: staff scanning news for leads, tracking outreach in spreadsheets, chasing release form signatures, and manually logging interview notes.

This system automates the four most time-consuming steps:

  1. Intake booking (Cal.com) — When a prospective storyteller books an intake interview, a record appears in the database automatically. No staff data entry.
  2. Release form tracking (OpenSign + SMS) — When a release form is sent, the system watches for it to be signed. If unsigned after three days, it texts the storyteller a reminder automatically.
  3. Interview notes (Granola + Google Drive) — After an intake call, meeting notes are automatically ingested, scanned for sensitive information, and linked to the storyteller record — without staff copying anything.
  4. Lead sourcing (Critical Mentions + AI) — The system checks keyword feeds every hour. Relevant mentions are analyzed by AI and high- and medium-potential leads are added to the pipeline, with a summary posted to Slack.

Staff time shifts from data entry to judgment — reviewing leads, vetting storytellers, and managing relationships.

Maria is a housing advocate in Phoenix who reads about a proposed HUD rule change and shares her story in a local news article. Critical Mentions picks up the article at 9 AM. By 9:05, Claude has read it, scored Maria as a high-potential lead, and added her to the sourcing pipeline in Airtable with a summary and issue area tag. A Slack notification lands in the Stories team channel.

A team member reviews the lead, reaches out to Maria, and invites her to book an intake interview through a Cal.com link. Maria books for Thursday. The moment she confirms, a sourcing record is created automatically.

Thursday's call runs on Granola. When it ends, the meeting summary is saved to Google Drive and the system picks it up within minutes, scans it for any sensitive content, and creates a storyteller record with the notes attached. A release form goes out through OpenSign that afternoon. Maria signs it the next morning — the record updates instantly. She is now vetted, released, and ready to be matched with press or partner requests.

Total staff time on data entry for Maria's onboarding: approximately zero.


CAP/AF operates one centralized system. Partner organizations license access to the vetted storyteller pool — they do not receive a separate platform instance. The marginal cost of adding a licensee is near zero; all variable costs are borne by CAP/AF and are largely fixed regardless of how many partners access the database.

CAP/AF Annual Operating Cost

PlatformPurposeCost / Year
AirtableCentral database (Enterprise, 10 users)$6,300
Cal.comIntake booking (10 users)$1,440
GranolaInterview notes (~5 seats)$1,080
OpenSignRelease forms (flat)$120
AWSAll automation infrastructure~$600
MaintenanceOngoing enhancements (~60 hrs/yr)$6,000
Partner portalHosting & authentication~$900
Total annual operating cost~$16,400

Slack, Google Drive, and Critical Mentions are existing licenses — no additional cost.

Licensing Economics — Story Pool Access

Partner OrganizationsCAP/AF Annual CostCost per Partner
0 (CAP/AF only)~$16,400 / yr
5 partners~$16,400 / yr~$3,280
15 partners~$16,700 / yr~$1,115
30 partners~$17,200 / yr~$575

Minor AWS increases at higher partner counts reflect greater API and query volume. Platform license costs do not change.

Prepared by Digital Technology  ·  CAP/AF Shar Ghavami  ·  sghavami@americanprogress.org  ·  June 2026
Cost Model & Fair Market Value
Storytelling Program Automation  ·  CAP/AF  ·  June 2026
Page 2 of 2
~$8K
One-time build cost
(AI-assisted)
~$86K
5-year total cost
of ownership
Return on investment
over 5 years

All development was AI-assisted (vibe coding). The R&D line reflects actual human hours — traditional development of equivalent scope would require 150–200 hours (~$15,000–$20,000). AI assistance compressed build time by approximately 90%.

WorkApproachHrsCost
Requirements analysisTraditional40$4,000
AI-assisted R&D — architecture, design, development, testingAI-assisted10$1,000
Operationalization & go-live (setup, seeding, config)Traditional20$2,000
Partner portal developmentAI-assisted10$1,000
Total one-time investment~80~$8,000

Labor at $100/hr. Traditional equivalent: ~$20,000–$25,000.

Cost CategoryYr 1Yr 2Yr 3–5Total
Dev & operationalization$8,000$8,000
Platform licenses$9,500$9,500$9,500/yr$47,500
Maintenance & enhancements$3,000$6,900$6,900/yr$30,600
Annual total~$20,500~$16,400~$16,400/yr~$86,100

Year 1 maintenance lower (new system). Years 2–5 include portal operating (~$900/yr).

Market Comparison

A comparable vendor-built solution — custom CRM with automation, AI integration, and a partner portal — typically costs $150,000–$300,000 to build and $30,000–$50,000/year to operate. The 5-year vendor equivalent runs $300,000–$550,000.

This system was built for ~$8,000 — roughly 1/20th of market rate — by combining existing AWS infrastructure with AI-assisted development.

Value Delivered

The system eliminates approximately 8–10 hours/week of staff data-entry work. At $100/hour over 50 working weeks: $40,000–$50,000/year in recovered staff capacity — the system pays for itself within the first year.

5-year value of recovered capacity: $200,000–$250,000 vs. 5-year TCO of ~$86,000.

Constraints to Plan Around

Storyteller pipeline — Value grows with vetted storytellers. Intake throughput is gated by staff interview capacity, not the technology.

Partner portal — Current partner view is read-only Airtable. A dedicated web portal is scoped for Year 1 using AI-assisted development (~$1,000 build, ~$900/yr operating).

Uptime — Webhooks run on AWS Lambda (99.9% SLA). Scheduled jobs on a dedicated server; if it goes down, tasks pause briefly — no data is lost.

Bottom line: Built at 1/20th of comparable market cost through AI-assisted development, this system delivers $200,000–$250,000 in 5-year staff capacity value against a total cost of ownership of ~$86,000 — a roughly 3× return. It establishes a replicable model for licensing story pool access to partner organizations at near-zero marginal cost per licensee.
Prepared by Digital Technology  ·  CAP/AF Shar Ghavami  ·  sghavami@americanprogress.org  ·  June 2026