- Brand
- Adalysis
- Category
- Marketing
- Primary Subcategory
- Ad Campaign Analytics & Reporting
Integration details
Description
Adalysis helps advertisers and agencies analyze their linked PPC Advertising accounts from ChatGPT: review performance, audits, alerts, prioritized tasks, budgets, and much more; surface keyword, search-term, ad-test, quality-score and landing-page issues; and get bid, budget and negative-keyword recommendations.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Ad Campaign Analytics & Reporting
- Secondary Subcategories
- None listed
- Brand
- Adalysis
- Access
- Account required
- First tracked
- 2026-10-24
- Tool count
- 37
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Adalysis
Get updates when Adalysis’s Discoverability Score or category rank changes.
Competing in ChatGPT Ad Campaign Analytics & Reporting
View Category37 tools agents can invoke
How much of the account's AI Max search traffic is queries its ordinary keywords already matched, and how both sides performed. One row per campaign (level=CAMPAIGN, default) or ad group (level=ADGROUP) with AI Max search terms: the AI Max term count, how many also ran as a non-AI Max term in the same campaign (or same ad group — stricter; the two levels do not add up), and the percentage. sections.comparison holds AI Max vs non-AI Max performance for the overlapping terms and, as a baseline, all terms; scope it with campaignId (plus adgroupId at ADGROUP), or nothing for the account. sections.comparison.overlapRule names the rule used: without adgroupId it is SAME_CAMPAIGN even at ADGROUP level, a wider set than the rows — per-ad-group performance needs one call per ad group. Always the last 90 days as of the last sync, whatever period was asked: say so. Conversions are ALL conversions; a ratio absent from a block is undefined, not zero. Overlap is exact query text: shared demand, not proof AI Max took the click, and it names no matched keyword — call it cannibalisation only with the comparison as the evidence. An empty answer means no AI Max terms are held (or they are being rebuilt), not that AI Max is off; aiMaxEnabled and searchTermMatchingEnabled are current settings shown beside 90 days of history. Use it for "is AI Max cannibalising my keywords", "where should I turn AI Max search term matching off", "is AI Max adding anything". Read-only.
get_ai_max_overlap
Adalysis' full audit of one account: its audit score and 30-day trend, and every finding it currently flags with the number of entities affected — conflicting negatives, disapprovals, broken URLs, quality-score problems, budget caps, structural gaps, bid-adjustment and keyword-mining opportunities. Use it for "do a full audit", "where is the waste", "what needs my attention", "what would you fix first". Each row states its status: FLAGGED (flagged now; its count measures the account), MUTED (the owner switched the check off) or NOT_ASSESSED (Adalysis stopped computing it; its value is a constant). Only FLAGGED describes the account. Every other alert reads as zero, and that zero cannot be told from a check that never ran or was dismissed — so an absent finding is "not currently flagged", never "checked and clean", and sections.mutedFindings and sections.notAssessed are gaps, not good news. Only mutedUntil=INDEFINITELY means muted indefinitely; mutedUntilKnown=false means the end date is unknown. Read each count in the unit its label names — duplicate keywords count groups, the common-negative alert counts sets of campaigns; countAvailable=false marks a yes/no check, not one entity; a custom finding with matchCountKnown=false has an unknown count, not zero. Conversion tracking is never audited (sections.conversionTracking): conversions above zero do not show tracking is sound, so say Google Ads itself has to be checked. get_alert_drilldown lists the entities behind a finding; get_prioritised_tasks gives the picture across every account.
get_account_audit
One call that establishes what an account is and how it is doing: campaign and bid-strategy mix, headline performance for the last 30 days against the previous 30, quality score, budget pacing and open issue counts. Call this first for any open-ended request such as an audit, "how are we doing" or "what should I fix first", so the analysis rests on what the account actually contains. Covers the last 30 days only; use get_performance_report for any other period.
get_account_overview
How an account is configured rather than how it performed: campaign type, bid strategy and its targets, budgets and whether they are shared, networks including Search Partners and Display expansion, and device or dimension bid adjustments. Use it whenever the answer depends on setup rather than results: conflicting goals, Search Partners left on, missing or excessive bid modifiers, budgets shared across mismatched campaigns. Pair it with get_performance_report, since settings explain the numbers. Conversion goals and language targeting are not available from this platform.
get_account_structure
Extension (asset) coverage and approval. view=COVERAGE (default): per type — sitelinks, callouts, structured snippets, call, location, promotion, price, image, app — how many campaigns run it, a lower bound on the enabled eligible campaigns lacking it (not a count), and the last 30 days' spend on each side. view=CAMPAIGNS: each enabled campaign with a row in the last 30 days' figures and its count per type — one without figures is not listed; extensionType with missingOnly=true lists those lacking one. view=APPROVAL: assets approved with limits or disapproved, by type and level. It cannot say which extension performs best: Adalysis stores no per-extension clicks, CTR or conversions. Read-only.
get_ad_extensions_audit
Statistical ad-test results inside each ad group: whether Adalysis found a winner, at what confidence, and — with adgroupId — how each ad placed. Use it for "which ads should I pause", "what should I test next" and "is this headline actually better". It answers with significance rather than raw CTR, which is exactly what stops a caller acting on noise: a higher CTR that has not reached the account's confidence threshold is not evidence. outcome=NOT_SIGNIFICANT means the test could not separate the ads, not that they perform alike; NEUTRAL means an ad ranked between the winner and the loser on that metric, which is a position and not a verdict of equivalence; and an ad marked NOT_SUFFICIENT had too little traffic to place and must not be recommended for pausing. Confidence is a percentage; sections.testBasis gives the thresholds behind it. Text ads only — image-ad tests are a separate grid this tool does not read. It reads results; it cannot start a test.
get_ad_tests
How recurring copy patterns perform across the whole account, with statistical verdicts. Adalysis compares the same phrase across many ad groups at once, so a pattern that loses in one ad group by chance can still be judged an account-level winner or loser. Use it for "which themes perform best", "surface headline patterns that consistently underperform", "what phrasing do my top ads share", and to ground new headline ideas in what has worked here. Call it without testId to list the tests, then pass a testId back for each pattern's numbers and its win or lose result. Answer from significance, not raw CTR. Confidence is a percentage — 95 means 95%. outcome=NOT_SIGNIFICANT means the test could not separate the patterns, not that they perform alike; a pattern marked NOT_SUFFICIENT had too little traffic to place, which is never a loss. view=SUGGESTED_TESTS lists asset texts worth testing next: candidates with no verdict, never winners.
get_ad_text_patterns
The entities behind one of Adalysis' six diagnostic alerts, with the figures that triggered each row; sections.config is the threshold and window they were selected against — quote it as the cut rather than inventing one; it cannot be changed or narrowed to campaigns. For a stricter cut, use list_keywords with a metric filter. Use it to turn an audit count into a list you can act on, and for "which keywords are quietly getting more expensive" or "my CPA rose — what caused it". KEYWORD_CPC_RISING, KEYWORD_CPA_RISING, KEYWORD_ROAS_FALLING and AD_CTR_FALLING compare a recent window with a longer baseline window that contains it — never call that week-over-week or period-over-period. KEYWORD_CPA_ABOVE_ADGROUP compares a keyword's CPA with its own ad group's average over one window: no trend at all. KEYWORD_CONVERTING_LOW_IMPRESSION_SHARE compares nothing: it lists converting keywords at or below an impression-share ceiling, so it answers where to raise a bid or budget; Adalysis stores zeros in its old CPA columns, so no CPA is reported and those keywords are never cheap or expensive, only missing impressions. The change figure is Adalysis' own whole percent, named for its direction (risenPct, fallenPct, abovePct), with both inputs on the row; changeAvailable=false means a zero denominator, which Adalysis reports the same way as no change. Rows are a stored snapshot from the last audit run and nothing reports their age: call them flagged, not current. An empty list means nothing is flagged — or the alert is muted, which looks the same; check get_account_audit. Call the alert by sections.alertName, never its alertType.
get_alert_drilldown
Adalysis' own bid-modifier recommendations for DEVICE, LOCATION or AUDIENCE, each beside the modifier currently in place. Use it for "should I bid differently on mobile", "recommend audience bid adjustments", "which location adjustments would matter most". It only proposes; nothing is ever applied. Age, gender, parental status and household income are not available. Explain each recommendation from sections.basis — the goal, aggressiveness, modifier range and settled-for window it was computed against — rather than inventing a rationale. Modifiers are signed percentages: suggestedModifierPercent -15 means bid 15% less there. suggestedModifierCapped means the computed value hit the configured range and the figure shown is that bound — say so. An empty result does not mean nothing to improve: Adalysis discards segments changed too recently, suggestions equal to the current modifier, ones already outside the range, and every decrease under the two INCREASE goals. No campaign-id filter; campaignNameContains narrows by name.
get_bid_adjustment_suggestions
Campaigns whose bid strategy Adalysis has flagged for review — changed within a narrow recent window, and since then with enough clicks and conversions to judge — with the previous and current strategy. Use it for "which campaigns changed bid strategy recently", "did the switch to Target ROAS work", "summarise recent bidding changes". It is a review-what-changed alert, not a recommendation to migrate: Adalysis proposes no target strategy and computes no performance here, so invent neither. To judge whether a change worked, pass each row's comparePeriods — the equal-length windows before and after the change, as Adalysis computed them — to get_performance_report rather than working windows out yourself; comparePeriodsUnavailable means the change is too recent to compare. An empty result usually means nothing changed inside the window, not that every strategy is right; for the strategy each campaign is on today, use get_account_structure. Campaign level only, with no campaign-id filter.
get_bid_strategy_review
Destination URLs the last Adalysis check could not reach — final and mobile URLs, keyword URLs, ad extensions, Performance Max asset groups — plus a separate view for dynamic search ad URLs. Use it for "are any of my links broken", the wasted-spend half of a landing-page question, and to follow up get_account_audit's URLS_BROKEN: the same measurement, so the counts agree and never add. Give a url to see which extensions or asset groups reference it. Adalysis records no HTTP status and no check time, so never guess a 404. A URL vanishing between checks means the table was rebuilt, not that it was fixed. There is no monitored-domains view.
get_broken_urls
Budgets Adalysis flags as capped while performing — leaving conversions unclaimed — with its ceiling estimates of what each could reach uncapped. Use it for "which campaigns are underspending but converting well", "where could I safely scale", "can you find campaigns limited by budget". Adalysis fills no suggested daily budget, so none is returned and none should be invented: size an increase from the headroom ceilings and the impression share lost to budget. The ceilings are estimates, not forecasts, with no conservative/likely/optimistic band; they are whole numbers, so the two value ceilings are truncated and can read below the value already achieved — compare orders of magnitude, not the last digit. Rows carry no campaign names, spend, roas or all-conversion metrics; get_budgets supplies campaign names, spend, roas and all-conversion metrics (find the row by budgetId, or narrow with campaignNameContains). The candidates are only the capped budgets that also carry a boost estimate, a subset of sections.opportunities.accountOpportunityCount: an empty list means no candidate, not that nothing is capped — read that count, or get_budgets' budgetLimited, before saying so. Rows come in Adalysis' own order and cannot be sorted; no projection series is returned.
get_budget_scaling_opportunities
Budgets with their daily amount, month-to-date spend, projected spend, pacing and the impression share lost to budget — the tool for every budget question: which campaigns are limited by budget, which are underspending, what is pacing over or under, how much of the month is left. Read budgetLimited before calling a budget capped: it is Adalysis' comparison of impression share lost to budget against total impression share, and it separates a genuinely capped budget from a cheap one. Where it is absent and budgetLimitedUnprovable is set, the comparison could not run (Adalysis reports that as "false"), so conclude neither way. pacingVsBudgetPercent is signed: negative and UNDER mean underspending. pacing=UNKNOWN is not on target — Adalysis leaves it unset for four reasons, one being spend over double the budget, so read pacingUnknownBecause and say the pace is not stated. pacingSource=DERIVED means the figure was computed here and will not match the Adalysis screen. pacingNoSpend=true means no spend at all this month, usually paused or out of schedule rather than underspending. Figures are always month-to-date, with no date range and no past month; use get_performance_report for a period. Where to add money: get_budget_scaling_opportunities; a what-if across budgets: simulate_budget_reallocation.
get_budgets
What was changed in an account and by whom. Check this before diagnosing a metric shift: a bid-strategy swap, a budget cut or a paused ad group explains more than any amount of metric analysis, and neither log can be inferred from performance data. Two scopes, and they are different logs rather than two views of one. ACCOUNT (the default) is what people did through Adalysis — every account-level action, no campaign attached, reaching back a year, sign-ins excluded. CAMPAIGN is Google's own log for campaigns you name, so it includes edits made directly in the Google Ads interface by anyone with access; it carries the campaign, the entity type and the client the change came through, but Google reports nothing older than 30 days and the first read of a window pulls it live and can take several seconds. Neither log has a structured field, old value or new value: Google's wording arrives already rendered into the action text, which is published as it stands. Nothing changed in one scope says nothing about the other — check both before concluding an account was untouched.
get_change_history
Every account this user can see, side by side in one call: per-account cost, conversions and rates for a period, optionally against a previous one, with each account's audit score and open issue counts. Use it for any question spanning more than one account — "which account dropped most", "how is the portfolio doing", "compare these five clients" — instead of calling the single-account tools once each. Prefer get_account_overview for one account: this is the heaviest tool here, and a period other than LAST_30_DAYS may come back still preparing. With CURRENCY_MIXED there is deliberately no totals block, because the currencies cannot be added: compare on rates and percentage changes, and say why no total is given. Without compare there are no prior figures, which is not a fall to zero. openIssues are five separate counts; never sum them into one.
compare_accounts_performance
Every enabled conversion action on the account: its Google category, whether it is primary (Google's primary_for_goal) or secondary, its ALL conversions and all-conversion value at account level over the period, and the Adalysis conversion sets it belongs to. Use it for which actions exist, which are primary, and which have recorded anything. sections.summary lists primaryWithZeroConversions — primary actions with no conversions and no value in the period: say they should be checked, not that a tag stopped firing, since a rarely-firing action reads the same. No cost is returned and nothing breaks down below account level, so never state a cost per action or a conversion rate from it, or attribute account cost to an action. primary is not "what bidding uses": a campaign's custom goal can bid on a secondary action. The actions' total can differ slightly from the account's all conversions; attribute the gap to no action. Read-only.
list_conversion_actions
Sustained level shifts in one metric, per campaign: the day a new level began, the typical daily value before and after, and the percentage change, largest first. Use it for "when did my CPA jump", "which campaigns changed recently", "what shifted in the last 90 days". It finds step changes, not one-day spikes or slow drifts — never describe one as a spike — and does not say why, so claim no cause. Reads Google Ads live, costing seconds and API quota: call it once per question, not in a loop over metrics or campaigns. For plain period-over-period totals use get_performance_report with compare. Read-only.
detect_performance_changes
Groups of duplicate or near-duplicate keywords competing with each other, each with its combined performance and a cannibalisation rate showing how much traffic the duplicates draw beyond the group's busiest member. Use it for cannibalisation and overlap questions and for the waste section of an audit. Adalysis computes these at the last account sync over a fixed last-30-days window: this tool takes no date range and cannot answer about any other period, so say which window the answer covers rather than repeating the one the question assumed. Pass groupId with its campaignId to see the keywords inside a group; the two thresholds filter the group list only, and campaignId is only for expanding a group — each is refused in the other mode.
get_duplicate_keywords
Adalysis' suggested max CPC for keywords in manual-CPC Search campaigns, beside the current bid, Google's first-page, top-of-page and first-position estimates, quality score, and the figures behind it; sections.basis states the goal and thresholds used (the account's own settings unless overridden). Use it for "which manual bids should I raise", "bids for a target CPA". Automated-bidding campaigns, and campaigns whose budget is capped, have none. Read-only: nothing is saved or applied.
get_keyword_bid_suggestions
Performance by destination page: which URLs the ads and keywords send traffic to (sources says which), what each page cost and converted, and how its keywords' quality scores are distributed. Use it when the question is where traffic lands rather than what was bid on — high click-through with low conversion rate, wasted spend on a page, pages carrying below-average-quality keywords. Page metrics are a fixed last 90 days whatever is asked: quote meta.dateRange, never "the last 30 days". The keyword counts on each row, and a url's keywords, are a 30-day view — do not reconcile the two. Whether a page can appear on several rows, and whether rows add up, is stated in meta.dataFreshnessNote: follow it. Totals cover the listed pages, not account spend, and ad-group counts never add up across pages. Give a url for the keywords pointing at that page, and report each keyword's qualityScoreBucket as the four-way bucket it is, never a score out of ten; NONE means no score on record. Average CPC and bounce rate are not stored: say they are unavailable, not zero.
get_landing_pages
Lists the Google Ads accounts this user can access, with each account's id, currency, timezone and access status. Call this first whenever an account has not been named, when "my account" or "this client" is ambiguous, or to turn a spoken account name into the customerId every other tool needs. Settings only, no performance: for spend use get_account_overview, or compare_accounts_performance across accounts.
list_accessible_accounts
Ads with their creative text, performance, ad strength and approval status, at account, campaign or ad-group scope. Use it to find ads matching a condition — lowest CTR, good CTR but poor conversion rate, disapproved, poor ad strength, copy containing a phrase — and to read the copy itself. Filters run inside Adalysis. Text and image ads are two grids, both read by default, merged and ranked before the limit — leave adType unset unless you mean to exclude one. A responsive ad's headlines come back as a headlines array, the first as its label; its descriptions are assets, not on the ad — use get_rsa_assets for asset text and performance. No benchmark exists for ads: judge weakness against the totals block or get_performance_report groupBy=account. For movement between periods use get_performance_report groupBy=ad; for whether one ad genuinely beats another, get_ad_tests, which answers with significance rather than raw CTR.
list_ads
Keywords with performance, quality score, match type and current bid, at account, campaign or ad-group scope. Use it for any keyword question — high spend with no conversions, high impressions with low CTR, expensive clicks that do not convert, quality score below a threshold, disapproved keywords. Filters run inside Adalysis. Totals cover only the keywords this call returned: on a filtered or truncated call they describe that subset, not an account norm, and Adalysis publishes no account-wide keyword average or keyword benchmark — take a baseline from get_performance_report groupBy=account. For movement between periods use get_performance_report groupBy=keyword.
list_keywords
The actual queries that triggered ads, with performance and the campaign and ad group each belongs to. Use it for every search-term question: impressions but no clicks, spend with no conversions, high CPA, low CTR, top converting terms, terms off your keyword themes, candidates for a new negative. Set source to SEARCH (default), SHOPPING or PMAX; PMAX returns Google's query categories, not literal searches — describe them as themes, never as something somebody typed. Filters run inside Adalysis; a busy account has tens of thousands of terms. Periods differ from the other tools: LAST_6_MONTHS and LAST_1_YEAR work; LAST_WEEK, THIS_MONTH, LAST_MONTH and ALL_TIME do not, and after that refusal never fetch the period from another tool and present it as search terms. Totals cover the terms returned, not the account. There is no period comparison at search-term grain (get_performance_report compares campaigns, ad groups and keywords). Never subtract two calls: the ranges are nested trailing windows and each call is a capped page, so the difference reflects page membership, not change. Two windows shown together are overlapping snapshots — say so.
list_search_terms
Keyword performance summed per match type — EXACT, PHRASE, BROAD and BROAD_PLUS (legacy modified broad) — with how many keywords each has and, in sections.shares, each type's share of cost, clicks and conversions; optionally against the previous period. With matchType, the keywords of that one type instead, sorted and paged. Use it for "how do my match types compare", "is broad worth it", "which phrase keywords cost most". Enabled keywords with stored figures only; no all-conversions, no impression share. Read-only.
get_match_type_breakdown
The account's own keywords that one of its negative keywords blocks, each with the negative, its match type and where it sits (ad group, campaign, shared list, account). sections.summary counts conflicts by level and names the negatives blocking the most keywords. Use it for "are my negatives blocking my own keywords", "which negative list conflicts". These are Adalysis' stored findings from its weekly negative-keyword analysis, so they can be a week old; figures are the keyword's last 30 days. It cannot test a negative you have not added yet. Read-only: it removes and pauses nothing.
get_negative_keyword_conflicts
The account's shared negative keyword lists, as of the last sync: view=LISTS (default) gives each list with its negative and attached-campaign counts; view=KEYWORDS or view=CAMPAIGNS with listId gives the negatives inside one list, or the campaigns it is attached to. No performance: a negative has none. Use it to audit what is already excluded, to explain why a search stopped showing, and before recommending a new negative. Only shared lists are covered — campaign- and ad-group-level negatives are served by no tool yet, so never conclude a campaign has none. Negatives to add: list_search_terms with minCost and maxConversions=0, or get_search_term_ngrams; negatives at the wrong level: get_negative_keyword_suggestions. Read-only.
list_negative_keyword_lists
Adalysis's negative-keyword housekeeping suggestions: negatives that already exist and sit at the wrong level. At level=ADGROUP, a negative present on every enabled ad group in a campaign, which one campaign-level negative would replace; at level=CAMPAIGN, negatives that several campaigns each carry separately, which a shared negative list would hold once. Pass suggestionId with level=CAMPAIGN to see the keywords and the affected campaigns. These are structural suggestions computed from the account's current configuration at the last sync: they carry no cost, clicks or conversions, they cover no date range, and they are NOT a ranked list of new negatives to add. For that question — which terms to exclude to cut wasted spend — use list_search_terms with minCost and maxConversions=0, or get_search_term_ngrams for the wasteful themes. Read-only: this proposes and never applies.
get_negative_keyword_suggestions
Performance Max figures at three grains. view=ASSET_GROUPS (default): each asset group's clicks, cost, conversions and value, with Google's ad strength label and how many headlines, descriptions and images it has. view=ASSETS: each headline, description, image or video's figures, approval status and whether Google auto-created it — for one asset group (assetGroupId) or one asset type across the account (assetType). view=CHANNELS: how spend and conversions split across Search, Display, YouTube, Discover, Gmail and Maps, per campaign, asset group or asset (level). Use it for "which asset groups / assets perform", "where is my PMax budget going". Per-asset figures overlap — one impression serves several assets — and carry no totals: never add assets up or compare their sum with the asset group. The conversion rate is Google's, over interactions rather than clicks, so never recompute it from clicks; totals omit it. sections.networks is summed by this server, not by Google. It cannot answer search terms, placements or overlap with Search campaigns. Read-only.
get_pmax_performance
Performance metrics for one account, grouped by campaign, ad group, keyword, ad or asset group, or as a time series. Use it for any "how is X performing", "which X is best or worst" or "what changed" question. Set compare for both periods and the change in one call, or periods for a run of consecutive windows (month over month, week over week). meta.dateRange states the period actually served and sections.metricUnits what each number means — quote both rather than assuming. Each level reports its own metrics; one it does not measure is refused with the list it does. On a series, sections.seriesRange names each metric's peak and trough and the bucket each fell in: quote them in words, because a chart can hide the movement they describe. A plotting note there means the metrics differ too much in magnitude to share an axis — use separate axes or charts; use a log axis only if asked, and say so.
get_performance_report
Adalysis' own count of what is outstanding across every account this key can see: audit findings per priority group, tripped performance monitors, matching custom filters, accounts with a budget pacing alert, plus the user's routine-task schedule and which routines fall due today. Use it as the opening answer to "what should I do first" and "where should I spend my time" — the ranking is the platform's, not one invented here. Rows are in Adalysis' priority order, not by size: never reorder them by count. Each row counts outstanding items of one type, not one task, and the counts are portfolio-wide with no per-account breakdown — use get_account_audit for one account. A task type in sections.snoozed was dismissed by the user, which is not zero. sections.snoozedUnknown, or a summary with taskTypesWithSomethingToDoKnown=false, means Adalysis returned no counts at all: say so rather than reporting an empty to-do list. The CRITICAL, ERRORS and RECOMMENDATIONS counts are get_account_audit's own arithmetic summed over the accounts, so the two reconcile.
get_prioritised_tasks
Quality score for an account, with the three components — expected CTR, ad relevance, landing page experience — broken out, how its keywords and ad groups distribute across them, the ad groups Adalysis ranks as priorities, and the historical trend. Google reports quality score per keyword, but Adalysis computes and stores a weighted score for each ad group and for the account, so "which ad groups score below 6" is answered directly with level=ADGROUP and belowThreshold=6 — do not decline it or substitute a keyword-level answer. belowThreshold with level=ADGROUP or KEYWORD lists the entities under a number, costliest first, narrowed only by campaignId; level with that level's own id gives that entity's history. An id the chosen mode does not read is refused by name. Components are graded BELOW_AVERAGE, AVERAGE or ABOVE_AVERAGE; one Google did not grade is absent, not a poor grade, and an entity with no score is absent, not scored zero.
get_quality_score_analysis
How the account's live responsive search ads are built: how many ads carry each number of headlines and descriptions, the share at each Google ad strength, and the share pinning no, some or every headline and description position; sections.flags counts ads under 8 headlines and the share below GOOD. Use it for "how good are my RSAs overall", "do we pin too much", "how many ads lack headlines". Asset counts include Google's automatically created assets. It names no ads (use list_ads) and has no performance. Read-only.
get_rsa_quality_summary
Responsive search ad assets — the individual headlines and descriptions — with their performance aggregated across every ad that uses the same text. This is the tool for "which headlines perform worst", "which assets have high CTR but are used in only one campaign", "which copy should I replace", and for grounding new headline suggestions in what already works in this account. Aggregating by text is what makes cross-campaign patterns visible; list_ads shows the same headline once per ad and cannot. The default view carries performance but no approval status and no pinning: those are per asset per ad, so read them with view=BY_AD for one ad, or view=PINNED_ONLY to see where one asset is pinned. Those two return their rows whole and take none of the filtering, paging, sorting or metric inputs — only assetType narrows BY_AD. Rows have no id: assets are keyed by their own text, type and source, which is what you pass back to address one.
get_rsa_assets
Recurring word and phrase fragments mined across an account's search terms, with the performance of every term containing each fragment added together. This is the tool for thematic questions individual terms cannot answer — which themes waste money, what ad-copy themes come out of the top-clicked queries, whether intent has shifted from informational to commercial. One wasteful fragment often justifies a single negative that a hundred individual term exclusions would not. Fragments overlap, so their costs are not additive and never sum to account spend. Rows carry no id — a fragment is not an entity in Google Ads — so follow one up by passing its label to list_search_terms as textContains. Same period vocabulary as list_search_terms, not the campaign tools'. No period comparison exists here either, and two ranges are especially unsafe to subtract: each range's fragments are mined independently with no stable id, so a fragment missing from one is not evidence it stopped occurring.
get_search_term_ngrams
Performance broken out by DEVICE, LOCATION, AUDIENCE, AD_SCHEDULE or HOUR_OF_DAY, with the bid modifier currently in place on each row. Use it for "where is my mobile traffic underperforming", "which hours and days should I bid differently on", "which audiences convert at the lowest CPA", "which locations are wasting spend". Age, gender, parental status, household income and matched location are not available and are refused rather than approximated. Modifiers are signed percentages, never fractions: bidModifierPercent -15 means bids are cut 15% there; bidModifierSet=false means none is set, the same as 0%. Always state the modifier already in place before recommending a new one — "+10% on mobile" means something quite different on a segment at -30% than on one with nothing set. HOUR_OF_DAY is a 168-bucket day-of-week × hour matrix in the account's timezone and carries no modifiers: a time window's modifier is an AD_SCHEDULE setting, so read that segment before proposing a dayparting change. A bucket with trafficRecorded=false had no traffic and carries no metrics — never average or total it as a zero. Reads Google Ads live, so it takes a second or two. For what Adalysis would recommend, use get_bid_adjustment_suggestions.
get_segment_performance
A what-if: proposes new daily budgets across the account's enabled budgets toward an allocation goal, capped per budget, and reports how many days would sit unspent at the projected pace. Nothing is written — applied is false on every response, and applying is a separate Adalysis operation this server does not expose — so never imply the change is made or pending. Use it for "reallocate from underperformers to top performers", "if we cut spend 20%, where should it come from", "which campaigns are under- versus over-funded". Quote proposedTotalDailyBudget, never the requested total: the per-budget cap can stop the target being reached, and requestedTotalMet and shortfall say by how much. goalHadNoEffect=true means every budget moved by exactly the cap and any goal would return the same numbers — do not present it as a strategy. It covers every enabled budget and cannot be restricted to a named subset.
simulate_budget_reallocation
Adalysis ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Adalysis's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Adalysis alternatives on ChatGPT?
As of 2026-10-24, Adalysis competes with Ad Account Health Check, Ad Superpowers, AdKit - Ads Manager, AdPage, adplane, AdsAgent, Adspirer, AdStellar and 60 more in ChatGPT Ad Campaign Analytics & Reporting, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.