Fact-Check Draft Articles with Perplexity Before You Publish
An n8n workflow that takes a draft article, extracts its factual claims, asks Perplexity to verify each one against live sources, and logs a pass/fail report with citations to Google Sheets — so writers catch wrong stats and outdated facts before they go live, not after a reader does.
- 1
Receive the draft
Add a
Webhooknode (POST) that accepts a JSON body with the drafttitleandtext. Send drafts to it from a Google Docs add-on, a form, or your CMS's 'ready for review' hook. - 2
Extract the claims
An
HTTP Requestto Claude asks for strict JSON: an array of discrete factual claims (stats, dates, attributions, superlatives), ignoring opinion. This turns prose into a checkable list. - 3
Verify each claim with Perplexity
An
Item Listsnode splits the claims, then anHTTP Requesttosonar-prochecks each: 'Is this claim accurate as of today? Verdict: supported / contradicted / unverifiable. Cite sources.' The live search is what catches outdated numbers. - 4
Shape the report rows
A
Codenode builds one row per claim: the claim text, the verdict, a short note, and the citation URLs. Colour-coding by verdict in the sheet later makes the failures jump out instantly. - 5
Log to Google Sheets
A
Google Sheetsnode appends the rows under a section for that article. The writer opens the sheet, filters tocontradictedandunverifiable, fixes those lines in the draft, and publishes with confidence.
Frequently asked questions
How does it decide what a 'claim' is?
A first Claude (or Perplexity) call extracts discrete, checkable factual statements — numbers, dates, attributions, superlatives — and ignores opinion or fluff. Each extracted claim is then verified individually so the report is granular. You review only the flagged ones, not the whole article.
How is a claim marked pass or fail?
For each claim, Perplexity returns a verdict (supported / contradicted / unverifiable) plus the sources it found. The workflow writes all three states to the sheet. 'Contradicted' and 'unverifiable' are the rows a writer must look at; 'supported' with a good source can be trusted.
How do I feed a draft into it?
Any way you like — the trigger is flexible. The example uses a Webhook you can POST a draft to (from a Google Docs add-on, a form, or your CMS), but you could also watch a Google Drive folder or a 'Ready for check' status in a Notion/Sheets content calendar. The draft text is all the workflow needs.