How I triage and reply to Meta ad comments with n8n

The short version

To triage Meta ad comments with n8n, you mint a page token, pull the comments off the ad post over the Graph API, then send them to an AI classifier that tags each comment by intent and drafts a reply. Safe questions get an auto-reply, complaints and legal or medical talk go to a person, and spam is ignored. It drafts, but it never posts on its own.

I built this because one ad post on a health-adjacent account can pull a hundred comments, and buried in the noise are real buying questions I was missing for hours. This is a real template I run. Below I walk the actual nodes, the parts that took the most fiddling, and how to point it at your own ad post.

The problem

A paid ad pulls comments faster than anyone can read them, and the ones that matter are the easiest to miss.

When an ad is spending, the comment thread fills up fast. Most of it is noise: tag-a-friend, emojis, spam, the odd angry rant. But somewhere in there is a person asking if they qualify, or how to start, and that is a lead going cold while you scroll. On a health-adjacent account it is worse, because a careless reply about medical or legal matters is a real compliance problem. Reading every comment by hand does not scale, and skimming means you miss the buyers and let the risky ones sit in public.

The noise is real. Meta says it removed more than 100 million fake Pages in 2024. On a live ad that spam buries real buyer questions, and Meta's own tools (hide, profanity filter, keyword block) only work at the Page level, not per campaign.

How most teams deal with it today

There are three common ways to handle ad comments. Each has a catch.

Moderate by hand

Someone opens the post and reads the thread every few hours. It works while volume is low, but it eats time, the reader gets tired and skims, and buying questions still slip through when a post blows up.

Hide or turn off comments

You can lock down comments so nothing needs moderating. It also kills the social proof and the buying questions that make ads convert, and it makes the brand look like it has something to hide.

A social inbox tool

Tools like Hootsuite or Sprout pull comments into one inbox. They are solid, but they bill every month, they still need a person reading each item, and they will not draft a compliant reply for a regulated niche.

The fix

One n8n flow reads the real comments, sorts them by intent, and drafts a reply for each, so a person only touches what matters.

The flow pulls the comments off a live ad post, runs each one past an AI classifier tuned to your brand, and prints a sorted list of who needs a reply, who needs a human, and what to ignore. It drafts a reply for every comment worth answering, but it stops before posting so nothing risky goes public on its own. Here is what it does, in three parts.

Reads real comments off the ad post

It calls the Graph API for the actual comments on a live ad post, drops the empty ones, and keeps the first batch. No CSV export and no scraping, just the real stream a moderator would see.

Sorts each comment by intent

Every comment gets a category, a sentiment and an action from an AI classifier running against a brand-specific system prompt. Buying questions, complaints, spam, fear-and-doubt and praise all get sorted, each with a drafted reply.

Drafts replies, stops before posting

The template reads and drafts but never auto-posts. It prints a triage summary with counts per action so a person can approve the safe ones and step in on the sensitive ones. Posting is a later, gated step.

Loading workflow…
Free download

Want this running on your ad posts?

Take the file and set it up yourself, or book a free call and we wire it into your Page and ad posts for you.

Get your free audit

Build it step by step

Every node in the flow, in order, and how to set each one up. It is a straight line: trigger, fetch, build the request, classify, render.

  1. 1
    When clicking Test · Manual Trigger

    Starts the run by hand so you can watch a batch get triaged before you trust it on a schedule.

    Set it up: Add a Manual Trigger. It is the only trigger in the flow. Later you can swap it for a Schedule Trigger to run on a timer.

  2. 2
    Fetch Real Ad Comments · Code

    Mints a page token, then reads the ad post's comment stream over the Graph API and keeps the first ten comments that have text.

    Set it up: Add a Code node. First call the Graph API for the Page's access_token field using your moderation token, then use that page token to read the post's comments. Set your Page id and ad post id here. It falls back to the original token if the mint returns nothing.

  3. 3
    Build Triage Request · Code

    Assembles the AI call: a brand system prompt, a structured tool schema, and the numbered comments as the user message.

    Set it up: Add a Code node. Write your brand line and compliance rules into the system prompt. Define a tool with category, sentiment, action, draft and reason fields, and force a tool call so the model must return structured data, not a paragraph.

  4. 4
    Classify with Claude · HTTP Request

    Posts the request to the AI model and returns one triage object per comment.

    Set it up: Add an HTTP Request to the model's messages endpoint (the template calls claude-haiku-4-5). Pass your API key as a header and send the body the Build node made. Turn on retry up to three times and continue on fail, so one bad call does not kill the run.

  5. 5
    Render Triage (stdout) · Code

    Maps each result back to its comment, tags it with an action icon, and prints a summary with counts per bucket.

    Set it up: Add a Code node. Read the tool_use block from the model reply, line each result up with its comment by index, and print auto_reply, approve_to_post, route_to_human and ignore counts plus the drafted reply for each comment.

What made it tricky?

Three things ate most of the build time. If you rebuild this, they are where it goes wrong first.

The page-token mint

Comments on a Page's ad post are not readable with your personal user token. The Fetch node first asks the Graph API for the Page's access_token field, then uses that page token for the comments call, with a fallback to the original token if the mint returns nothing. Skip this and every comments call comes back empty.

Structured output, not prose

I do not want a paragraph back, I want one object per comment I can route on. The Build node hands the model a tool schema with category, sentiment, action, draft and reason fields and forces a tool call. The render node reads the tool_use block, so the result is machine-sortable instead of free text I have to parse.

Compliance guardrails

On a disability service, a wrong reply is a real problem. The system prompt bans guarantees of approval and any legal or medical advice, and sends anything sensitive to a person. That is why the template drafts but never auto-posts. The route_to_human bucket is the safety net that keeps risky comments off the public thread.

How do I adapt it to my own setup?

Only a few things are account-specific. Swap those and the fetch, classify and render nodes work as they are.

What you changeWhere it livesNotes
Page id and ad post idFetch Real Ad CommentsPoint it at the Page and the specific ad post whose comments you want to triage.
Moderation tokenEnvironment variableA Page-scoped token that can read comments. The node mints the page token from it.
Brand line and rulesBuild Triage RequestRewrite the brand description and compliance rules in the system prompt so drafts match your voice and your risk.
Post step (optional)After Render TriageAdd a Graph API call gated on the auto_reply bucket once you trust the drafts.

To go live, set the moderation token as an environment variable, drop in your Page and ad post ids, and rewrite the brand line in the Build node. Run it by hand a few times and read the printout before you add any posting. If you would rather not wire the Graph API tokens and prompt yourself, this is exactly the kind of build you can hire an n8n expert to finish. It pairs well with my catch Meta creative fatigue and my log all your ad spend to Airtable.

Wondering what that costs? See what an n8n expert costs in 2026.

Ad comment automation questions, straight answers.

How do I automate Meta ad comment moderation and replies with n8n?

Mint a page access token from your moderation token, read the ad post's comments over the Graph API in a Code node, then send them to an AI classifier that tags each comment by intent and drafts a reply. A render step sorts everything into auto-reply, approve, route-to-human and ignore so you can act fast.

Does this template post replies automatically to Facebook?

No, and that is on purpose. My live template reads real comments, sorts them and drafts replies, but it stops before posting. Auto-posting on a health-adjacent account is risky, so I keep a person in the loop. Adding the post step is one Graph API call once you trust the drafts, gated by the action bucket.

Why mint a page token instead of using my user token?

Reading and replying to comments on a Page's ad post needs a Page access token, not your personal user token. My Fetch node first asks the Graph API for the Page's access_token field using the moderation token, then uses that page token for the comments call. It falls back to the original token if the mint fails.

How does the workflow decide what to auto-reply versus escalate?

The AI classifier returns a set action per comment. Safe real questions become auto_reply with varied wording. Fine but sensitive replies become approve_to_post for a human check. Complaints, legal, medical, refund or strong fear-and-doubt become route_to_human and never auto-post. Spam and off-topic become ignore. The render step counts each bucket for you.

Can I use this for any ad account, not a disability service?

Yes. The only account-specific parts are the Page id, the ad post id and the brand line in the Build node's system prompt. Swap those three and the fetch, classify and render nodes work unchanged. If your niche is regulated, tighten the compliance rules in the system prompt so the drafts stay safe.

How does it keep replies compliant and on-brand?

The Build Triage Request node carries a system prompt that describes the brand and sets hard rules: warm plain tone, no guarantees, no legal or medical advice, and invite eligibility questions to a link or DM. The classifier drafts every reply against those rules, so a route_to_human flag catches anything that should never be auto-posted.

How many comments does it read at once?

The Fetch node asks the Graph API for a small batch, then keeps the first ten comments that actually have text. That is enough to triage a busy ad post in one run without a long AI call. You can raise the limit in the fetch code if a single post pulls far more than that.

Want this running on your ad posts?

30 minutes, free. Bring your Page and a live ad post. You leave with a plan to triage every comment into reply, approve, human or ignore, whether you build it or we do.

Rather have it built for you?

Skip the build. A free 30-minute call and we set this up in your stack, live in a week or two.