The Problem
I was migrating my community from Circle to Skool. Sounds simple, right? Just change a link.
But I had one small detail: 1,000+ articles on ecosistemastartup.com with CTAs hardcoded directly into the HTML, all pointing to comunidad.ecosistemastartup.com.
Why hardcoded? Because I'm obsessed with performance. Every extra WordPress plugin means more milliseconds of load time. The CTAs were baked directly into the post content.
The Obvious Solutions (And Why They Don't Work)
Option 1: SQL Replace
UPDATE wp_posts SET post_content =
REPLACE(post_content, 'comunidad.ecosistema', 'skool.com/cagala-aprende-repite');
Problem: This fixes the URL, but misses the opportunity.
Every article is different:
- Posts about startup grants → CTA about new opportunities
- Posts about funding → CTA about connecting with founders
- Posts about AI/tools → CTA about implementation
A blind replacement generates generic CTAs. Not what I want.
Option 2: Manual (One by One)
Open 1,000+ posts. Read each one. Generate a contextual CTA. Update.
Problem: 100+ hours of tedious work. And I'm human — I get tired, distracted, I make mistakes.
Option 3: Custom Script
Write a Python/Node script that:
- Reads the post
- Uses AI to analyze the content
- Generates a contextual CTA
- Updates WordPress
Problem: Days of development. Debugging. Maintenance. For something I'll use once.
The Real Solution: n8n + Groq + Llama 3.3
I needed something that was:
- ✅ Intelligent (semantic understanding of content)
- ✅ Fast (can't wait weeks)
- ✅ Cheap (ideally free)
- ✅ Reusable (in case I need changes later)
- ✅ Visual (easy to tweak without rewriting code)
The Stack
- n8n (self-hosted): Visual workflow orchestrator
- Groq API: Free access to blazing-fast open source models
- Llama 3.3 70B: Meta's model with strong reasoning
- WordPress REST API: For reading and updating posts
The Workflow (Step by Step)
1. Fetch Posts from WordPress
HTTP Request node → GET /wp-json/wp/v2/posts?per_page=100
Parameters:
-
per_page=100(max per batch) -
_fields=id,title,content,link(only what we need)
2. Process One at a Time
"Split in Batches" node → batch_size=1
Why one at a time? To control rate limits and see progress in real time.
3. The Brain: LLM Agent (Groq + Llama 3.3)
System Prompt:
You are a content editor specialized in CTAs for startup blogs.
RULES:
1. If there is NO CTA → Add one before the last paragraph
2. If it has URL "comunidad.ecosistemastartup.com" → Replace with
"https://www.skool.com/cagala-aprende-repite"
3. If the button is not color #ff6a00 → Fix it
CTA by content type:
- Grant/opportunity posts → "Stay updated on opportunities..."
- Funding posts → "Connect with similar founders..."
- AI/Tools posts → "Discover how others are implementing..."
- Analysis posts → "Go deeper on these topics..."
Respond in JSON:
{
"content": "updated HTML or null",
"hasChanges": true/false
}
User Prompt:
Title: {{ $json.title }}
Categories: {{ $json.categories }}
Content: {{ $json.content }}
4. Decision: Update or Skip?
IF node → {{ $json.hasChanges }} === true
If TRUE → Update WordPress
If FALSE → Log "No changes needed"
5. Update WordPress
HTTP Request node → POST /wp-json/wp/v2/posts/{{ $json.postId }}
Body:
{
"content": "{{ $json.updatedContent }}"
}
6. Loop Back
Returns to the "Split in Batches" node → next post
The Real Numbers
| Metric | Result |
|---|---|
| Workflow design time | 2 hours |
| Execution time (1,000 posts) | ~1.5 hours |
| Cost | $0 (Groq free tier) |
| Posts updated | 847 (rest were already fine) |
| Contextual CTAs generated | 847 |
| Lines of code written | 0 |
Comparison:
| Method | Time | Quality |
|---|---|---|
| SQL replace | 5 min | ❌ Generic CTAs |
| Manual | 100+ hours | ❌ Inconsistent |
| Custom script | 2-3 days dev | ❌ Overkill for one-time use |
| n8n + AI | 3.5 hours total | ✅ Perfect |
Why This Matters
1. No-code + AI = Amplified Judgment
I didn't replace my judgment with AI. I amplified it 1,000x.
I defined:
- WHAT: Update CTAs with relevant context
- WHY: Migrating to Skool + improving conversion
The AI executed the HOW with semantic understanding of the content.
2. Visual > Scripts for Real Business Cases
A visual workflow in n8n is:
- ✅ Easier to understand (even for "future me")
- ✅ Faster to adjust (drag and drop)
- ✅ Easier to reuse (duplicate and modify)
I didn't write code because I didn't need code.
3. Open Source LLMs Are Production-Ready
Llama 3.3 70B via Groq:
- 100-200 tokens/second (10x faster than OpenAI)
- Free (with reasonable limits)
- Comparable quality to GPT-4o for structured tasks
You don't need GPT-5 for this. Open source is enough.
Lessons Learned
Do:
- Start with a small batch: I tested with 10 posts before processing all 1,000
- Detailed logs: Each post logged (updated/skipped/error)
- Conservative rate limits: 1 post every 2-3 seconds (avoids throttling)
- Structured outputs: Guaranteed JSON with schema validation
- Idempotency: Running twice doesn't break anything (detects already-updated posts)
Avoid:
- Not testing enough — I almost launched on the full batch without validating output
- Trusting AI blindly — always validate a sample before running at scale
- Forgetting WordPress cache — I had to purge Cloudflare after
This Workflow Isn't Disposable
I'll reuse it for:
- Seasonal CTA updates (Black Friday, annual grant rounds)
- A/B message testing (mass CTA change, measure conversion)
- Format migrations (if I redesign CTAs in the future)
- Content translation (same flow, different prompt)
Investment: 2 hours
ROI: Infinite (I'll use it 10+ times)
Conclusion
I had a real business problem: 1,000+ posts with CTAs that needed updating with context.
The "easy" solutions (SQL) were insufficient.
The "complex" solutions (manual/script) were inefficient.
n8n + Groq + Llama 3.3 = the perfect middle ground.
This isn't "the future" — this is today.
The tools exist. They're free (or cheap). They're accessible.
The question isn't "can I do this?"
The question is "what else can I automate this way?"
📝 Originally published in Spanish at cristiantala.com
Top comments (0)