By following this guide, you will build an automated content quality-assurance workflow that sends draft copy to the Claude API, receives structured feedback, and logs results directly into a Notion database. The full setup takes about two hours and requires no prior experience with AI APIs. Once running, it can review a 1,000-word article draft in under 15 seconds.
What You'll Build
- A Make (formerly Integromat) scenario that triggers whenever a Notion page moves to a "Ready for QA" status
- A Claude API prompt chain that checks for brand voice consistency, factual hedging, readability, and missing CTAs
- A structured JSON response parser that writes specific QA flags back into the same Notion page as comments
- An optional Slack notification that pings the content owner when QA is complete
Prerequisites
- A Notion workspace with editor access and an existing content database
- An Anthropic account with API access (Claude 3.5 Sonnet or Claude 3 Opus, as of September 2026)
- A Make account on the Core plan or above (the free plan limits operations)
- Basic familiarity with JSON: you do not need to write code, but you should be able to read a key-value pair
- Optional: a Slack workspace if you want notifications
Step 1: Set Up Your Notion Content Database
Your Notion database needs three specific properties before Make can interact with it cleanly.
Which properties does the database need?
Add or confirm these properties exist on your database:
- Status (type: Select) with options including "Draft", "Ready for QA", and "QA Complete"
- QA Feedback (type: Text) where the workflow will write its output
- Assigned To (type: Person) so the Slack notification knows who to ping
Open your database, click the plus icon in the property bar, and add each one. Keep the names exactly as written above. Make's Notion module matches property names case-sensitively, and a mismatch is the most common reason this step fails later.
What content should you put in the page body?
The workflow reads the full page body as plain text. Make sure your writers paste their draft into the page body, not into a property field. Content stored inside a linked database relation or an embedded synced block will not be captured by the Notion API's block-children endpoint used in Step 3.
Step 2: Generate Your Anthropic API Key
Go to console.anthropic.com and navigate to API Keys in the left sidebar. Click "Create Key", give it a descriptive name like "Make Content QA", and copy the key immediately. Anthropic only shows it once.
Store the key in a password manager before pasting it anywhere in Make. Teams at agencies like Lenka Studio typically store all third-party API keys in a shared secrets vault rather than inside individual automation scenarios, so the key can be rotated without rebuilding every workflow.
Which Claude model should you use?
Use claude-3-5-sonnet-20241022 for this workflow. It returns structured JSON reliably and costs roughly $3 per million input tokens as of mid-2026. Claude 3 Opus is more capable but approximately five times more expensive per token, which adds up quickly when you are reviewing dozens of articles per week. Claude Haiku is cheaper still, but it struggles to follow complex multi-criteria QA prompts without hallucinating criteria you did not ask for.
Step 3: Build the Make Scenario
This is the core of the workflow. You will chain four modules together.
Module 1: Notion Watch Database Items
In Make, create a new scenario. Add the module "Notion > Watch Database Items". Connect your Notion account using OAuth when prompted. Select your content database. Set the filter to only trigger when the Status property equals "Ready for QA". Set the polling interval to 15 minutes. Save.
Common pitfall: Make's Notion trigger uses a cursor to track new and updated items. If you change the Status on an old page, the trigger may not fire on the first poll. Test by creating a fresh page and setting it directly to "Ready for QA".
Module 2: Notion Get Page Content
Add the module "Notion > Get a Page". Map the Page ID from Module 1's output. This retrieves the page metadata. Then add a second module immediately after: "Notion > Get All Blocks". Map the same Page ID. This retrieves the actual body text.
The block output is an array of objects. Each block has a type (paragraph, heading_1, bulleted_list_item, etc.) and a text array inside it. You need to flatten this into a plain string before sending it to Claude.
How do you flatten Notion blocks into plain text?
Add a "Tools > Set Variables" module after the block fetch. Create a variable called plainText and use this Make expression:
{{join(map(3.results; "plain_text"; "paragraph.rich_text[]"); " ")}}
This joins all paragraph block text with a space. It works for standard body copy. If your writers use headings and bullet points heavily, you may need to extend the map to include heading_2.rich_text[] and bulleted_list_item.rich_text[] as well. Test the variable output by running the scenario once and checking the execution log.
Module 3: HTTP Make a Request (Claude API)
Add the module "HTTP > Make a Request". Configure it as follows:
- URL:
https://api.anthropic.com/v1/messages - Method: POST
- Headers: Add
x-api-keywith your Anthropic API key,anthropic-versionwith value2023-06-01, andcontent-typewith valueapplication/json - Body type: Raw
- Content type: JSON (application/json)
Paste this body into the Raw content field, replacing {{plainText}} with the Make variable mapping:
{
"model": "claude-3-5-sonnet-20241022",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "You are a content QA editor. Review the following article draft and return ONLY a valid JSON object with these keys: brand_voice_issues (array of strings), readability_score (integer 1-10), missing_cta (boolean), factual_hedges_needed (array of strings), summary (string, max 2 sentences). Do not include any text outside the JSON object. Article: {{plainText}}"
}
]
}
The instruction to return only a JSON object is critical. Claude 3.5 Sonnet follows this reliably about 97% of the time in practice. The remaining 3% usually happens when the article body is very short (under 100 words) or contains special characters that break the prompt boundary. Add error handling in Step 4 to catch these cases.
Module 4: Parse the Claude Response
Claude returns a response object where the text content sits at choices[0].message.content for OpenAI-style APIs, but the Anthropic API uses a different path: content[0].text. Map this in Make using:
{{4.content[].text}}
Add a "JSON > Parse JSON" module. Set the JSON string to the expression above. Make will parse the QA object into individual mappable fields for the next step.
Step 4: Write QA Feedback Back to Notion
Add the module "Notion > Update a Page". Map the Page ID from Module 1. Set the Status property to "QA Complete". Map the QA Feedback property to a formatted string built from the parsed JSON fields:
Readability: {{6.readability_score}}/10
Missing CTA: {{6.missing_cta}}
Brand Voice Issues: {{join(6.brand_voice_issues; ", ")}}
Factual Hedges Needed: {{join(6.factual_hedges_needed; ", ")}}
Summary: {{6.summary}}
Replace the module number (6) with whatever number your Parse JSON module has in your scenario.
What if the JSON parse fails?
Add an error handler to the HTTP module. Right-click the module, select "Add error handler", and choose "Ignore". Then add a separate "Notion > Update a Page" module in the error path that sets the QA Feedback to "QA failed: Claude returned unexpected output. Please retry." This prevents the page from getting stuck in "Ready for QA" indefinitely.
Step 5: Add the Optional Slack Notification
Add the module "Slack > Create a Message" at the end of the success path. Connect your Slack workspace. Set the channel to your content team's channel. Build the message using the mapped fields:
QA complete for "{{1.properties.Name.title[].plain_text}}"
Readability: {{6.readability_score}}/10
See the Notion page for full feedback.
If you have the Assigned To property populated, you can look up the user's Slack email and use Slack's @mention by email format to notify them directly. This requires an additional "Slack > Look Up a User by Email" module between the Notion update and the message send.
Step 6: Test the Full Workflow End to End
Create a test Notion page. Paste in 300 to 500 words of real draft copy. Set the Status to "Ready for QA". Return to Make and click "Run Once". Watch each module execute in real time. Check that the HTTP module returns a 200 status. Check that the JSON parse module outputs a readable_score field. Check that the Notion page updates with feedback within 30 seconds.
If the HTTP module returns a 529 error, Anthropic's API is overloaded. Add a "Flow Control > Sleep" module for 10 seconds before the HTTP module and retry.
Once the test passes, turn the scenario on. Make will now poll every 15 minutes automatically.
Content teams at SMBs across Australia and Singapore running this setup report saving between three and five hours of manual editing review per week at a cost of roughly $8 to $15 per month in API calls, depending on article volume and length.
If you also want to track how consistent your content is with your broader brand positioning, the Lenka Studio brand health score assessment gives you a structured baseline to feed into your Claude QA prompt as reference criteria.
Frequently Asked Questions
Can I use this with Google Docs instead of Notion?
Yes. Replace the Notion modules with Google Docs modules in Make. Use "Google Docs > Get a Document" to retrieve the body content, and "Google Docs > Insert a Paragraph" to write feedback back. The Claude API call in the middle stays identical.
Does this work with content written in languages other than English?
Claude 3.5 Sonnet handles multilingual content well. Update your QA prompt to specify the language and any language-specific style rules. The JSON output structure stays the same regardless of the article language.
How do I make the QA criteria match my specific brand voice?
Add a brand voice description directly into the system prompt. For example: "Our brand voice is conversational, avoids jargon, and always addresses the reader as 'you'." The more specific you are, the more accurate the brand_voice_issues array will be. You can also paste in two or three example sentences from approved content as reference.
What if the workflow triggers on pages I did not intend to review?
Add a second filter condition in the Make trigger module. Filter by a specific database property, such as a "Content Type" select field set to "Blog Post". This prevents the workflow from running on meeting notes or project briefs that also use the same Notion database.
Is the content I send to the Claude API stored by Anthropic?
As of 2026, Anthropic's standard API does not use request data to train models by default. Check the current Anthropic usage policy at anthropic.com/legal/privacy before sending sensitive client content. If your business is subject to GDPR, Australian Privacy Act, or PIPEDA obligations, review the data processing addendum Anthropic offers for enterprise accounts.
Next Steps
Once this workflow is running reliably, consider extending the Claude prompt to score SEO elements such as missing meta descriptions, thin sections, or keyword gaps. You can also chain a second API call that generates a suggested rewrite for any flagged paragraph, giving writers a concrete edit rather than just a flag.
If you want to build more advanced automation workflows tailored to your content operation, or if the Make scenario logic is getting complex faster than expected, the team at Lenka Studio builds and maintains custom AI automation systems for SMBs across Australia, Singapore, Canada, and the US. Get in touch and walk us through what your content process looks like today.




