All case studies
Nova Dynamic Media · in progress·Sole owner of the AI platform

AI Reporting and Summaries for Live Events

Step Functions aggregation and grounded Bedrock summaries over event data

Step FunctionsAWS BedrockKnowledge BaseAthenaDynamoDBKMS
One report
attendees, activity, logins, QnA, polls, surveys unified
Async by design
Step Functions plus status polling, no long HTTP
Fewer reads
one attendee dictionary hydrates every branch
Model fallback
role-based chains survive a provider outage
Grounded
summaries come from a knowledge base, not free-form text

The problem

After an event, organizers want one comprehensive report — attendees, user activity, login history, Q&A, polls, surveys — plus plain-language summaries and insight. That data is spread across several DynamoDB tables and an Athena telemetry store, one of those queries is asynchronous, and the obvious implementation re-fetches every user's profile inside every report branch. It also cannot hang on a long HTTP request while all of that runs.

Options on the table

One large Lambda does everything
Times out, cannot cleanly wait on the async Athena query, and every failure restarts the whole thing.
Step Functions orchestration
Parallel branches, a proper wait-and-poll loop for Athena, and retries per step.
Re-fetch user profiles per branch
The same batch profile lookup repeated in every report branch — redundant and slow.
Build one attendee dictionary
Resolve userId to profile once, then hydrate every branch from it.

Architecture at a glance

Start + attendee dict
single hydration source
Parallel branches
Athena, DynamoDB, Map states
Bedrock summarize
KB-grounded
Report
Excel/CSV → S3/CDN

The decision

An HTTP call starts a Step Function that fans out across the report domains and returns an execution id; clients poll for status, so nothing hangs on a long connection. Every branch hydrates from a single attendee dictionary, and Amazon Bedrock (Converse over a Knowledge Base, with role-based model fallback chains) writes the summaries.

How it works

  1. 1The HTTP request starts a Step Function and returns an execution ARN. Clients poll a status endpoint, so there is no long-lived request to time out.
  2. 2It fetches the event profile and session list, then builds one attendee dictionary (userId to profile) as the single source of truth for hydration.
  3. 3Parallel branches run: user activity from Athena behind a wait-and-choice poll loop, login history from DynamoDB, and Q&A, poll and survey as Map states fanned out over sessions.
  4. 4Each branch hydrates names and groups from the attendee dictionary instead of re-querying user profiles, turning many redundant reads into one.
  5. 5Bedrock Converse over a Knowledge Base (S3 Vectors) generates transcription summaries, question sets and the comprehensive report, with role-based model fallback chains so one model outage does not stop the run.
  6. 6Reports render to Excel and CSV, land in S3, and ship through CloudFront; the report password is encrypted with KMS.

What I took away

Orchestrate, do not monolith. A Step Function handles the async Athena poll and the parallel fan-out cleanly, and building the user dictionary once turns N redundant profile lookups into one. Keep the AI summaries grounded in a knowledge base so the report reflects the event, not the model's imagination.
Want the deeper architecture behind this? Let's talk.
Get in touch