Back to AutoAdy

Run Meta ads routines on a schedule

How this works

A routine is a check that runs when you are not watching — yesterday’s spend at 8am, a sweep for ads burning budget at lunchtime, a Monday review. The answer arrives where you already work, and the follow-up question and the fix are both one message away.

AutoAdy does not run the routine for you, and that is deliberate. Your agent already has the two things that make a routine worth having:

  • A schedule and a memory. It can run every four hours and compare what it sees now against what it saw last time — which is what turns a number into a trend.
  • Your other connections. Your store, your CRM, your team’s chat, your project tool. We could never reach those, and the best routines on this page join them to your ad data.

What AutoAdy brings is the Meta side: live account data, the actions to change things, and the media-buying methodology the model can load and follow. Your agent reasons on its own tokens; nothing is metered by us for thinking.

Connect AutoAdy once using whichever section below matches what you run, then pick a prompt from the library. If you get stuck, the troubleshooting guide at the bottom is organised by the symptom you actually see.

Connecting AutoAdy

There is one endpoint, and every client below points at it:

https://www.autoady.io/api/mcp

It accepts two kinds of credential, and picking the wrong one is the most common setup mistake:

  • OAuth 2.1 — add the URL, sign in, approve. Nothing to copy or store. Use this whenever a person is present at setup: claude.ai, Claude Code on your machine, Cursor, Windsurf.
  • An API key (adk_…, from Settings → API keys) sent as Authorization: Bearer. Use this when nobody will be there — a scheduled run, a cron job, CI, your own backend. A sign-in window nobody can click is a routine that fails silently.

Both reach the same tools. The key is not a lesser credential — it is the right one for unattended work.

Claude and Claude routines

This covers claude.ai, the desktop app, and anything scheduled from them — Claude routines and Cowork tasks both use the connector you add here.

Add AutoAdy to Claude

That opens the Add-connector dialog pre-filled. Press Add, sign in to AutoAdy, approve. To do it by hand instead: Settings → Connectors → Add custom connector, paste https://www.autoady.io/api/mcp.

Do not add an Authorization header here. Leave the header fields empty and let the sign-in flow run. A connector authenticated by a static header can end up missing from the connector list a scheduled routine offers you — every connector that does appear there is OAuth-backed. If AutoAdy is absent from that list, this is the first thing to check: remove the entry, re-add it with no header, and complete the sign-in.

Cowork scheduled tasks

The shortest path, and the one we recommend. Cowork’s scheduled tasks run with your connected tools, so once AutoAdy is in your connector list it is available to them.

  1. Add AutoAdy as a connector using the button in the previous section.
  2. In Claude, open Scheduled and choose New task.
  3. Paste one of the prompts below, pick a frequency, and save.

Scheduled tasks are on paid Claude plans. Frequencies run from hourly to weekly.

Claude Code on your machine

For Claude Code running on your own machine, one command:

claude mcp add -s user -t http autoady https://www.autoady.io/api/mcp

Then run /mcp inside Claude Code and pick AutoAdy to complete the sign-in. Check it took with claude mcp list.

If you would rather use a key — or you are setting up a machine that will run unattended later — skip the sign-in and pass the header instead:

claude mcp add -s user -t http autoady https://www.autoady.io/api/mcp \
  -H "Authorization: Bearer adk_YOUR_KEY"

Cloud routines are different — they clone a repo and run in a sandbox, so they need a repo file, an environment variable and a network-allowlist entry. That is the next section.

Claude Code cloud routines

Claude Code routines are a separate feature from Cowork’s scheduled tasks: each run clones a repository and works in a cloud sandbox. You cannot attach AutoAdy through the routine’s connector picker — that path needs an internal connector id Claude doesn’t expose for custom connectors (claude-code#63233). Declare AutoAdy in the repo instead, which is what Claude’s own routines documentation recommends for a server that isn’t in their directory.

All four steps matter. Skipping the third is the usual reason a routine comes back empty.

1. Put this in the repo

A file named .mcp.json at the repository root. Any repo the routine clones will do — a small dedicated one is fine.

{
  "mcpServers": {
    "autoady": {
      "type": "http",
      "url": "https://www.autoady.io/api/mcp",
      "headers": { "Authorization": "Bearer ${AUTOADY_API_KEY}" }
    }
  }
}

Unattended sessions load this automatically — there is no approval prompt to click, and no extra settings file needed. The ${AUTOADY_API_KEY} placeholder is filled in at runtime, so the key itself never goes in the repo.

2. Add your key to the environment

In Claude Code on the web, open the cloud environment for the routine, then Update cloud environment → Environment variables, and add:

AUTOADY_API_KEY=adk_YOUR_KEY

Create the key under Settings → API keys. A key is required rather than OAuth because a scheduled run is unattended — there is no one present to complete a sign-in window.

Worth knowing: Claude’s cloud environments have no dedicated secrets store yet — environment variables are stored in plain text and readable by anyone who can use that environment. Use a personal environment rather than a shared one, give the routine its own key rather than reusing one, and revoke it from Settings → API keys the moment the routine is retired.

3. Allow the sandbox to reach AutoAdy

This is the step people miss. The cloud sandbox only permits outbound traffic to an allowlist, and www.autoady.io is not on the default list — so without this, every AutoAdy call fails with a 403 and the routine reports that it has no AutoAdy tools.

In the same environment dialog, set Network access to Custom, add one line to Allowed domains, and leave the “include default package managers” box ticked:

www.autoady.io

If the dialog refuses to save, end any session currently running in that environment and try again — edits are rejected while one is live.

4. Prove it before you trust it

Run this once as a one-off routine, or as the first scheduled run. It tells you whether steps 1–3 landed, and costs nothing:

List every MCP server available to you and its connection status.
Then call AutoAdy's list-accounts tool and show me the account names it returns.
If anything fails, print the exact error text rather than working around it.

Accounts listed means you are done. Anything else — see below.

When it says AutoAdy isn’t there

All three common failures look identical from inside the conversation: Claude reports no AutoAdy tools, as though nothing were configured. Work through them in this order.

  • The domain isn’t allowed. Most likely cause. Have the routine run curl -s $HTTPS_PROXY/__agentproxy/status — it prints the domains the sandbox will actually reach. If www.autoady.io is missing, step 3 did not take effect.
  • The key is missing or wrong. If the environment variable is not set, Claude sends the literal text ${AUTOADY_API_KEY} as the key and AutoAdy rejects it — which surfaces as “no AutoAdy tools”, not as an auth error. Check for typos in the variable name, and that the key has not been revoked.
  • The server shows as pending approval. A known Claude Code issue where a cloned repository’s config is treated as untrusted. Add this to the environment’s Setup script — the single quotes matter, they keep the placeholder unexpanded so your key stays out of the cached image:
    claude mcp add -s user -t http autoady https://www.autoady.io/api/mcp \
      -H 'Authorization: Bearer ${AUTOADY_API_KEY}' || true

Still stuck? Tell us what the diagnostic printed — Claude’s scheduling features are moving quickly, and we would rather hear it early.

Codex, Cursor and other MCP clients

Codex, Cursor, Windsurf, Claude Desktop, and most other MCP clients read a config file. The form below works in all of them, because it runs AutoAdy’s published bridge over stdio rather than relying on each client’s remote-server support:

{
  "mcpServers": {
    "autoady": {
      "command": "npx",
      "args": ["-y", "@autoady/mcp-server"],
      "env": { "AUTOADY_API_KEY": "adk_YOUR_KEY" }
    }
  }
}

Where that block goes depends on the client — Claude Desktop uses claude_desktop_config.json, Cursor and Windsurf keep an MCP settings file, Codex uses its own config. The shape of the entry is the same; only the file differs.

Clients that speak Streamable HTTP natively can skip the bridge and point at https://www.autoady.io/api/mcp directly with an Authorization: Bearer adk_… header. That is fewer moving parts when your client supports it — and support is being added quickly enough that it is worth checking your client’s current docs rather than trusting a snippet.

Either way the tool list is identical. If a client only shows some of the tools, it is filtering them, not us.

Anything that can make an HTTP request

Every agent framework, workflow tool and scheduler that can make an HTTP request can use AutoAdy without any MCP support at all — n8n, Make, a Lambda, a GitHub Action, your own backend. It is plain JSON-RPC over POST with a bearer key. No OAuth handshake, no session to establish, no handshake call required first:

curl -s https://www.autoady.io/api/mcp \
  -H "Authorization: Bearer $AUTOADY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_account_insights",
      "arguments": { "since": "2026-08-01", "until": "2026-08-20" }
    }
  }'

List everything available with "method": "tools/list" and no params. Pass account_id in arguments to target a specific ad account — an unattended job should always name the account rather than depending on whichever one happens to be active.

This is also the escape hatch when a connector will not attach: put the key in the runner’s secret store and have the agent call the endpoint itself. It is less elegant than a real MCP connection and it removes the dependency entirely.

Prefer REST? The same tools are exposed as one POST endpoint each, with a published OpenAPI 3.1 contract — see the developer docs.

Where the answer lands

Every prompt in the library ends by saying where the answer goes. That line is doing real work: a routine whose output stays inside a chat log you have to go looking for is a routine you stop reading.

The delivery is your agent’s job, not ours. AutoAdy has no Slack connection, no access to your inbox and no idea your project tool exists. What it has is the Meta side. Your agent already holds the rest, so the routine simply tells it where to put the result:

… Deliver it to the #ads channel in my Slack.
… Send it to me on Telegram.
… Email it to me.
… Post it as a comment on the campaign page in Notion.
… Create a task in Asana for each one.
… Write it to a dated file in my Drive folder.

What you need on your side

Whichever destination you want, your agent needs that connection — and it is set up in the same place you added AutoAdy, not here:

  • Claude — add Slack, Gmail, Google Drive, Notion, Asana and the rest under Settings → Connectors, alongside AutoAdy. Anything connected there is available to a scheduled routine.
  • ChatGPT and Codex — connectors and MCP servers are configured per client. Add the destination the same way you added AutoAdy, and name it in the prompt.
  • Claude Code — the sandbox has a shell, so email and webhooks work with a curl and a secret in the environment. For Slack, an incoming-webhook URL is the shortest path.
  • n8n, Make, or your own backend — you already own the delivery leg. AutoAdy is one HTTP call inside a workflow you control.

If a routine reports it delivered something and nothing arrived, the destination almost certainly is not connected — an unattended run will often summarise what it would have sent rather than admit it could not. Add “if you cannot reach the destination, say so explicitly instead of describing what you would have sent” to the prompt, and it stops happening.

A note on where alerts belong

AutoAdy does send its own Telegram, Slack and email alerts — budget overruns, fatigue, performance drops — configured in your settings. Those are fixed checks that run server-side on our schedule.

Routines are the other half: your thresholds, your wording, your destination, and the freedom to join Meta data to anything else you have connected. Use ours for the standing alarms and a routine for everything shaped to how you actually work.

The routine library

These are setup prompts. Paste one into a normal conversation with your agent and it creates the scheduled routine for you — the schedule, the check, the destination and the wording, all in one message. You do not have to find the scheduling UI or work out the cron expression.

Change three things before you send one: the time, the thresholds (the numbers here are starting points, not standards), and the destination — every prompt says Slack, so swap it for wherever you actually read things. If you manage more than one account, name the account too: an unattended routine that guesses which account it is reporting on is worse than no routine.

They are all read-only. Each one ends by telling the agent not to change anything, and that line is worth keeping.

Daily

The two or three minutes that stop a bad night becoming a bad week. Start with the first one — it is the only routine here that can tell you the numbers you are about to read are meaningless.

Can the account still spend?

Daily, first thing — and before any other routineAccounts go dark because a card declined at 2am. Everything else still reports healthy numbers right up until delivery stops.

Set up a routine that runs every weekday at 07:45, before my other routines. On each run, use AutoAdy to check my Meta ad account's delivery status: whether it can still spend, whether it is disabled or restricted and why, and how close it is to any spending limit. Also flag any ads currently disapproved. If everything is clear, send exactly 'account healthy'. If it is not, lead with what is wrong and the exact next step to fix it. Deliver it to my Slack. Never change anything in the ad account.

Morning brief

Daily, on weekdaysCatches an overnight blow-up before it eats the day's budget.

Set up a routine that runs every weekday at 08:00. On each run, use AutoAdy to pull yesterday's results for my Meta ad account — spend, results, cost per result, CPM and link CTR — each compared with the average of the previous 7 days. Call out anything that moved more than 20% either way and say plainly whether it needs action today or can wait. Flag any ad set in Learning Limited and how long since its learning clock reset. Keep it under 200 words. Deliver it to my Slack. If yesterday was unremarkable, send a single line saying so. Never change anything in the ad account.

Wasted spend sweep

DailyMoney leaks quietly. Ads that spend without converting rarely announce themselves.

Set up a routine that runs daily at 13:00. On each run, use AutoAdy to find ads and ad sets that spent meaningfully in the last 7 days with no results, or at a cost per result far above the account average. Before flagging anything, check the spend is high enough for the number to mean something — a bad 48 hours on low volume is noise, not a dead creative. List them worst first with the spend at stake and a pause-or-keep call with your reasoning. Deliver it to my Slack. If there is nothing worth my attention, send exactly 'no leaks'. Never pause anything yourself.

Intraday

Run these every few hours. Each one compares now against what you saw last time, so let the routine keep its own notes between runs — that history is what makes an intraday check possible at all.

Spend pacing

Every 4 hours during the dayUnderdelivery is as expensive as overspend, and it is invisible until the day is over.

Set up a routine that runs every 4 hours between 09:00 and 21:00. On each run, use AutoAdy to pull today's spend so far per campaign and compare it against the daily budget, and against what the same campaigns had spent by this hour on each of the last 3 days — keep your own notes between runs so you have that history. Flag anything pacing more than 20% under, which usually means a bid or audience constraint rather than weak demand, and anything pacing hot enough to exhaust the budget before evening. One line per campaign. Deliver it to my Slack. If everything is on track, send exactly 'pacing normal'. Never change a budget.

Cost-per-result spike

Every 4 hoursA CPA that doubles at noon has spent half a day's budget by the time a daily check sees it.

Set up a routine that runs every 4 hours between 09:00 and 21:00. On each run, use AutoAdy to get today's cost per result so far by campaign, then the same window on each of the previous 3 days for comparison. Flag anything more than 40% above that baseline. Check CPM at the same time — a CPM jump with no creative or targeting change usually leads the CPA by a day or two — and tell me which of the two is happening. Deliver it to my Slack. If nothing is out of line, send exactly 'no spikes'. Never change anything in the ad account.

Weekly

The view that is hard to see day to day. Run them on the same morning so the picture is coherent.

Creative fatigue audit

WeeklyFatigue is gradual, so it is easy to miss until the CPA has already climbed.

Set up a routine that runs every Tuesday at 09:00. On each run, use AutoAdy to review my active ads for creative fatigue over the last 14 days. Lead with cost inflation and declining result volume; treat frequency as a supporting signal, not the trigger. For video ads, look at where viewers drop off — most leaving before the first quarter means the hook, leaving mid-way means the body — and say which. Rank by spend at risk and tell me what to refresh first and why. Deliver it to my Slack. If nothing is fatiguing, send one line saying so. Never pause or change anything.

Where the money actually went

WeeklyPlacement and geography waste is invisible in a campaign-level table, and it is usually the cheapest thing to fix.

Set up a routine that runs every Monday at 09:00. On each run, use AutoAdy to break last week's spend down by placement, and again by country, showing spend, results and cost per result for each. Tell me which placements or countries consumed meaningful budget with nothing to show for it, and whether the volume is high enough for that judgement to be safe. Recommend exclusions worst first. Deliver it to my Slack. If nothing is wasteful, say so in one line. Never make the exclusions yourself.

Scale candidates

WeeklyWinners get under-funded because nobody checks which ones have headroom.

Set up a routine that runs every Monday at 09:30. On each run, use AutoAdy to find ad sets that held at or below my target cost per result for 5 straight days with stable or improving delivery. Load AutoAdy's scaling skill first and follow its methodology. For each candidate give me the current budget, the increase you would make, and the risk of resetting learning — never propose doubling a budget. Rank by confidence. Deliver it to my Slack. If there are no safe candidates, say so plainly rather than stretching for one. Never change a budget yourself.

Tracking and data sanity

WeeklyBad signal in means bad traffic out, and it degrades quietly for weeks before anyone notices.

Set up a routine that runs every Wednesday at 09:00. On each run, use AutoAdy to audit my tracking: whether the pixel is firing and how recently, whether server-side conversions are being received, whether active ads are missing or have malformed UTMs, and whether my custom audiences are still being populated. For each problem, tell me what it is costing me in practice rather than just that it is misconfigured. Deliver it to my Slack. If everything is clean, send exactly 'tracking clean'. Never change anything.

Monthly

Slower questions that never feel urgent and quietly compound.

Structure and bid audit

MonthlyCampaign clutter and stale cost caps accumulate; neither shows up in a performance report.

Set up a routine that runs on the 1st of each month at 09:00. On each run, use AutoAdy to audit my account structure — campaign sprawl, ad sets too thin to exit learning, anything worth consolidating. Then check every cost cap against the last 30 days of actual cost per result: a cap delivering well above it is set too low, one delivering well below has room to tighten. Give me a short prioritised list with the reasoning for each. Deliver it to my email. Never change anything in the account.

Competitor sweep

MonthlyNew angles from competitors are the cheapest source of concepts you would not have thought of.

Set up a routine that runs on the 1st of each month at 10:00. On each run, use AutoAdy to look at what my main competitors are currently running. Summarise the angles and formats that are new since last month rather than listing every ad — keep notes between runs so you know what is actually new. Tell me which one is worth testing against my current best performer, and what specifically I would be testing. Deliver it to my email.

Joining AutoAdy to the rest of your stack

These are the ones worth setting up. AutoAdy supplies the Meta side; your own agent already has the connectors for everything else — your store, your CRM, your project tool, your team's chat. Nothing about them runs on our servers.

True blended ROAS

DailyPlatform-reported ROAS and the money actually in the bank disagree, and only one of them pays salaries.

Set up a routine that runs daily at 09:00. On each run, use AutoAdy to get yesterday's Meta spend and Meta-reported conversions. Then pull yesterday's actual revenue and order count from my store and compute blended ROAS across both. Show Meta's reported number alongside the real one and quantify the gap. If the gap is more than 25% either way, say what would explain it — attribution window, view-through, or genuinely broken tracking — and which you think it is. Deliver it to my Slack. Never change anything in the ad account.

Morning brief into team chat

Daily, on weekdaysThe brief gets read when it arrives where the team already is, and ignored when it needs a login.

Set up a routine that runs every weekday at 08:15. On each run, use AutoAdy to produce the morning performance brief for my Meta ad account: yesterday versus the prior 7-day average, anything that moved more than 20%, and whether it needs action today. Post it to the #ads channel in my Slack, formatted for Slack rather than pasted as raw text. Lead with the one thing that matters most. If nothing does, post a single line saying yesterday was normal. Never change anything in the ad account.

Fatigue becomes a designer brief

Twice weeklyThe gap between spotting fatigue and briefing a replacement is where the CPA climbs.

Set up a routine that runs every Tuesday and Friday at 09:00. On each run, use AutoAdy to find my top-spending ads showing creative fatigue. For each, diagnose what is actually failing — hook, body or offer — using the drop-off and engagement data rather than guessing. Then create a task in my project tool containing the diagnosis, the ad's current numbers, a link to the creative, and a concrete brief for what the replacement should do differently. Keep notes between runs so you never brief the same ad twice. Tell me in Slack what you created. Never pause or change any ad.

Lead quality feedback loop

WeeklyMeta optimises for the event you send it. If unqualified leads count as conversions, it will find you more of them.

Set up a routine that runs every Monday at 10:00. On each run, pull last week's leads from my CRM and grade them against my qualification criteria. Then use AutoAdy to map the qualified and unqualified counts back to the campaigns and ads that produced them. Tell me which ads generate volume but not quality, and whether the pattern points at the creative, the targeting, or the conversion event I am optimising for. Rank by wasted spend. Deliver it to my Slack. Never change anything in the ad account.

Client reporting run

Weekly or monthlyFor an agency this is retention work, and it is the most mechanical thing on the list.

Set up a routine that runs on the 1st of each month at 08:00. On each run, for each of my Meta ad accounts, use AutoAdy to gather last month's spend, results, cost per result and ROAS where available, plus the fatigue issues addressed and the changes made. Write one report per client into my documents folder, using the same structure every month so they stay comparable. Do not send anything to clients — message me in Slack with the list of files when they are ready for review.

Prompts that write to your repo

A Claude Code routine has a repository, a shell and git — so the result can be a file that stays, instead of a message you have to go looking for. These prompts use that; a Cowork task cannot run them.

Each one names the exact path and commit message on purpose. Left vague, an unattended run will invent a new layout every time and the history stops being comparable.

Daily brief, committed to the repo

Daily, on weekdaysBuilds a dated, diffable history of the account that you can scroll back through months later.

Using AutoAdy, pull yesterday's results for my Meta ad account: spend, results, cost per result, and how each compares with the prior 7-day average. Write it to reports/YYYY-MM-DD.md using yesterday's date, with a two-line summary at the top and the numbers in a table below. Note anything that moved more than 20%. Commit the file with the message 'brief: YYYY-MM-DD' and push. Do not change any campaigns.

Exception-only alert

DailySilence when things are fine. A file appears only when something needs you, so the repo itself is the alert.

Using AutoAdy, check for ads that spent meaningfully in the last 3 days with no results, or at more than double the account's average cost per result. If there are none, do nothing at all — no file, no commit, and reply with exactly 'all clear'. If there are any, write alerts/YYYY-MM-DD.md listing each one worst first with the spend at stake and what you would do about it, then commit and push.

Weekly review as a pull request

Weekly, Monday morningLands the review somewhere you can comment on it line by line, which is hard to do with a chat message.

Using AutoAdy, compare last week with the week before: spend, results, cost per result, and ROAS where available. Then consult AutoAdy's audit skill and pick the two highest-leverage changes for this week, with the reasoning for each. Write it to reports/weekly/YYYY-WW.md, create a branch, commit, and open a pull request titled 'Weekly review: week WW'. Do not change any campaigns — the PR is for me to read.

Creative fatigue tracker

Twice weeklyAppending to one file turns fatigue into a trend you can see, rather than a snapshot you forget.

Using AutoAdy, check my active ads for creative fatigue — rising frequency, falling CTR, climbing cost per result. Append a dated section to reports/fatigue-log.md with one line per fatiguing ad and its numbers, so the file reads as a running history. If nothing is fatiguing, append a dated line saying so. Commit and push.

Writing your own

Every setup prompt above follows the same shape. It is worth copying when you write your own, because each part fixes a specific way unattended routines go wrong. Start with “set up a routine that runs…” and a time, then:

  1. Name the window explicitly. “Last week” is ambiguous on a Monday. “The 1st of this month through yesterday, against the same number of days immediately before that” is not — and it is expressible, so use it.
  2. Say what counts as significant. A threshold you chose beats a threshold the model invents, and it makes two runs comparable.
  3. Demand a judgement, not a table. End with “say whether this needs action today”. A routine that hands back numbers has moved the work, not done it.
  4. Say what silence looks like. “If nothing is wrong, reply exactly ‘all clear’.” Without this you get a paragraph of reassurance every day and stop reading them by the second week.
  5. Name the destination. “Deliver it to the #ads channel in my Slack.” A result that stays in a chat log is one you stop reading by week three.
  6. State the blast radius. “Do not change anything” or “pause only, never budgets”. Say it even when you think it is obvious.

One thing worth adding to any rule that kills things: tell it to check there is enough spend for the number to mean anything before it acts. A creative that had a bad two days on low volume is noise. Rules written without that guard reliably kill winners, and the report will read as though they were doing their job.

And for anything that runs on a schedule, keep notes between runs. Comparing today against what you saw yesterday is what makes trend and intraday routines possible — AutoAdy hands you the numbers, your agent is what remembers them.

Why these only read

Every template above is read-only on purpose. A schedule runs when you are not watching, and an unattended budget change is a bad trade even when the reasoning is sound — so these report and recommend, and you decide.

AutoAdy enforces this from its side too, not just by convention: write tools require a Pro plan, are capped per ad account per hour, and are marked as destructive so Claude asks before using them. A key belonging to a Client Viewer cannot write at all.

If you do want changes applied automatically, that is what AutoAdy’s own automation rules are for — they run server-side with guardrails, an audit trail, and a record of what changed and why.

When something is wrong

Before working through symptoms, this one call tells you which layer is broken. Run it from the same place the routine runs — your machine, the sandbox, the workflow tool:

curl -s -i https://www.autoady.io/api/mcp \
  -H "Authorization: Bearer $AUTOADY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
  • A long list of tools — the endpoint, your key and your network are all fine. The problem is in how the client is configured or how the prompt is written.
  • 401 — the key is wrong, revoked, or the variable is empty and the literal text $AUTOADY_API_KEY was sent.
  • 403, or a connection failure — you are in a sandbox that blocks outbound traffic to us. See the network-allowlist step in the Claude Code section.
  • It hangs or cannot resolve the host — egress is blocked entirely; nothing about AutoAdy’s configuration will fix it.

Troubleshooting by symptom

AutoAdy is missing from the connector list when setting up a scheduled routine

The connector was almost certainly added with a static Authorization header. Every connector that does appear in that list is OAuth-backed.

Remove the AutoAdy entry at Settings → Connectors, add it again with the header fields left empty, and complete the sign-in. AutoAdy supports the full OAuth 2.1 flow, so there is nothing to paste — this is the fix people skip because they assume a custom connector must use a key. If it still does not appear, drop the connector requirement entirely and have the routine call the endpoint over HTTP with a key; the routine works identically either way.

The routine reports it has no AutoAdy tools

In a Claude Code cloud routine this has three common causes and they all look identical from inside the conversation — a blocked domain, a missing key, or a config the sandbox treated as untrusted.

Work through them in order in the Claude Code section above — the network allowlist is by far the most likely. Elsewhere, run the diagnostic call at the top of this section from the same environment.

Every call returns 401

The key is wrong or revoked — or the environment variable was never set, in which case the literal placeholder text gets sent as the key.

Check the variable name for typos, confirm the key still exists under Settings → API keys, and make sure your config references the variable in a form the client actually expands. A key that works in your terminal and fails in a scheduled run is nearly always an environment that never received it.

A specific tool returns a Pro-plan message while everything else works

Reads and the published skills work on every plan. Copy generation, creative pushes and the workflow pipelines need Pro or Agency.

Either upgrade, or rewrite the routine to stop at the recommendation — most scheduled routines should not be writing to the account unattended anyway.

It worked, then started failing partway through a long run

Rate limiting. Keys are capped at 60 requests per minute.

A routine sweeping many accounts should pause between them. The response tells you how long to wait — have the routine respect that rather than retrying immediately, which just burns the next window too.

“No Meta ad account connected”, or it reports on the wrong account

The routine is relying on whichever account happens to be active, and that is shared state that something else can change.

Name the account explicitly in the routine — pass the account id with every call. Never have an unattended routine switch the active account: two routines running close together will fight over it and both will report on the wrong one.

The numbers come back empty or all zero

Usually a real answer rather than a fault: no delivery in that window. Occasionally the account is disabled and has genuinely stopped spending.

Run the “can the account still spend” routine first — it distinguishes the two immediately. Also check the window: a routine asking for today early in the morning is reading a partial day, which is why every daily prompt here reports on yesterday.

The dates it reports on are not the ones you asked for

The window was described loosely, so the model picked the nearest preset. “Last week” on a Monday is genuinely ambiguous.

Give explicit dates. Custom windows are supported now — “the 1st of this month through yesterday” and “the same number of days immediately before that” are both expressible, so there is no reason to accept a preset that almost fits.

The output is vague, or the arithmetic looks wrong

The prompt asked for a summary without saying what significant means, or the agent was comparing figures it had parsed out of formatted text.

Put your thresholds in the prompt. On the arithmetic: tool results carry a structured block with raw numbers, an explicit currency code and the exact window applied — if your agent is reading “€1,234.56” and parsing it back into a float, point it at that block instead.

The routine ran, said it was done, and nothing happened

It hit something it could not do and worked around it quietly — a missing permission, a blocked destination, a tool it does not have.

Add one line to the prompt: “if any step fails, stop and report the exact error text rather than working around it”. Unattended runs are strongly inclined to produce a plausible answer instead of an error, and that is the single most useful sentence you can add to any routine.

Still stuck? Tell us what the diagnostic printed — with the status code and the client you are using, we can usually tell you which of these it is straight away.

More

The full tool catalog and the safety model live on the MCP server page. For scripting AutoAdy outside an agent — cron, CI, your own backend — see the developer docs.

Something here not behaving as described? Tell us — scheduling features across these clients are moving quickly and we would rather hear it from you than find out late.