Meta Pixel
Back to Blog
Case study9 min readSep 3, 2026By Andrii Pasika· Founder, LoomaScale

How I Created a Real Google Ads Campaign From ChatGPT

Short answer

You can create a Google Ads campaign from ChatGPT once the account is connected: one prompt naming the goal produced a paused Search campaign, with budget, regions, language, ad group, ad and keywords, in five tool calls. Match types, negative keywords, a bid cap and presence-only geo targeting still needed follow-up asks before activation.

The prompt I used

create new google ads campaign for https://ai.loomascale.com/google-ads-chatgpt for loomascale. The final goal is to transform high-intended users into signups and subscriptions. Design the campaign regions, languages

That is the whole thing, word for word — I have only split it into three blocks here so it is easier to read. Two decisions are hiding in it.

First, I named the goal, not the tactic. Not "build a campaign with these keywords" but "turn high-intent users into signups and subscriptions". Everything downstream — which countries, which match types, what counts as a good click — follows from that sentence, and if I had specified the tactic instead I would have got my own assumptions back in a nicer format.

Second, I handed over regions and languages on purpose. Those are the two settings I would normally guess at, and they are the two where I most wanted to see whether it would reason or just pick something.

What it did before it created anything

It worked for three minutes and fifty seconds across five tool calls, and only the last of those created anything.

It read the connected ad account. It pulled keyword ideas for the page I gave it. It resolved the place names it had chosen into the geo targets Google actually accepts — which matters, because an unrecognised place name is refused before anything is built rather than leaving half a campaign behind.

Then it told me something I had not asked for:

"google ads mcp" shows roughly 2,400 monthly searches across the markets it had selected, while the explicit ChatGPT-integration queries are much smaller. So it made MCP the core acquisition angle instead of leaning only on "connect ChatGPT to Google Ads" searches.

I did not ask for keyword research. I asked for a campaign. It went and looked first, and the finding changed the shape of what it built. That is the part of this that I keep thinking about.

What came back

  • Campaign: LoomaScale | ChatGPT Google Ads | High Intent
  • Campaign ID: 24217769491
  • Landing page: https://ai.loomascale.com/google-ads-chatgpt
  • Budget: 800 UAH/day
  • Bidding: Maximize Clicks, Max CPC 300 UAH
  • Primary optimization goal: SIGNUP
  • Language: English
  • Location setting: Presence only — users physically in the target countries
  • Regions: United States, United Kingdom, Canada, Australia, Germany, Netherlands, Sweden, Denmark

And, in its own words, the campaign was paused and not spending yet.

That pause is not politeness. The tool that creates a campaign has no status parameter at all — the status is fixed in our code before the request ever reaches Google, and the only value the tool can report back is PAUSED. There is no way to phrase a prompt that makes a campaign go live on creation, which is the entire reason I am willing to let an assistant do this on a real account. Going live is a separate tool, and I have to ask for it.

The keyword cluster it built was tight: "google ads mcp", "connect chatgpt to google ads", "google ads chatgpt integration", "chatgpt google ads connector", "manage google ads with chatgpt", "chatgpt google ads plugin", "run google ads from chatgpt". Seven terms, one theme, no drift into "google ads agency" or "ppc management".

The four things I still had to fix — in the same chat

This is the honest part, and it is the reason I am writing this post rather than just tweeting the screenshot. The structure was right. Several defaults were not, and every one of them is a limit of the creation tool rather than a bad decision by the model.

Match types. Everything the create call adds is broad match — the tool has no match-type parameter, so seven broad keywords is all it can produce. Broad match on a term like "google ads mcp" will happily find you people searching for anything adjacent. So the next step was adding the Exact and Phrase versions and deleting the broad ones. Two more tool calls, thirty seconds of reading.

Negative keywords. The create call cannot add them either; negatives are a separate call, and in Google Ads they live at ad group level rather than campaign level. We added job, jobs, salary, course, certification, Reddit and the rest of the low-commercial-intent pattern. On a term this technical, that list is the difference between buying signups and buying curiosity.

The bid cap. A freshly created campaign is Maximize Clicks with no ceiling, which on a small daily budget is a good way to buy four expensive clicks and stop. Max CPC 300 UAH went on afterwards.

The geo mode. New campaigns inherit Google's default, which targets people interested in your locations as well as people in them. For a product where the country is a proxy for purchasing power, interest is noise. Switching it to presence only was a one-line ask.

The primary optimization goal — SIGNUP — was also set after the fact, for the same reason: the create call builds the campaign, and the goal is a separate setting.

None of that took long, and all of it happened in the same conversation without me opening the Google Ads interface. But if you read a post claiming an assistant builds a finished campaign in one shot, that post is selling you something. What it builds is a correct skeleton and a set of defaults you have to look at.

Why those eight countries, and not Spain, Poland or India

The eight were United States, United Kingdom, Canada, Australia, Germany, Netherlands, Sweden and Denmark. Its reasoning, which I agreed with: for an English-language page, start where SaaS purchasing power and everyday English use overlap, and expand later based on actual signup cost rather than on hope. Spain, Poland, India and worldwide targeting were left out deliberately, not forgotten.

I want to be careful about how much credit that deserves. It is a starting hypothesis, not a finding. The only thing that will tell us whether Denmark belongs in that list is the cost per signup from Denmark, and that number does not exist yet. What the reasoning did buy me is a list I can argue with, which is more than a country picker gives you.

One campaign per language, not one campaign with three

I run three landing pages for this topic, one per language, each a separate indexable URL with its own canonical and hreflang. So I ran the same session twice more and now have three campaigns:

  • English — sends traffic to /google-ads-chatgpt, targets the eight markets above, keyword cluster in English.
  • Spanish — sends traffic to the Spanish page, targets Spain, Mexico, Chile, Argentina, Colombia and the United States, with "conectar chatgpt a google ads", "integración chatgpt google ads", "conector google ads chatgpt" and "gestionar google ads con chatgpt" alongside the English head term.
  • Ukrainian — sends traffic to the Ukrainian page, targets Ukraine, Poland, Germany and Czechia, with "підключити chatgpt до google ads", "інтеграція chatgpt google ads" and "керувати google ads через chatgpt".

"google ads mcp" stays in English in all three, because that is what people type regardless of the language they are reading in. The negatives were translated: empleo, trabajo, salario, curso, certificación for Spanish; робота, вакансії, зарплата, курс, навчання for Ukrainian.

Four reasons for the split rather than one campaign with three languages on it:

  • The ad has to match the page. A Spanish ad pointing at an English page is a bounce you paid for. One campaign cannot send different languages to different URLs.
  • Language targeting is a campaign setting, not an ad group one. Splitting is not a preference; it is how the setting works.
  • Budgets are not shared. Each campaign carries its own daily budget, so Spanish cannot quietly eat what I meant to spend on Ukrainian.
  • Cost per signup arrives per language. That is the number I will act on, and a merged campaign averages it into uselessness.

The United States appears in both the English and Spanish campaigns, which sounds like self-competition and is not: the language setting keeps them in separate auctions.

Then I typed "activate it"

activate it

Going live is its own tool, and it is fenced deliberately. It refuses to activate any campaign that was not created through LoomaScale, there is a daily cap on how many campaigns can be activated, and the budget is checked again at go-live rather than trusted from creation time. All three campaigns are enabled now.

There are no results in this post because there are no results yet. What I will judge them on, in two weeks: cost per signup per language, and the share of search terms that are actually about running ads from a chat. Not clicks, not click-through rate, not impression share. If the Denmark hypothesis is wrong, the search terms will say so before the conversion data does.

What I would tell someone doing this tomorrow

Name the goal, not the tactic. "Turn high-intent users into signups" produced a better campaign than any keyword list I would have pasted in.

Make it look before it builds. The 2,400-searches finding arrived because the prompt left room for research. A prompt that dictates the keywords never produces it.

Expect broad match. Everything created comes out broad. Plan on adding Exact and Phrase and removing the rest — it is two calls, and skipping it is how a tight cluster turns into a wide one.

Check the geo mode and the bid cap before activating. Both default to something looser than you want, and both are one sentence to change.

The review is the work. The campaign took four minutes to create and about twenty to read properly. That ratio is the whole thing: creation is now cheap enough that judgement is the only scarce part left.

If you want to try the same session on your own account, the setup takes about two minutes, and the prompt above is a stripped-down version of the fuller templates in the prompt library. How approvals and write access work is in the documentation, and the page these campaigns point at is Google Ads and ChatGPT, connected. For what this same session looks like inside one trade, a landscaper building an installation campaign starts from the crew's capacity rather than from a blank campaign.

— Andrii Pasika, founder of LoomaScale (more about me)

FAQ

Can ChatGPT create a Google Ads campaign on its own?

It can create the whole structure — budget, campaign, geo and language targeting, ad group, responsive search ad and keywords — in a single call, once your Google Ads account is connected to it through a connector. What it cannot do in that call is set match types, add negative keywords, cap the bid or change the location mode, so a real campaign takes a few follow-up asks in the same conversation.

Does the campaign go live automatically?

No. The creation tool has no status parameter at all: the campaign is paused before the request reaches Google, and PAUSED is the only status it can report back. Going live is a separate tool that has to be asked for, it refuses campaigns it did not create itself, and it re-checks the budget at that moment.

Do I need to grant write access for this?

Yes. Reading spend, search terms and conversions works with read access alone, but creating anything needs the manage-campaigns permission, and that is checked on our server on every call rather than taken from what the assistant claims. Without it the answer is a refusal explaining what to reconnect.

Why one campaign per language instead of one multi-language campaign?

Because language targeting is a campaign-level setting and each language has its own landing page. One campaign cannot send Spanish traffic to a Spanish page and English traffic to an English one, budgets are per campaign so a split keeps each language's spend where you put it, and cost per signup arrives per language instead of averaged into one number you cannot act on.

What does a session like this cost?

Nothing extra: the session itself is not metered. A plan covers a number of different ad accounts in a billing month, and the account counts once — the first time the assistant reads it or changes something in it — so building a campaign and then refining it over a dozen follow-up messages costs exactly the same as asking once. New accounts run on a 14-day free trial with unlimited ad accounts, so a session like this costs nothing during it.

Who wrote this

Andrii Pasika, founder of LoomaScale

Andrii Pasika

Founder, LoomaScale

Andrii founded LoomaScale and wrote the Google Ads MCP server behind it. He runs his own campaigns through it, and mail to team@loomascale.com reaches him.

Point it at your own Google Ads or Meta Ads account

Add LoomaScale to ChatGPT or Claude, connect Google Ads or Meta Ads, and get a free waste audit back. New campaigns start paused, inside the spend cap you set.

Run my free waste audit

Connect your assistant to your ad platform

LoomaScale runs inside the assistant you already use. Pick the pair you work with; each guide takes about five minutes.

ChatGPT
Google Ads

Manage Google Ads campaigns from ChatGPT: search terms, budgets and new campaigns, paused for your review. One-click install from ChatGPT's directory.

Read the integration
Claude
Google Ads

Manage Google Ads from Claude: audits, budget changes and new campaigns, every write inside the spend cap you set. Connect from Claude's directory.

Read the integration
Claude Code
Google Ads

Install the LoomaScale plugin in Claude Code with two commands and audit Google Ads from your terminal: search terms, budgets and pacing, with skills built in.

Read the integration
Codex
Google Ads

Install the LoomaScale plugin in OpenAI Codex with two commands and audit Google Ads from your terminal: search terms, budgets and conversion goals.

Read the integration
ChatGPT
Meta Ads

Manage Facebook and Instagram campaigns from ChatGPT: ad sets, budgets and creatives in one chat. The same one-click install.

Read the integration
Claude
Meta Ads

Manage Facebook and Instagram campaigns from Claude: audits, budget caps and new ad sets, inside the limits you set.

Read the integration
Claude Code
Meta Ads

Run Facebook and Instagram campaign reviews from Claude Code: the same plugin, one sign-in, and skills for waste audits, pacing and creative fatigue.

Read the integration
Codex
Meta Ads

Review Facebook and Instagram campaigns from OpenAI Codex: the same plugin and sign-in, with placement, age and lead-quality checks.

Read the integration
Manus
Google Ads

Connect Manus to Google Ads through LoomaScale’s MCP server. Analyze campaigns, keywords and search terms, then request changes within your permissions and spend cap.

Read the integration
Slack
Google Ads

Ask Slackbot about Google Ads in any Slack DM: audits, search terms and pacing checks, with changes kept inside your spend cap. Install the app once per workspace.

Read the integration
Manus
Meta Ads

Connect Manus to Meta Ads through LoomaScale’s MCP server. Review Facebook and Instagram campaigns, ad sets, creatives and placements.

Read the integration
Slack
Meta Ads

Ask Slackbot about Facebook and Instagram campaigns in any Slack DM: delivery, pacing and ad-set spend, read live from Meta Ads.

Read the integration