How to Automate AI Ad Copy Generator — Meta Ads + Google Ads Headlines, Copy & DALL-E 3 Creatives with n8n
Your ad account has forty-three creatives in it and half of them are variations you wrote at 11pm because Meta's algorithm kept starving your one good ad. Each new campaign means the same grind: five
Your ad account has forty-three creatives in it and half of them are variations you wrote at 11pm because Meta's algorithm kept starving your one good ad. Each new campaign means the same grind: five headlines that don't sound identical, three primary texts that hit different angles, CTAs that match the funnel stage, and a scroll-stopping image — repeated for Meta and again for Google, where the character limits and intent are completely different. A media buyer spends 30–60 minutes per creative set doing this by hand. Multiply that across products, audiences, and objectives and copywriting quietly becomes the bottleneck that caps how fast you can test.
The fix isn't a bigger copywriting team. It's a workflow that takes three inputs — product, audience, objective — and returns a full, platform-specific creative package in under a minute, complete with a DALL·E 3 image and everything logged to Airtable. This article shows you how to build exactly that in n8n.
The problem: copy is the throughput ceiling on paid acquisition
Paid performance is a testing game. The accounts that win are the ones that ship the most viable variations and let the algorithm sort them. But the unit of testing — a creative set — is expensive to produce manually, and the cost is deceptively high:
- Context-switching between platforms. Meta rewards emotional, benefit-led primary text with a soft hook. Google Ads (RSAs) demands keyword-dense 30-character headlines and 90-character descriptions written for high commercial intent. Writing both well means holding two different voices in your head.
- Variation fatigue. By the third headline most people are rewording the first. Real angle diversity — outcome, objection, curiosity, social proof — takes deliberate effort that erodes under deadline.
- The creative is a separate job entirely. Even with great copy, someone still has to brief a designer or fumble through a stock library for an image that matches the message.
- Nothing gets logged. Copy lives in Slack threads and Google Docs, so you can't answer "which angle won last quarter?" without archaeology.
The result: teams test less than they should, and the copy they do ship regresses to the safe, generic middle. That's the exact opposite of what a testing-driven channel needs.
The solution: one webhook in, a full creative package out
The workflow takes a single structured request — product, audience, and objective — and orchestrates GPT-4o and DALL·E 3 to produce a complete, platform-aware package:
- 5 headline variations spanning distinct angles (outcome, pain, curiosity, proof, urgency)
- 3 primary texts at different lengths and emotional registers
- 3 CTAs matched to the stated objective (lead-gen vs. purchase vs. awareness)
- All of the above generated twice — once tuned for Meta Ads, once for Google Ads character limits and intent
- One DALL·E 3 image creative built from a prompt derived from the product and audience
- Everything written to Airtable as a timestamped record and returned as JSON via the API response
Because it's an API endpoint, it plugs into anything — a Retool internal tool, a Slack slash command, a Google Sheet button, or the next workflow in your stack. Your media buyer submits three fields and gets a ready-to-load creative set back before their coffee cools.
Step-by-step: building it in n8n
Here's the node-by-node structure. The whole thing is a linear flow with one branch for image generation running in parallel.
1. Webhook node (trigger). Add a Webhook node set to POST, path /generate-ads, response mode "Using Respond to Webhook node" so you can return the assembled package at the end. It expects a JSON body like {"product": "...", "audience": "...", "objective": "..."}.
2. Set / Edit Fields node (normalize input). Drop in a Set node to pull the three fields out of {{$json.body}} into clean top-level variables. Add a small validation check here — an IF node that routes to an error response if any field is empty saves you from spending OpenAI tokens on garbage requests.
3. OpenAI node — Meta Ads copy. Use the OpenAI node in Message a Model mode, model gpt-4o. In the system message, define the copywriter role and force structured output: "Return valid JSON with keys headlines (array of 5), primary_texts (array of 3), ctas (array of 3). Write for Meta Ads: benefit-led, emotional hook in the first line, no character limit anxiety." Interpolate the inputs into the user message: Product: {{$json.product}} | Audience: {{$json.audience}} | Objective: {{$json.objective}}. Set the Output Content as JSON option (or enable JSON mode via response_format) so downstream nodes get parsed objects, not a string blob.
4. OpenAI node — Google Ads copy. A second OpenAI node with a different system prompt: "Write Google Ads RSA assets. Headlines MUST be ≤30 characters, descriptions ≤90 characters, keyword-forward, high commercial intent. Return JSON with keys headlines (5), descriptions (3), ctas (3)." Run this in parallel with the Meta node — connect both off the Set node so they execute concurrently rather than in series.
5. OpenAI (DALL·E 3) node — creative image. Add an OpenAI node in Generate an Image mode, model dall-e-3, size 1024x1024. Build the prompt from the product and audience — a small preceding Set node that composes something like "Professional ad creative for {{product}}, appealing to {{audience}}, clean modern composition, high contrast, no text overlay" gives far better results than passing raw input. Return the image as a URL or binary depending on whether you're storing it or embedding it.
6. Merge node. Use a Merge node (mode: Combine / by position) to bring the Meta copy, Google copy, and image branches back into a single item so you have one object carrying everything.
7. Airtable node (create record). An Airtable node in Create mode, pointed at your Ads base and table. Map fields: Product, Audience, Objective, Meta_Headlines, Meta_Primary, Meta_CTAs, Google_Headlines, Google_Descriptions, Image_URL, and a Created timestamp. Airtable's long-text fields comfortably hold the JSON-stringified arrays; use {{ JSON.stringify($json.headlines) }} in the field mapping.
8. Respond to Webhook node. Close the loop by returning the full package as JSON with a 200 status so the calling tool gets the copy and image URL synchronously. Include the new Airtable record ID in the response so the caller can link straight to it.
Benefits: what changes once this is live
- Creative-set production drops from ~45 minutes to ~40 seconds. That's not a marginal gain — it removes copy as the constraint on how many tests you can run.
- Platform-native output by default. No more pasting Meta copy into Google and blowing the character limit. Each platform gets copy written for its rules and intent.
- Real angle diversity. Because the prompt explicitly demands distinct angles, you get a genuine spread to test instead of five rewrites of the same sentence.
- An asset library that compounds. Every request lands in Airtable, so you build a searchable history of what you generated, for whom, and when — the raw material for spotting winning patterns later.
- It's composable. As an API, it becomes a building block. Trigger it from a product-launch workflow, a Slack command, or a bulk generator that loops over a spreadsheet of products.
Common pitfalls (and how to avoid them)
Trusting the LLM to obey character limits. GPT-4o will cheerfully hand you a 34-character "30-character" Google headline. Don't rely on the prompt alone — add a Code node after the Google Ads OpenAI node that filters or truncates any headline over 30 chars and any description over 90. Validate, don't hope.
Unparsed JSON breaking downstream nodes. If you don't force JSON output, the OpenAI node returns a string and your Airtable field mapping silently fails or stores markdown fences (```json). Enable JSON mode and, as a belt-and-suspenders measure, strip code fences in a Set node before parsing.
DALL·E 3 image URLs expire. OpenAI's returned image URLs are temporary (they expire within roughly an hour). If you need the creative long-term, add an HTTP Request node to download the binary and push it to Airtable as an attachment or to your own storage (S3, Cloudinary) before the URL dies. Storing only the expiring URL is the single most common "it worked yesterday" bug in this workflow.
Running everything in series. If you chain Meta → Google → DALL·E sequentially, you triple your latency for no reason. Fan the three generation branches out from the input node and reconverge at the Merge node — total runtime becomes the slowest single call, not the sum.
No rate-limit or cost guardrails. An exposed webhook that fires GPT-4o plus DALL·E 3 on every hit is a budget leak waiting to happen. Add basic auth or a header token on the Webhook node, and consider a daily counter in Airtable that short-circuits after N generations. Treat the endpoint like the paid resource it is.
Build it once and copywriting stops being the thing that slows your testing cadence. Submit three fields, get a full platform-native creative package back, logged and ready to load — and spend your time on what actually moves performance: reading the results and deciding what to test next.
Ja construimos isso pra voce
Nao comece do zero. O AI Ad Copy Generator — Meta Ads + Google Ads Headlines, Copy & DALL-E 3 Creatives e um workflow n8n pronto para instalar — conecta suas ferramentas em minutos, sem codigo.
Instalar por $199 →