Automatically reviews tenant stories for broken CTAs, missing content, and quality issues — so editors catch problems before users do.
Paste a story payload and hit Submit to run QA evaluation.
Ctrl+Enter to submit.
What Storyteller asked us to solve — and why it's bigger than story quality.
Teams publish media-heavy content at high volume. As volume grows, it gets harder to ensure everything is consistent, professional, and trustworthy. Manual review doesn't scale.
This isn't just a story quality problem. It's a tenant health monitoring problem. Storyteller needs visibility into what tenants are publishing — before trust damage shows up in engagement metrics.
A CTA says "Buy tickets" but links to /highlights. The user taps it, lands on the wrong page, bounces. The editor didn't catch it. Storyteller had no signal. Invisible trust damage.
An automated pipeline that catches these issues, logs them, and tracks patterns per tenant over time. Runs automatically from the data — not a one-off analysis.
Six steps. Built entirely in n8n. Each step does one thing.
What each node does and why it exists.
Every "no" is a deliberate choice. Here's what we left out and why.
A number like "72" is not actionable. "CTA mismatch on page_2" is. Specific, named issues tell an editor exactly what to fix.
The structured metadata already carries the coherence signal. Video analysis adds latency and cost at the wrong layer for this use case.
QA surfaces signals. It does not replace editors. Automating moderation decisions creates liability and erodes editorial trust.
Four AI reviewers producing conflicting outputs that get averaged together degrades signal quality. One precise, well-prompted call is more reliable.
If a story has no pages or a missing title, there's nothing for the AI to evaluate. Catching this first is free, fast, and saves API spend on broken data.
The analytics layer runs independently of the pipeline. A PostgreSQL trigger counts issues per tenant automatically. No extra n8n nodes needed.
Two tables, one trigger. The pipeline writes results. The database handles analytics.
Every evaluated story gets a row. Stores story_id, tenant_id, status, confidence, issues (as JSONB), summary, and error_message. All outcomes — clean passes, flagged issues, and pipeline errors — live in one table.
Auto-populated by a database trigger. Tracks issue_type and occurrence_count per tenant. Over time, this answers: which tenants have recurring CTA problems? Which issues are systemic vs. one-off? Which tenants are getting worse?
With engineering support, these are the logical next steps.
Watch the pipeline process two stories: one clean pass, one with a CTA mismatch flagged for review.
Every evaluation is persisted to PostgreSQL. These are real rows written by the pipeline.
story_qa_results
| story_id | tenant_name | status | confidence | issues | summary |
|---|---|---|---|---|---|
| story_123 | Antarctic Football League | review | high | page_2: cta_mismatch — "Buy tickets" → /highlights | CTA mismatch on page 2 needs correction. |
| story_124 | Antarctic Football League | ok | high | — | Coherent, complete, aligned with title and categories. |
tenant_health
| tenant_name | issue_type | occurrence_count | first_seen_at | last_seen_at |
|---|---|---|---|---|
| Antarctic Football League | cta_mismatch | 6 | 2026-03-13 06:25 | 2026-03-13 08:45 |
| Test Tenant - Invalid Structure | missing_title | 1 | 2026-03-13 07:34 | 2026-03-13 07:34 |
| Test Tenant - Invalid Structure | no_pages | 1 | 2026-03-13 07:34 | 2026-03-13 07:34 |
| Test Tenant - Invalid Structure | missing_cta | 1 | 2026-03-13 07:34 | 2026-03-13 07:34 |
Populated automatically by a PostgreSQL trigger — the pipeline doesn't write to this table directly.
Before the AI ever sees a story, structural validation catches broken data. No API spend on garbage in.
What happens next
invalid_structure
Structural validation is deterministic, free, and fast. It runs before AI so broken payloads never waste an API call.