- Brand
- Adplane
- Category
- Marketing
- Primary Subcategory
- Ad Campaign Analytics & Reporting
Integration details
Description
Adplane connects your Google Ads and Meta Ads accounts to ChatGPT so you can analyze performance and make changes in the same conversation. Ask questions in plain language and get answers from your live account data, on either platform or both at once. Compare campaigns across any date range, find where spend is going, pull search terms, put Google and Meta results side by side, or write raw GAQL when you need something the report builder does not cover. Money is returned in your account currency, already converted, so numbers can be read as-is. Adplane also builds and changes campaigns. On Google it can create Search campaigns, ad groups, keywords, and responsive search ads, and add negative keywords. On Meta it can create campaigns, ad sets, ads, and creatives built from images and video you provide, with live previews. On both platforms it can update names, budgets, bids, and status on things that already exist. Everything Adplane creates starts paused. A new campaign cannot serve or spend until you explicitly ask to turn it on, and turning something on is a separate, deliberate step through a single tool per platform. Negative keywords only restrict where ads show and can never spend. Deleting is limited to removing a campaign that has never spent, for cleaning up a draft you abandoned; there is no bulk delete. Every change is read back from the platform after it is applied, so what you see reported is what the platform actually stored. Connecting takes one click. Sign in with the Google account you already use for Google Ads and every account you have access to is connected at once. Meta ad accounts connect from your accounts page with a Facebook sign-in. Requires a Google Ads or Meta ad account and an Adplane account at adplane.ai.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Ad Campaign Analytics & Reporting
- Secondary Subcategories
- None listed
- Brand
- Adplane
- Access
- Account required
- First tracked
- 2026-09-04
- Tool count
- 68
- 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 adplane
Get updates when adplane’s Discoverability Score or category rank changes.
Competing in ChatGPT Ad Campaign Analytics & Reporting
View Category68 tools agents can invoke
Creates Google Ads callout, sitelink, structured snippet, or image assets and attaches them to the whole account (scope ACCOUNT: every eligible campaign can show them), to one campaign (scope CAMPAIGN, with campaign_id), or to one ad group (scope AD_GROUP, with ad_group_id). Assets have no budget and cannot spend on their own, but they show with ads that are already serving as soon as they are attached, so confirm the text and images with the user first. asset_type is CALLOUT, SITELINK, STRUCTURED_SNIPPET, or IMAGE, one type per call. items is a list of up to 20 objects (10 for IMAGE): for CALLOUT {text} (up to 25 characters); for SITELINK {link_text, final_url, description1?, description2?} (link_text up to 25 characters, description lines up to 35 and given together or not at all, final_url an absolute http(s) URL); for STRUCTURED_SNIPPET {header, values}, where header is one of Google's headers (Amenities, Brands, Courses, Degree programs, Destinations, Insurance coverage, Models, Neighborhoods, Shows, Styles, Types) and values is 3 to 10 values of up to 25 characters; for IMAGE {image_url, name?} to upload a JPEG, PNG, or GIF from a public URL (up to 5 MB, landscape 1.91:1 at least 600x314 or square 1:1 at least 300x300), or {asset_id} to attach an image asset already in the account; images attach at scope CAMPAIGN or AD_GROUP, not ACCOUNT. Content already attached at the same level is refused. Each new asset charges two operations (the asset and its link), a reused image one, and the batch is applied atomically. The response reads the attached assets back from Google; each one's link_id is what google_remove_object takes to detach it. dry_run: true checks the change with Google without making it.
google_add_assets
Adds search keywords to an existing ad group. Every keyword is ALWAYS created PAUSED, even when the ad group is already paused: enabling keywords goes through google_update_object one at a time, because that is the only path to spending. keywords is a list of up to 100 objects, each {text, match_type, cpc_bid?}: match_type is EXACT, PHRASE, or BROAD; cpc_bid is optional and in the account currency (never micros). Keyword text follows Google's limits (80 characters, 10 words). The batch is applied atomically and charges one operation per keyword. The response reads the stored keywords back from Google, so report those values. dry_run: true checks the change with Google without making it.
google_add_keywords
Adds search keywords to an existing Microsoft Advertising ad group, given with its campaign_id. Every keyword is ALWAYS created Paused, even in a paused ad group: enabling keywords goes through microsoft_update_object one at a time, because that is the only path to spending. keywords is a list of up to 100 objects, each {text, match_type, cpc_bid?}: match_type is Exact, Phrase, or Broad; text is up to 100 characters; cpc_bid is optional, in the account currency. Microsoft adds the keywords it accepts and refuses the others (a duplicate, an editorial rejection): the response lists the stored keywords, read back from Microsoft, and every keyword that was not added with Microsoft's reason. Report both.
microsoft_add_keywords
Adds negative keywords to one Google Ads account, at campaign, ad group, or shared-list scope. Negative keywords only restrict where ads show; nothing this tool does can spend money. items is a list of up to 100 objects, each {scope, scope_id, text, match_type}: scope is campaign, ad_group, or shared_list; scope_id is the id of that campaign, ad group, or existing shared negative-keyword list (this tool does not create new lists); match_type is EXACT, PHRASE, or BROAD. Keyword text follows Google's limits (80 characters, 10 words). The batch is applied atomically and charges one operation per item. The response reads the stored negatives back from Google, so report those values rather than what was requested. google_create_negative_keyword_list creates a new shared list, and google_attach_negative_keyword_list attaches one to campaigns. dry_run: true checks the change with Google without making it.
google_add_negative_keywords
Adds negative keywords to campaigns or ad groups in one Microsoft Advertising account. Negative keywords only restrict where ads show; nothing this tool does can spend money. items is a list of up to 100 objects, each {scope, scope_id, text, match_type, campaign_id?}: scope is campaign or ad_group; scope_id is that campaign's or ad group's id; an ad_group item also needs campaign_id, the ad group's campaign; match_type is Exact or Phrase (Microsoft has no broad match negatives). Text is up to 100 characters. Microsoft applies each campaign's or ad group's negatives separately, so some items can be added while others are refused: the response lists the stored negatives, read back from Microsoft, and every item that was not added with Microsoft's reason. Report both.
microsoft_add_negative_keywords
Attaches an existing shared negative keyword list to one or more Google Ads campaigns, so the campaigns' ads stop showing for searches that match its negative keywords. It cannot spend; on a campaign that is serving, the exclusions apply at once. list_id is the list's id (google_create_negative_keyword_list returns it, and google_run_report resource shared_set lists the account's lists). campaign_ids is a list of up to 100 campaign ids in this account. A campaign that already has the list is listed under already_attached and not changed. The batch is applied atomically and charges one operation per campaign attached. Each attachment's link_id is what google_remove_object (object_type campaign_shared_set) takes to detach the list from that campaign. The response reads the attachments back from Google. dry_run: true checks the change with Google without making it.
google_attach_negative_keyword_list
Lets a TikTok ad account use someone else's existing TikTok post as an ad (Spark Ads), with the authorization code the post's creator generated in the TikTok app (on the post: Ad settings, then Ad authorization). original_post_auth_code is only for a duet or stitch, the code for the original post. It only grants use of the post; it cannot spend. The response's post has the item_id, identity_id and identity_type to pass to tiktok_create_ad (as tiktok_item_id, identity_id and identity_type), the creator's account name, and when the authorization ends.
tiktok_authorize_post
Changes campaign settings that google_update_object cannot: location targeting, excluded locations, radius (proximity) targeting, and the final URL suffix. It never changes status or budget and cannot start a paused campaign; on a campaign that is already serving, targeting changes apply at once, so confirm them with the user first. add_locations and exclude_locations are lists of two-letter ISO country codes or Google geo target constant ids (e.g. "1023191" or "geoTargetConstants/1023191"). remove_criteria is a list of criterion ids of the campaign's current location or radius targets, as this tool's response lists them (a location's criterion id is its geo target constant id); to move a location between targeted and excluded, remove it in one call and add it to the other list in a second. add_proximities is a list of {latitude, longitude, radius, radius_units}, with radius_units KILOMETERS (up to 800) or MILES (up to 500). final_url_suffix is the tracking parameters appended to every final URL, without a leading '?' (e.g. utm_source=google&utm_medium=cpc); an empty string clears it. A change that would leave a targeted campaign with no targeted location is refused, because Google would then target ALL locations. Changes are applied atomically and charge one operation each. The response is Google's own view of the campaign's settings and location targets after the change, read back from the API. dry_run: true checks the change with Google without making it.
google_update_campaign_settings
Creates a complete Google Ads Demand Gen campaign in one step: its own daily budget, the campaign, one ad group, and one image ad. This is also how to create a Google Display Network campaign: pass channels=["DISPLAY"] (Google is moving Display campaigns into Demand Gen). The campaign, its ad group, AND its ad are ALWAYS created PAUSED and cannot serve or spend until google_update_object enables all three (object_type ad, then ad_group, then campaign), which you should do only when the user explicitly asks to launch. Confirm every headline, description, image, and the targeting with the user first. daily_budget is in the account currency (50 means 50.00, never micros); Google requires at least 5 USD a day or the local equivalent. final_url is the landing page. headlines: 1 to 5 of up to 40 characters; descriptions: 1 to 5 of up to 90; business_name: up to 25 characters. Images are given as public http(s) URLs of JPEG, PNG, or GIF files (up to 5 MB each) or as ids of image assets already in the account: logos (1:1, at least 128x128), 1 to 5; marketing_images (landscape 1.91:1, at least 600x314), square_marketing_images (1:1, at least 300x300), portrait_marketing_images (4:5, at least 480x600), and tall_portrait_marketing_images (9:16, at least 600x1067), 1 to 20 in all with at least one landscape or square. channels is optional: omitted means every Demand Gen channel (YouTube, Discover, Gmail, and the Display Network); otherwise a list of DISPLAY, YOUTUBE_IN_FEED, YOUTUBE_SHORTS, DISCOVER, GMAIL (no in-stream: this is an image ad). audience_id is the optional id of ONE audience already in the account (Google allows one per ad group; an audience combines its own segments; find ids with google_run_report, resource audience). optimized_targeting is off unless set to true; when on, Google may show the ads to people beyond the audience. With no audience and optimized targeting off, the ads can show to anyone in the locations on the chosen channels. bidding_strategy is MAXIMIZE_CONVERSIONS (default; optional target_cpa, an average cost per conversion in the account currency), MAXIMIZE_CONVERSION_VALUE (optional target_roas, a ratio of conversion value to cost, 4 means 400 percent), or MAXIMIZE_CLICKS; with a target, Google stores the campaign as Target CPA or Target ROAS. locations is an optional list of two-letter ISO country codes or Google geo target constant ids; if you omit it, Google targets ALL locations. The campaign is declared as not containing EU political advertising, which Google requires. Each uploaded image charges one operation, plus one each for the budget, campaign, ad group, ad, location, and audience, all applied atomically. The response is Google's own stored view, read back from the API, so report those values. dry_run: true checks the change with Google without making it.
google_create_demand_gen_campaign
Creates a complete Google Ads Performance Max campaign in one step: its own daily budget, the campaign, one asset group, and all of its text and image assets. The campaign AND its asset group are ALWAYS created PAUSED and cannot serve or spend until google_update_object enables both (object_type asset_group, then campaign), which you should do only when the user explicitly asks to launch. Confirm every headline, description, and image with the user first. daily_budget is in the account currency (50 means 50.00, never micros). final_url is the landing page. headlines: 3 to 15 of up to 30 characters; long_headlines: 1 to 5 of up to 90; descriptions: 2 to 5 of up to 90, at least one of 60 or fewer; business_name: up to 25 characters. Images are given as public http(s) URLs of JPEG, PNG, or GIF files (up to 5 MB each) or as ids of image assets already in the account: marketing_images (landscape 1.91:1, at least 600x314) and square_marketing_images (1:1, at least 300x300), at least one of each; portrait_marketing_images optional (4:5, at least 480x600); 20 marketing images at most in all; logos (1:1, at least 128x128), 1 to 5, and landscape_logos optional (4:1, at least 512x128), 5 logos at most in all. bidding_strategy is MAXIMIZE_CONVERSIONS (default; optional target_cpa, an average cost per conversion in the account currency) or MAXIMIZE_CONVERSION_VALUE (optional target_roas, a ratio of conversion value to cost, 4 means 400 percent). locations is an optional list of two-letter ISO country codes or Google geo target constant ids; if you omit it, Google targets ALL locations. Unless allow_automation is true, Google is told not to write extra headlines and descriptions and not to send clicks to other pages of the site, so ads use only the given text and final_url. The campaign is declared as not containing EU political advertising, which Google requires. Each asset charges two operations (the asset and its link), a reused image one, plus a few for the budget, campaign, asset group, and locations, all applied atomically. The response is Google's own stored view, read back from the API, so report those values. dry_run: true checks the change with Google without making it.
google_create_pmax_campaign
Creates a new Google Ads Search campaign with its own daily budget. It is ALWAYS created PAUSED and cannot serve or spend until google_update_object enables it, which you should do only when the user explicitly asks to launch. daily_budget is in the account currency (50 means 50.00, never micros). campaign_type is SEARCH (the only supported type). bidding_strategy is MAXIMIZE_CLICKS by default, or MAXIMIZE_CONVERSIONS, MANUAL_CPC, or MAXIMIZE_CONVERSION_VALUE, or the id of a portfolio bidding strategy in this account (see google_create_bidding_strategy), which makes the campaign bid through that shared strategy; the response then also returns the portfolio and the campaigns that share it. target_cpa is an optional average cost-per-conversion target in the account currency, only with MAXIMIZE_CONVERSIONS; target_roas is an optional return-on-ad-spend target as a ratio of conversion value to cost (4 means 400 percent), only with MAXIMIZE_CONVERSION_VALUE; neither goes with a portfolio. locations is an optional list of two-letter ISO country codes or Google geo target constant ids for regions and cities (e.g. "1023191" or "geoTargetConstants/1023191"); if you omit it, Google targets ALL locations, and the response says so, so confirm targeting with the user before enabling. Change targeting later with google_update_campaign_settings. Networks default to Google Search only (no search partners, no Display). The campaign is declared as not containing EU political advertising, which Google requires on every create; EU political ads are banned on Google and cannot be created with this tool. After creating, build the structure with google_create_ad_group, google_add_keywords, and google_create_ad. The response is Google's own stored view of the campaign, read back from the API, so report those values. dry_run: true checks the change with Google without making it.
google_create_campaign
Creates an ad group inside an existing Search campaign, ALWAYS PAUSED. cpc_bid is an optional default bid for the ad group's keywords, in the account currency (2.5 means 2.50, never micros). Add keywords with google_add_keywords and an ad with google_create_ad; nothing serves until google_update_object enables the campaign, the ad group, and the keywords. The response is Google's own stored view, read back from the API, so report those values. dry_run: true checks the change with Google without making it.
google_create_ad_group
Creates a portfolio (shared) bidding strategy in one Google Ads account. strategy_type is TARGET_CPA (pass target_cpa, the average cost per conversion in the account currency; 30 means 30.00, never micros) or TARGET_ROAS (pass target_roas, the conversion value per unit of spend as a ratio; 4 means 400 percent). A new portfolio changes nothing and cannot spend on its own: no campaign bids through it until one is attached, which google_update_object does when given the portfolio's id as a campaign's bidding_strategy, and google_create_campaign does the same for a new campaign. Once campaigns share it, its target is changed with google_update_object (object_type bidding_strategy), which changes bidding on every attached campaign. The name must be unique in the account. The response is Google's stored view, read back from the API. dry_run: true checks the change with Google without making it.
google_create_bidding_strategy
Creates a responsive search ad in an existing ad group, ALWAYS PAUSED. This completes the campaign structure but nothing serves until google_update_object enables it, which you should do only when the user explicitly asks to launch. Google's limits are enforced: 3 to 15 headlines of up to 30 characters, 2 to 4 descriptions of up to 90 characters, an absolute http(s) final_url, and optional display paths of up to 15 characters (path2 requires path1). Google mixes headlines and descriptions per query, so write each to stand alone. The response includes the ad's policy approval status read back from Google; policy rejections name the policy topics. dry_run: true checks the change with Google without making it.
google_create_ad
Creates a website (WEBPAGE) conversion action in one Google Ads account and returns its tag: the global site tag (for every page of the site) and the event snippet (for the page that marks the conversion, such as a thank-you page). It cannot spend. It is created ENABLED so it records conversions once the tag is installed, and as a SECONDARY action: it does not change what Maximize Conversions or any other conversion-based bidding optimises for until the user makes it primary in Google Ads. category is one of DEFAULT, PAGE_VIEW, PURCHASE, SIGNUP, DOWNLOAD, ADD_TO_CART, BEGIN_CHECKOUT, SUBSCRIBE_PAID, SUBMIT_LEAD_FORM, BOOK_APPOINTMENT, REQUEST_QUOTE, GET_DIRECTIONS, OUTBOUND_CLICK, or CONTACT. counting_type is ONE_PER_CLICK (default, right for leads) or MANY_PER_CLICK (right for purchases). default_value is an optional value per conversion in currency_code (default: the account currency; 50 means 50.00, never micros); the tag can still send a different value per conversion. click_through_lookback_days is optional, 1 to 30. The name must be unique in the account. The response is Google's stored view, read back from the API, including the tag; give the user both snippets exactly as returned. dry_run: true checks the change with Google without making it.
google_create_conversion_action
Creates an ad by attaching an existing creative to an existing ad set. ALWAYS PAUSED: this completes the campaign structure but nothing delivers until meta_update_object sets status to ACTIVE, which you should do only when the user explicitly asks to launch.
meta_create_ad
Creates an ad creative: the headline, body text, media, destination URL, and call-to-action button an ad shows. Requires a page_id from meta_list_accounts, because every Meta ad is published by a Facebook Page. message is the main body text; headline is the bold line by the media. By default this builds a single-image link creative. To build a single-video creative instead, pass video_id (from meta_upload_video) together with a thumbnail image (image_hash from meta_upload_image, or image_url) which Meta requires on a video creative; the destination link then rides in the call-to-action. If the video is still processing, this can fail until it is ready. A creative is not deliverable on its own, so this creates nothing that can spend; meta_create_ad attaches it to an ad set.
meta_create_ad_creative
Creates an ad set inside an existing campaign, ALWAYS PAUSED. This is where budget, targeting, and optimization live. targeting must at minimum name geo_locations, e.g. {"geo_locations": {"countries": ["US"]}, "age_min": 25}. You do NOT need to set targeting_automation yourself; the advantage_audience parameter handles it (defaults to False = use your targeting as given, no automatic audience expansion). Budgets are in the account currency (50 means 50.00). If the campaign already has a budget, do not set one here. When optimization_goal is OFFSITE_CONVERSIONS you must pass promoted_object naming the pixel and event, e.g. {"pixel_id": "123", "custom_event_type": "LEAD"}; without it the ad set will not optimize for conversions. Times are ISO 8601 with an offset, e.g. "2026-08-01T09:00:00-0700". For a minimum ROAS (bid_strategy LOWEST_COST_WITH_MIN_ROAS here or on the campaign), pass bid_constraints {"roas_average_floor": 20000}, the floor times 10000 (20000 means 2.0), with optimization_goal VALUE and a promoted_object naming what is valued (for a website, the pixel and its PURCHASE event). When targeting reaches the EU, Meta requires dsa_beneficiary (the person or organization the ads promote) and dsa_payor (who pays for them), sent together, unless the ad account has defaults for both in Ads Manager; ask the user for these names rather than guessing. destination_type is optional; leave it out for website and app ad sets (Meta's default). For an Instant Forms (lead form) ad, send destination_type ON_AD with optimization_goal LEAD_GENERATION under an OUTCOME_LEADS campaign and promoted_object {"page_id": "..."}.
meta_create_ad_set
Creates a new Meta campaign. It is ALWAYS created PAUSED and cannot spend money until meta_update_object activates it. objective is required and cannot be changed later, so confirm it with the user first. special_ad_categories is required by Meta: pass NONE for ordinary ads. If the ads may belong to one of Meta's special ad categories (meta_get_schema lists them), ask the user which one rather than guessing. Leave both budget arguments unset to put budgets on the ad sets instead, which is the more predictable setup; setting a budget here turns on campaign budget optimization and its ad sets must then have none. With a campaign budget, bid_strategy defaults to LOWEST_COST_WITHOUT_CAP (automatic bidding, no per-ad-set bid needed); only set it if you specifically want a bid or cost cap, which then requires bid_amount on each ad set. A budgetless campaign takes its bid strategy per ad set instead, so none is sent here. Call meta_get_schema for valid values and the required/conditional-field list.
meta_create_campaign
Creates a new Microsoft Advertising Search campaign with its own daily budget. It is ALWAYS created Paused and cannot serve or spend until microsoft_update_object sets it Active, which you should do only when the user explicitly asks to launch. daily_budget is in the account currency (5 means 5.00). bidding_strategy is MaxClicks by default, or EnhancedCpc, MaxConversions, or MaxConversionValue; target_cpa (an average cost per conversion, in the account currency) goes only with MaxConversions and target_roas (a ratio, 4 means 400 percent) only with MaxConversionValue, and both need a conversion goal in the account. For Target CPA or Target ROAS, use those pairs: Microsoft Advertising converted the standalone strategies into them in 2025. The campaign targets all languages and, with no location targeting, all locations; the response says so, so confirm targeting with the user before enabling it. Campaign names must be unique in the account. Then build it with microsoft_create_ad_group, microsoft_add_keywords, and microsoft_create_ad. The response is Microsoft's own stored view, read back from the API, so report those values.
microsoft_create_campaign
Creates an ad group inside an existing Microsoft Advertising campaign, ALWAYS Paused. cpc_bid is an optional default bid for its keywords, in the account currency; it applies when the campaign bids with EnhancedCpc. search_partners is the advertiser's choice: true (Microsoft's default) shows ads on Microsoft Advertising's own search network (Bing, AOL and Yahoo) and on its search partner sites, false keeps them to that network only; ask the user if it matters to them, and report the setting the response states. It can be changed later with microsoft_update_object. Ad group names must be unique in the campaign. Add keywords with microsoft_add_keywords and an ad with microsoft_create_ad; nothing serves until microsoft_update_object sets the campaign, the ad group, the keywords, and the ad Active. The response is Microsoft's own stored view, read back from the API, so report those values.
microsoft_create_ad_group
Creates a responsive search ad in an existing Microsoft Advertising ad group, given with its campaign_id, ALWAYS Paused. Nothing serves until microsoft_update_object sets it Active, which you should do only when the user explicitly asks to launch. Microsoft's limits are enforced: 3 to 15 headlines of up to 30 characters, 2 to 4 descriptions of up to 90 characters, an absolute http(s) final_url, and optional display paths of up to 15 characters (path2 requires path1). Toward the character limits, full-width Chinese, Japanese and Korean characters, letters, digits and punctuation count as 2 (a headline holds 15) and emoji can count as 2 or more; a refusal gives Microsoft's exact count. Microsoft mixes headlines and descriptions per query, so write each to stand alone. The response includes the ad's editorial review status read back from Microsoft.
microsoft_create_ad
Creates an ad group in an existing TikTok Smart+ campaign, ALWAYS paused (DISABLE). optimization_goal must fit the campaign's objective (the pairs are under write.objective_optimization_goals in tiktok_get_schema): CONVERT and WEBSITE_ENGAGEMENT need pixel_id and optimization_event (an event name such as COMPLETE_PAYMENT or ON_WEB_REGISTER); an APP_PROMOTION ad group needs app_id and app_platform (APP_ANDROID or APP_IOS), and IN_APP_EVENT also needs optimization_event. Pixels and apps are listed by tiktok_check_readiness. location_ids is required, from tiktok_search_targeting; languages are codes such as en. Adding age_groups, gender, or interest_category_ids switches to custom targeting; without them TikTok targets automatically within the locations and languages, and the response says which applies. budget is the ad group's daily budget in the account currency, required when the campaign has no budget and refused when it has one. cost_cap is an optional target cost per result; without it TikTok bids for maximum delivery. The schedule starts now, or at start_time, and runs until end_time if given (both "YYYY-MM-DD HH:MM:SS" in UTC). Ads run on TikTok only (placement cannot be changed later). Then add ads with tiktok_create_ad. Nothing serves until the campaign, the ad group and an approved ad are all ENABLE, and only tiktok_update_object enables them. The response is TikTok's own stored view of the new ad group.
tiktok_create_ad_group
Creates a new TikTok Smart+ campaign in one ad account. It is ALWAYS created paused (DISABLE) and cannot serve or spend until tiktok_update_object sets it ENABLE, which you should do only when the user explicitly asks to launch. objective is WEB_CONVERSIONS (actions on a website), LEAD_GENERATION, or APP_PROMOTION (with app_promotion_type APP_INSTALL or APP_RETARGETING); TikTok's Smart+ campaigns support only these three. budget is an optional daily budget in the account currency (50 means 50.00): with it, the campaign holds the budget and TikTok spreads it across the ad groups (an average over the week, so one day can reach 125 percent of it); without it, each ad group gets its own daily budget. Leave special_industries out for ordinary ads; if the ads may belong to one of TikTok's special ad categories (tiktok_get_schema lists them under write.special_industries; US and Canada advertisers), ask the user, because it limits targeting and can only be set now. Then add ad groups with tiktok_create_ad_group. The response is TikTok's own stored view of the new campaign, so report those values.
tiktok_create_campaign
Creates one video ad in an existing TikTok Smart+ ad group, ALWAYS paused (DISABLE); it cannot serve until tiktok_update_object enables it (and its campaign and ad group are on and TikTok has approved it). Ads on TikTok run under a TikTok account (Spark Ads): identity_id comes from tiktok_list_identities (a TT_USER or BC_AUTH_TT identity; custom identities can no longer run on TikTok), or, for a creator's post, from tiktok_authorize_post together with identity_type AUTH_CODE. Pass exactly one creative: video_id from tiktok_upload_video, posted to that TikTok account as an ads-only post (not shown on its profile), or tiktok_item_id, an existing TikTok post. A video uses TikTok's own cover frame, added to the creative library, unless cover_image_id (from tiktok_upload_image) is given. ad_texts is one to five texts of up to 100 characters without emoji, required with video_id and optional with a post. landing_page_url is the website the ad opens: required for website and lead (website form) campaigns, left out for app promotion; instant-form lead ad groups are built in TikTok Ads Manager. TikTok's recommended call-to-action buttons are added automatically (saved in the library as a call-to-action portfolio). The response is TikTok's own stored view of the new ad; then offer tiktok_get_preview.
tiktok_create_ad
Creates a shared negative keyword list in one Google Ads account, optionally with its first negative keywords. Several campaigns can share one list; it only restricts where ads show and cannot spend. A new list changes no campaign until google_attach_negative_keyword_list attaches it. name must be unique among the account's negative keyword lists. keywords is an optional list of up to 100 objects, each {text, match_type}: match_type is EXACT, PHRASE, or BROAD, and text follows Google's limits (80 characters, 10 words); a repeated keyword is sent once and listed under already_present. Add more keywords later with google_add_negative_keywords (scope shared_list, scope_id the list's id). The list and its keywords are created in one atomic change that charges one operation for the list and one per keyword. The response is Google's stored view, read back from the API, including the list's id. dry_run: true checks the change with Google without making it.
google_create_negative_keyword_list
Forecasts clicks, cost and average CPC for a Search campaign that does not exist yet, from a keyword list, using Google Keyword Planner. The campaign is described only in the request: nothing is created in the account and nothing spends. keywords: 1 to 1000, all with one match_type: broad (default), phrase or exact. bidding: manual_cpc (default; needs max_cpc_bid, daily_budget optional), maximize_clicks (needs daily_budget; max_cpc_bid caps the bid) or maximize_conversions (needs daily_budget; forecasts conversions and cost per conversion instead of clicks). Amounts are in the account currency. date_range: future dates as YYYY-MM-DD..YYYY-MM-DD, ending within a year; default the next 30 days. locations: up to 10 two-letter country codes (e.g. US) or Google geo target constant ids for regions and cities; omitted means all locations. language: a code such as en, es or de, or a language constant id; default en. customer_id comes from google_list_accounts. The numbers are Google's estimates for the whole period, not a guarantee.
google_get_keyword_forecast
Returns a link that shows one existing TikTok Smart+ ad as TikTok would display it, so the user can check it before turning it on. The link works for 30 days and can be shared. ad_id is the ad's id from tiktok_create_ad or tiktok_list_objects (object_type ad). Read-only: it changes nothing. Call tiktok_list_accounts first for the account_id.
tiktok_get_preview
Gets new keyword ideas from Google Keyword Planner, from seed keywords, a page url, or both. Each idea comes with average monthly searches, competition (LOW, MEDIUM or HIGH, and an index from 0 to 100), and the low and high top-of-page bid in the account currency. Search volumes are Google's approximate monthly averages over the last 12 months, and bids are Google's estimates. Read-only: nothing is created in the account. customer_id comes from google_list_accounts. keywords: up to 20 seed keywords. url: a page to take ideas from. locations: up to 10 two-letter country codes (e.g. US) or Google geo target constant ids for regions and cities; omitted means all locations. language: a code such as en, es or de, or a language constant id; default en. network: search (Google Search, the default) or search_and_partners. limit: 1 to 1000 ideas, default 50. include_monthly adds the searches of each of the last 12 months. For keywords the user already has, use google_get_keyword_volumes.
google_get_keyword_ideas
Gets Google Keyword Planner search volume for a list of keywords: average monthly searches, competition (LOW, MEDIUM or HIGH, and an index from 0 to 100), and the low and high top-of-page bid in the account currency, per keyword. Google merges close variants (car, cars) into one row and lists the merged keywords in close_variants. Volumes are Google's approximate monthly averages over the last 12 months, and bids are Google's estimates. Read-only: nothing is created in the account. This is search demand, not the account's own performance (for that, google_run_report with resource keyword_view). customer_id comes from google_list_accounts. keywords: 1 to 1000. locations: up to 10 two-letter country codes (e.g. US) or Google geo target constant ids for regions and cities; omitted means all locations. language: a code such as en, es or de, or a language constant id; default en. network: search (Google Search, the default) or search_and_partners. include_monthly adds the searches of each of the last 12 months.
google_get_keyword_volumes
Lists Meta's own activity log for one Meta ad account, newest first: what changed (status, budget, bid, schedule, targeting, name, creative, ad review, billing and account events), when, who made the change, the app it came through (Ads Manager, Adplane, or another tool), and the object it touched, with the old and new values where Meta records them. Use it to answer what changed in the account, or who paused, edited, or created something. date_range accepts a preset like TODAY or LAST_30_DAYS, or an explicit "2026-06-01..2026-06-30"; the default is LAST_7_DAYS, and here the LAST_N_DAYS presets include today. Times are in the account's time zone. limit is 1 to 1000 (default 50). For only the changes made through Adplane, across platforms, use list_recent_changes.
meta_list_activity
Lists the current configuration of campaigns, ad sets, ads, or ad creatives on one Meta ad account, including status and budgets. This is the structural view; use meta_run_report for performance. Narrow with campaign_id or adset_id (for creatives, that returns the creatives used by the ads under that parent). Budgets are returned in the account currency. effective_status is the one to read when asking why something is not delivering: it reflects the parent's state and any review outcome, while status only reflects this object's own setting.
meta_list_objects
Lists the current settings of campaigns, ad groups, keywords, ads, or negative keywords on one Microsoft Advertising account: status, budget, bidding, match types, bids, ad text and editorial review status. This is the structural view; use microsoft_run_report for performance. object_type campaign lists every campaign in the account; ad_group needs campaign_id; keyword and ad need ad_group_id; negative_keyword takes campaign_id for campaign negatives, or ad_group_id plus its campaign_id for ad group negatives. Call microsoft_list_accounts first for the account_id.
microsoft_list_objects
Lists the current configuration of campaigns, ad groups, or ads on one TikTok ad account, from both TikTok's standard and Smart+ campaign types (each row says which in family), including status and budget. This is the structural view; use tiktok_run_report for performance. Narrow with campaign_id or adgroup_id. secondary_status is the one to read when asking why something is not delivering: it carries review and budget states, while operation_status is only the on/off setting. Call tiktok_list_accounts first for the account_id.
tiktok_list_objects
Lists the Google Ads accounts this user has connected, with their IDs, names, currencies, and time zones. Call this first in a conversation to resolve which customer_id to use; do not guess or reuse IDs from earlier conversations. All monetary values from other tools are reported in each account's currency_code shown here. If the account the user mentions is not listed, tell them to add it at https://adplane.ai/accounts. Do not try other IDs. When the list is empty the response carries a `notice` saying why (per connected Google login) and what the user can do; relay it to the user as written instead of telling them they have no accounts. A non-empty list can carry a `notice` too (some accounts under a login could not be loaded, so the list may be incomplete); relay that as written as well.
google_list_accounts
Lists the Meta (Facebook/Instagram) ad accounts this user has connected, plus the Facebook Pages available for ad creatives. Call this first in a conversation to resolve which account_id to use; do not guess or reuse IDs from earlier conversations. All money values in other Meta tools are in each account's currency. Also reports when the Meta connection expires, which matters because Meta connections lapse after about 60 days and must be renewed by the user. Each account carries promotable_page_ids: the Pages configured for that account's Promote/boost flow. This is a NARROW set and is not the list of Pages usable in a creative: building a creative only needs a Page role on the connecting user, which every Page in the top-level pages list already has, so a Page absent from promotable_page_ids (even an empty list) can still be used as a creative's page_id. Treat promotable_page_ids as a hint about promote-flow setup, not a gate on creative building; for creatives, use any Page from the top-level pages list. A page in neither promotable_page_ids nor the top-level pages list is not visible to this login. promotable_page_ids of null means Meta could not report the promote-flow set for that account just now. Every Page in the top-level pages list is usable as a creative's page_id (being in that list means you have the Page role a creative needs), so that list is the set to choose a page_id from. Each such Page also carries business_id: the Business that owns it, or null when it has no owning Business. A null business_id is normal and does not affect usability: Pages you administer by role rather than by Business ownership are fully usable in creatives. When the accounts list is empty the response's notice says why (per connected Facebook login) and what the user can do; relay it to the user as written instead of telling them they have no accounts.
meta_list_accounts
Lists the Microsoft Advertising (formerly Bing Ads) ad accounts this user has connected. Call this first whenever Microsoft Advertising or Bing Ads come up, to resolve which account_id to use; do not guess or reuse IDs from earlier conversations. Then call microsoft_get_report_schema before microsoft_run_report. Money values in the other Microsoft tools are in each account's currency. If the list is empty, the notice says why and where the user fixes it; relay it.
microsoft_list_accounts
Lists the TikTok ad accounts (advertisers) this user has connected. Call this first whenever TikTok Ads come up, to resolve which account_id to use; do not guess or reuse IDs from earlier conversations. Then call tiktok_get_schema before tiktok_run_report. Money values in the other TikTok tools are in each account's currency. If the list is empty, the notice says why and where the user fixes it; relay it.
tiktok_list_accounts
Lists the changes this user made in their ad accounts through Adplane, newest first: when, platform, account, what was changed, the object, the assistant that made it, and the outcome. Changes made outside Adplane, or by other Adplane users, are not included. Optional filters: platform (google, meta, or another enabled one), account_id, days (1 to 90, default 30) and limit (1 to 1000, default 50).
list_recent_changes
Lists the identities of one TikTok ad account: the TikTok accounts and custom names its ads can be published under, with each identity_id and identity_type. Every TikTok ad needs one. A custom identity (CUSTOMIZED_USER) can no longer run new ads on placements that include TikTok, only on Pangle and Global App Bundle; ads on TikTok itself need a TikTok account identity (Spark Ads). The notice says when only custom identities exist; relay it. Read-only. Call tiktok_list_accounts first for the account_id.
tiktok_list_identities
Returns everything the other Meta tools will accept: insight levels, report fields, breakdowns, and the exact enum values for campaign objectives, optimization goals, billing events, bid strategies, statuses, and call-to-action types. You MUST call this before using a field or enum value you have not already used successfully in this conversation. Values not returned here are rejected.
meta_get_schema
Returns everything microsoft_run_report and microsoft_list_objects accept: report types (account, campaign, ad_group, ad, keyword, search_query, geographic, asset_group), the attribute, segment and metric columns each report type accepts, time aggregations, and the object types and status values. You MUST call this before using a column or value you have not already used successfully in this conversation. Column names are Microsoft Advertising's own and case-sensitive; values not returned here are rejected.
microsoft_get_report_schema
Returns everything the other TikTok tools accept: report data levels, dimensions, metrics, filter fields, object types, and the status values TikTok reports. You MUST call this before using a field or value you have not already used successfully in this conversation. Values not returned here are rejected.
tiktok_get_schema
Returns the report types (resources) you can query with google_run_report and the exact fields each supports. You MUST call this before using a field you have not already used successfully in this conversation; field names that are not returned by this tool will be rejected. Common resources: campaign, ad_group, keyword_view, search_term_view, ad_group_ad, customer, geographic_view, campaign_budget. For Performance Max: asset_group, campaign_search_term_insight, and performance_max_placement_view.
google_get_report_schema
Permanently deletes ONE Meta campaign that has never spent money, for cleaning up a failed or abandoned campaign that was never launched. This is IRREVERSIBLE and is the only Meta tool that destroys anything, so use it only when the user explicitly asks to delete, and prefer archiving (meta_update_object with status ARCHIVED) whenever the campaign might be wanted again. Only campaigns can be deleted; archive ad sets, ads, and creatives instead. The campaign must have zero lifetime spend: if it has ever spent, or its spend cannot be read, the delete is refused and you are told to archive instead. Deleting a campaign also removes its ad sets and ads.
meta_delete_object
Permanently deletes ONE TikTok campaign that has never spent money, for cleaning up a campaign that was never launched. TikTok has no undo for this, so use it only when the user explicitly asks to remove or delete, and prefer pausing (tiktok_update_object with status DISABLE) whenever the campaign might be wanted again. The campaign must be paused; this tool cannot remove ad groups or ads. It must have zero lifetime spend: if it ever spent, or its spend cannot be verified, the removal is refused. TikTok's spend data can lag about 11 hours, so a campaign that has ever had ad groups or ads is removable only once it has been unchanged that long, and the refusal says when. Deleting a campaign also deletes its ad groups and ads. The response's confirmed_removed reports whether a follow-up read saw the campaign gone.
tiktok_remove_campaign
Permanently removes ONE Google Ads campaign, ad group, ad, or keyword. REMOVED is permanent: Google has no undo, and a removed object can never serve or be edited again (its past statistics stay in reports). Use this only when the user explicitly asks to remove or delete, and prefer pausing (google_update_object with status PAUSED) whenever the object might be wanted again. Removing a campaign also removes its ad groups, ads, and keywords; removing an ad group also removes its ads and keywords. Only positive keywords can be removed (removing a negative keyword would widen where ads show). object_type is campaign, ad_group, ad, or keyword; for ads and keywords, object_id can be the composite adGroupId~id form shown in report resource_names. An object with zero verified lifetime spend is removed on the first call. If it has ever spent, or its spend cannot be verified as zero, a call without confirm removes nothing and reports its lifetime spend instead; show that to the user, and only if they explicitly confirm, call again with the same object and confirm=true. confirm=true is accepted only after a call without confirm reported the spend for that exact object. object_type customer_asset, campaign_asset, or ad_group_asset detaches ONE callout, sitelink, structured snippet, or image from the account, a campaign, or an ad group, with object_id the link_id google_add_assets returned; the asset itself stays in the account, links carry no spend, and no confirm is needed. object_type campaign_shared_set detaches ONE negative keyword list from ONE campaign, with object_id campaignId~listId (the link_id google_attach_negative_keyword_list returns); the list and its keywords stay in the account. The campaign's ads can then show for the searches the list blocked, so on an ENABLED campaign it needs the same confirm step as a spent object. The response's confirmed_removed reports whether a follow-up read saw the REMOVED status, or, for a keyword or an asset link, which Google stops returning once removed, found it gone. dry_run: true checks the change with Google without making it.
google_remove_object
Permanently removes ONE Google Ads campaign that has never spent money, for cleaning up an abandoned scaffold that was never launched. Google has no undo for this: REMOVED is permanent, hides the campaign, and cannot be reversed, so use this only when the user explicitly asks to remove or delete, and prefer pausing (google_update_object with status PAUSED) whenever the campaign might be wanted again. Campaigns only; there is no way to remove ad groups, ads, or keywords with this tool (google_remove_object removes those, and a campaign that has spent once the user confirms). The campaign must have zero lifetime spend: if it has ever spent, or its spend cannot be read or verified, the removal is refused and you are told to pause instead. Removing a campaign also removes its ad groups, keywords, and ads. The response's confirmed_removed reports whether a follow-up read saw the REMOVED status. dry_run: true checks the change with Google without making it.
google_remove_campaign
Permanently deletes ONE Microsoft Advertising campaign that has never spent money, for cleaning up a scaffold that was never launched. Microsoft has no undo for this, so use it only when the user explicitly asks to remove or delete, and prefer pausing (microsoft_update_object with status Paused) whenever the campaign might be wanted again. Paused Search campaigns only (pause it first if it is Active); this tool cannot remove ad groups, ads, or keywords. The campaign must have zero lifetime spend: if it has ever spent, or its spend cannot be verified (including a campaign whose ad groups started more than about three years ago), the removal is refused and you are told to pause instead. Removing a campaign also removes its ad groups, keywords, and ads. The response's confirmed_removed reports whether a follow-up read saw the campaign gone.
microsoft_remove_campaign
Health check: confirms the OAuth connection works end to end.
ping
adplane ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve adplane'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 adplane alternatives on ChatGPT?
As of 2026-10-19, adplane competes with Ad Account Health Check, Ad Superpowers, AdKit - Ads Manager, AdPage, AdsAgent, Adspirer, AdStellar, Adszy and 49 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.