Your pipeline already generates copy and images. The next step is the most important decision: publish or not?
The "human-in-the-loop" pattern is what separates an AI toy from a real production tool. The human decides. The AI executes. And the most immediate channel for that decision: WhatsApp.
The Approval Architecture
AI generates copy + image → WhatsApp Preview (text + image)
↓
You reply:
┌──────┴──────┐
OK NO (+ feedback)
↓ ↓
Publish to Regenerate with
IG/TikTok your corrections
↓ ↓
WhatsApp: "✅ Resend new
Published" preview
Total review time: 30 seconds. Open WhatsApp, see the image, read the copy. If you like it, "OK." If not, "NO, make it more technical." The AI understands natural language feedback.
WhatsApp Integration Options
Option A: Evolution API (recommended for self-hosted)
Evolution API is an open-source WhatsApp gateway with a clean REST API:
docker run -d -p 8080:8080 atendai/evolution-api
# Send text message
POST http://localhost:8080/message/sendText/evolution
Headers: apikey: YOUR_API_KEY
Body: {
"number": "584140108660",
"text": "📱 *New post ready for review:*\n\n{copy}\n\nOK or NO?"
}
# Send image
POST http://localhost:8080/message/sendMedia/evolution
Headers: apikey: YOUR_API_KEY
Body: {
"number": "584140108660",
"mediatype": "image",
"caption": "Post preview",
"media": "https://your-server/images/preview.png"
}
Option B: Meta WhatsApp Cloud API (official)
Requires a verified Meta Business Account. More bureaucratic but more stable:
POST https://graph.facebook.com/v21.0/{phone_number_id}/messages
Headers: Authorization: Bearer {meta_token}
Body: {
"messaging_product": "whatsapp",
"to": "584140108660",
"type": "image",
"image": { "link": "https://your-server/images/preview.png", "caption": "OK or NO?" }
}
Option C: Direct webhook to OpenClaw (used in this series)
If your AI assistant is already connected to WhatsApp via OpenClaw, the n8n webhook sends the preview and OpenClaw listens for your response:
POST https://ai.guayoyo.tech/plugins/webhooks/approval
Body: {
"action": "send_preview",
"recipient": "+584140108660",
"copy": "post text...",
"image_url": "https://...",
"brief_id": "post-2026-05-14-001"
}
The Circuit in n8n
Node 1: Send Preview via WhatsApp
// HTTP Request → Evolution API
const preview = {
number: "584140108660",
text: `📱 *New post to review*\n\n${$json.hook}\n\n${$json.body}\n\n${$json.hashtags}\n\n${$json.cta}\n\n---\nReply *OK* to publish or *NO* + feedback`,
};
// If image exists, send image first then text
Node 2: Wait for Response (Webhook)
n8n exposes a Webhook node that waits for the response:
Webhook Node (POST /approval-response)
↓
IF node: Does text contain "OK"?
├─ Yes → Continue to publishing
└─ No → Extract feedback → Regenerate
Node 3: Switch — OK or NO
const response = $input.first().json.body.toLowerCase();
if (response.includes("ok") && !response.includes("no ok")) {
return [{ action: "publish", data: $input.first().json }];
} else {
const feedback = response.replace(/^no[,\s]*/i, "").trim();
return [{ action: "regenerate", feedback: feedback, data: $input.first().json }];
}
Node 4: 30-Minute Timeout
If you don't respond within 30 minutes, the flow saves a draft and notifies you:
const draft = {
copy: $json.copy,
image_url: $json.image_url,
status: "draft_timeout",
timestamp: new Date().toISOString()
};
// Save to database or Google Sheet
// Send WhatsApp: "⏰ The 10am post is in drafts. Review when you can."
Complete Circuit Flow
1. Agent generates copy + SD generates image
↓
2. WhatsApp Preview: "📱 New post for review"
↓
3. Webhook waits for your response (30 min timeout)
↓
┌────┴────┐
OK NO + feedback
↓ ↓
4a. Publish 4b. Regenerate
IG/TikTok (back to agent
↓ with feedback)
5. WhatsApp: ↓
"✅ Done" New preview
Why WhatsApp and Not a Dashboard
| Web Dashboard | |
|---|---|
| Requires browser + login | Already open |
| You have to go find it | It comes to you |
| ~2-3 minutes per review | ~30 seconds per review |
| Desktop only | Anywhere |
Friction kills consistency. If publishing requires 3 extra steps, by day three you stop doing it. With WhatsApp, it's a reflex: see, respond, done.
Security: Only You Can Approve
The approval webhook only accepts responses from your number:
if (incoming.from !== "+584140108660") {
return { status: "ignored", reason: "not_authorized" };
}
No one else can approve posts. The circuit is human, but the security is programmatic.
Ready for a content pipeline where you decide and AI executes? At Guayoyo Tech, we build the complete circuit — from generation to publishing, with your approval at every step.
Top comments (0)