MCP App Store
by KeenEthics

Overview

WeProfit is a conversion tracking, attribution and profit analytics platform for e-commerce stores. This plugin lets you ask ChatGPT about the WeProfit stores your account can access, using the same definitions and data as the WeProfit dashboard. What you can ask for: - Revenue, refunds, taxes, product costs, fees, shipping, ad spend, net profit and margin for a date range, in total or per day. - Profit by channel, network, campaign, ad set or ad, with ROAS, POAS and break-even ROAS. - A combined profit summary across your stores, and a side-by-side store comparison. - How an order was attributed: the method, the confidence label and the recorded evidence. - Tracking health: installation state, event flow, ad network and ad spend connection status, and recent tracking errors. - Custom aggregate reports built from a fixed catalog of dimensions and metrics. - Step-by-step WeProfit guides, for example connecting an ad account or inviting staff. Who it is for: merchants, marketers and agencies that use WeProfit. Limitations: - Read only. The plugin cannot change campaigns, budgets, store settings or store data. For changes, it explains the steps to follow in the WeProfit dashboard. - You sign in with your WeProfit account and approve the access request. Results only cover the stores and data areas your account is allowed to see. - Figures come from the store, cost and ad account data connected to WeProfit and from your settings. Ad spend is recorded per campaign, so ad set and ad rows show no spend.

Tools

compare_campaign_results

ChatGPT
Which campaigns really make money: per campaign, side by side, what the ad network reports (read live, read-only, from the Google Ads, Meta, TikTok and Pinterest accounts connected to this store: spend, impressions, clicks, the network's own conversions and conversion value, its ROAS and cost per conversion) and what WeProfit tracked for the same campaign and days (attributed orders, revenue, net profit after ad spend, POAS, ROAS, cost per order; the get_campaign_profit numbers). Answer: networks[] (only networks with an account connected; network narrows to one), each with summary, attribution (how the network counts conversions and how WeProfit does), accounts (campaigns read live, their totals, errors), weprofitChannel (every WeProfit order from that network, also the ones without a campaign) and campaigns[] {campaignId, campaignName, matchedBy, platform, weprofit, differences, verdict, summary, notes}; rankedByProfit (every network, by WeProfit net profit; the most and the least profitable when there are more than 10); whyTheyDiffer; warnings. differences: conversionsReported vs ordersTracked, conversionsMinusOrders, conversionsPerTrackedOrder, roasReported vs roasTracked and poasTracked; spendLiveMinusWeprofit, conversionValueMinusRevenue and trackedRevenueShareOfReportedValue only when the ad account and the store use the same currency (else currencyNote). Money stays in its own currency (platform.currency, weprofit.currency): never add or compare amounts of different currencies. Why they differ: each network uses its own attribution window and counts view-through and modeled conversions, and several networks can claim one order; WeProfit gives each order to the last ad click within 30 days and counts only orders it received. POAS under 1 means the campaign loses money after ad spend whatever its ROAS. verdict: profitable, unprofitable, break_even, no_tracked_orders, no_weprofit_data or no_weprofit_spend (WeProfit's numbers decide it; when WeProfit has no synced spend for a campaign the network reports spend for, the verdict uses the live spend in the same currency, verdictBasis live_spend and weprofit.netProfitWithLiveSpend, else it is no_weprofit_spend and the campaign is left out of rankedByProfit). Pairing: the network campaign id, else the utm_campaign name (not with campaign_id). A network whose live read fails carries liveError and the others still answer. Live answers are cached for 10 minutes (Pinterest 30) and share the daily allowance of get_google_ads_report, get_meta_ads_report, get_tiktok_ads_report and get_pinterest_ads_report (one campaigns read per network). Needs both the store's settings permission (live reads) and its analytics and attribution permissions (WeProfit's numbers).

compare_stores

ChatGPT
Per-store profit metrics side by side (revenue, net profit, margin, orders, ad spend, ROAS, POAS), sortable, with optional comparison against the previous period of the same length (revenue/profit change %). Answers 'which store improved the most vs last week'.

diagnose_tracking

ChatGPT
Health check for one store: installation state (connected/disconnected/not installed), platform connection statuses, visitor-event flow in the last 24h vs before, errored ad connections, and recent tracking errors, with suggested guides for the likely fix. Use this whenever the user asks why tracking or data looks wrong.

get_ad_spend

ChatGPT
Ad spend for one store and date range: grand total, per-network split, per-day series (store currency, synced + scheduled + manual combined). Same numbers as the dashboard.

get_analytics_summary

ChatGPT
Traffic + conversion summary for one store and date range: visitors, sessions, page views, purchases, revenue, conversion rate, AOV, order tracking coverage, plus a profit block. Same numbers as the dashboard Overview.

get_campaign_profit

ChatGPT
Profit per channel and campaign: attributed orders joined with imported ad spend, with revenue, costs, spend, net profit, POAS, actual/break-even ROAS per campaign, plus an attribution-resolution meter. Includes spend-only campaigns (negative profit). conversions = sign_up + lead events of paid-channel sessions; a paid channel can appear with conversions only. Campaign ids come from the WeProfit URL template or the network default tagging (Meta, Google, TikTok, Pinterest, Snapchat, HubSpot); names come from the connected ad account when the utm carries none. On a store that never had an order source (a custom website) the purchases tracked in the browser with no matching order count too, attributed through their session, with estimated costs (additive browserPurchases, browserPurchaseRevenue, browserPurchaseCosts per node and revenueSource on the totals); the totals then equal get_profit_summary. Same report as dashboard Attribution → Campaign profit. It has NO filters; for per-network or per-channel totals use get_performance_report with group_by network/channel/campaign instead.

get_events

ChatGPT
Tracking events newest first (page views, add to carts, checkouts, purchases…) with source ("Via"), channel, country, visitor and session ids. Omit store_id to search EVERY store this token can read that is not archived (archived stores stay readable by store_id). Filter by event_name, event_id, source, channel, country, visitor_id, session_id, url_contains, checkout_token, cart_token, consent_state, currency, min_value/max_value. Paginated via nextCursor. Page URLs keep the scheme, host, path, utm_* parameters and the ad click and ad tracking parameters WeProfit uses for attribution; other parameter values and token-like path segments show as [redacted], and the part after is left out.

get_google_ads_report

ChatGPT
Live, read-only Google Ads report from the Google Ads accounts connected to this store, read straight from Google Ads like browsing the account (nothing is ever created, changed or paused). Use it for what WeProfit does not store: settings, keywords, search terms, ads, assets, targeting and results as Google reports them. One level per call: campaigns (status, channel type, daily budget, bidding strategy and targets, search impression share, top and absolute-top impression rates, impression share lost to budget and rank), ad_groups (status, default bids), keywords (text, match type, status, bids, quality score and its 3 parts), search_terms (the search term and its status), ads (RSA headlines and descriptions, final URLs, status, ad strength), assets (ad assets with performance label and pinning), asset_groups (Performance Max asset groups and their assets), extensions (sitelinks, callouts, structured snippets, calls, images), audiences, targeting (locations, languages, audiences, demographics, devices and schedule set on campaigns and ad groups), locations (results by country, region and city, with names), devices, demographics (age, gender, income), schedule (day of week and hour), landing_pages, placements (incl. Performance Max), products (Shopping), conversions_by_action, daily (trend), budgets_bidding, negatives (campaign and ad group negative keywords and shared negative lists), change_history (the last 30 days, Google's limit) and recommendations (with the optimization score). Metrics as Google reports them: impressions, clicks, ctr (a ratio: 0.05 = 5%), averageCpc, cost, conversions, conversionsValue, costPerConversion, conversionsFromInteractionsRate, allConversions, viewThroughConversions and video views where relevant, converted from micros to the account currency. Rows are ordered by cost, highest first; default range the last 30 days. For anything else the Google Ads interface shows, use google_ads_query. Auction Insights: WeProfit doesn't have access to Auction Insights data. You can see it in your Google Ads account under Campaigns > Insights and reports > Auction insights. Money is in each ad account's own currency (the currency field on each account): never add amounts of different currencies together. Each account answers separately (accounts[].sections); an account the network refused carries a plain error and the others still answer. Answers are cached for 10 minutes and each store has a daily allowance of live requests; the WeProfit numbers (orders, profit, POAS) stay in get_campaign_profit and get_performance_report.

get_google_analytics_report

ChatGPT
Live, read-only Google Analytics 4 report of this store's own GA4 property (the one connected on the store's Ad networks page with the Google sign-in), read straight from the GA4 Data API (nothing is ever changed). Use it for what GA4 measures that WeProfit does not store: sessions, users, engagement, channels, source / medium, campaigns, landing pages, pages, devices, countries, events, ecommerce, items and key events as GA4 reports them; the store's orders, profit and ad spend stay in get_analytics_summary, get_profit_summary and get_performance_report. Presets: traffic (sessions, users, new users, engaged sessions, engagement rate, average session duration, views and bounce rate by day); channels (by default channel group (Organic Search, Paid Search, Direct, Paid Social...)); source_medium (by session source / medium (google / cpc, google / organic, facebook / paid...)); campaigns (by session campaign (Google Ads campaigns with google / cpc, and utm_campaign values) with its source / medium); landing_pages (by landing page (the first page of the session, without its query string)); pages (by page path and title: views, active users, views per user, engagement time (seconds), events, key events); devices (by device category (desktop, mobile, tablet)); countries (by country (name and ISO code)); events (by event name: event count, users, events per user, event value); ecommerce (by day: purchases, transactions, purchase revenue, average purchase revenue, items purchased, purchasers, first-time purchasers, add to carts, checkouts, refunds); items (by product (item name): items viewed, added to cart, purchased, item revenue); key_events (key events (GA4's new name for conversions) by event name: count, users, session key event rate, value). Custom reports: dimensions (up to 9) and metrics (up to 10) by their GA4 API names (sessionCampaignName, city, itemCategory, customEvent:<parameter>, keyEvents:purchase...), alone or replacing a preset's lists; names outside the presets are checked against the property's own list (custom dimensions and metrics included), and list_fields 'custom' or 'all' lists them. filters (up to 5, all must match): {field: a dimension, match: contains | exact | begins_with | ends_with | not_contains | not_exact (default contains), value, case_sensitive}. from / to YYYY-MM-DD (default the last 28 full days, ending yesterday); compare previous_period or previous_year adds previous, changePercent and previousTotals (one request). limit 1-1000 (default 50; a report split by date alone: every day of the range; date with another dimension: 1000), offset for the next page (nextOffset says where it is; rowCount is the total), order_by a dimension or metric of the report with order asc or desc (default: by day for a by-day report, else the first metric, highest first). Units are GA4's own: rates are ratios (engagementRate 0.55 = 55%), durations in seconds, money in the store currency (currency says which). totals are GA4's own totals for the whole range (users are not double counted). GA4's sampling, data thresholds, (other) row and hidden revenue or cost metrics show as notes; quota shows the property's Google tokens left today and this hour. Examples: "Which channels brought the most sessions and revenue last month?" (preset channels); "Top landing pages for google / cpc" (preset landing_pages, filters [{field: sessionSourceMedium, match: exact, value: google / cpc}]); "Sessions by day vs the previous period" (preset traffic, compare previous_period); "Revenue by city" (dimensions [city], metrics [purchaseRevenue, ecommercePurchases]). Answers are cached for 10 minutes and each store has a daily allowance of 200 live Google Analytics requests by default.

get_guide

ChatGPT
Fetch a full WeProfit how-to guide by slug (from search_docs). Relay the steps to the user; replace {storeId} in links with their store id.

get_meta_ads_report

ChatGPT
Live, read-only Meta (Facebook and Instagram) ads report from the Meta ad accounts connected to this store (Graph API GET requests only; nothing is changed). Levels: account (totals), campaigns (objective, status, effective status, daily and lifetime budget, bid strategy), ad_groups (Meta ad sets: optimization goal, billing event, budget, schedule and a readable targeting summary with countries, regions, cities, age, gender, interests, behaviours, custom audiences and placements) and ads (status and the creative title, body, link, call to action and thumbnail). Every row carries Meta's insights for the range: impressions, reach, frequency, clicks, ctrPercent, cpm, cpc, spend, purchases and purchaseValue as Meta reports them (purchaseRoas = purchase value / spend) and every action by type (add to cart, initiate checkout, lead and the rest) with its value. breakdown splits the insights: daily (trend), country, region, age, gender, age_gender, publisher_platform, platform_position, device_platform, hourly, and the assets of dynamic or Advantage+ creative (body_asset, title_asset, image_asset, video_asset, call_to_action_asset, link_url_asset, description_asset). Rows are ordered by spend; entities without delivery in the range follow with metrics null. Default range the last 30 days. Money is in each ad account's own currency (the currency field on each account): never add amounts of different currencies together. Each account answers separately (accounts[].sections); an account the network refused carries a plain error and the others still answer. Answers are cached for 10 minutes and each store has a daily allowance of live requests; the WeProfit numbers (orders, profit, POAS) stay in get_campaign_profit and get_performance_report.

get_order

ChatGPT
One order in full: totals, refunds, line items, profit breakdown (COGS, fees, shipping, the unrefunded sales tax, basis; profitAmount = revenue - refunds - tax - COGS - fees - shipping), order + payment status, the complete attribution EXPLANATION (method, confidence, and the recorded match evidence), the visitor journey that produced it, and per-ad-network dispatch. Answers 'why is order #1054 untracked?'. Accepts the platform order id or the order number (leading ok). Omit store_id to search every readable store that is not archived. Landing pages, referrers and page URLs keep the scheme, host, path, utm_* parameters and the ad click and ad tracking parameters WeProfit uses for attribution; other parameter values and token-like path segments show as [redacted], and the part after is left out. Contains no customer name, email, phone, street address or payment card fields; order, visitor, session and ad click ids are pseudonymous identifiers.

get_orders

ChatGPT
Orders newest first, with attribution (tracked, link_method, link_confidence, channel, campaign, UTMs), order status, refunds and per-ad-network dispatch. Omit store_id to search EVERY store this token can read that is not archived (archived stores stay readable by store_id). Filter by order_id, status, financial_status, tracked, link_method, link_confidence, channel, visitor_id, session_id, currency, min_total/max_total, or sent_to (only orders whose purchase was sent to that ad network). Paginated via nextCursor. Contains no customer name, email, phone, street address or payment card fields; order, visitor and session ids are pseudonymous identifiers.

get_performance_report

ChatGPT
Profit performance with orders and ad spend JOINED, grouped one way at a time: day, network, channel, campaign, adset or ad. Every row: orders, revenue, refunds, taxes, COGS, fees, shipping, spend, net profit, POAS, ROAS, break-even ROAS. Net profit = revenue - refunds - taxes - COGS - fees - shipping - spend (taxes = the sales tax the orders collected and did not refund; revenue includes it). Answers 'was Meta profitable yesterday' (group_by network) and 'which campaigns lost money' (group_by campaign). Honesty notes: spend granularity ends at campaign, so adset/ad rows have spend null; network rows cover paid traffic only. On a store that never had an order source (a custom website) the purchases tracked in the browser with no matching order count too, attributed through their session (day rows: store-timezone days), with estimated costs (additive browserPurchases, browserPurchaseRevenue, browserPurchaseCosts per row and revenueSource on the totals). Includes data freshness and attribution coverage.

get_pinterest_ads_report

ChatGPT
Live, read-only Pinterest Ads report from the Pinterest ad accounts connected to this store (GET requests only, with the connection's ads:read access). Levels: account, campaigns (status, objective, spend caps), ad_groups (budget, bid, billable event, optimization goal, placement and a readable targeting summary: ages, genders, locations, languages, interests and audiences, devices), ads (status, creative type, pin and destination URL, plus the pin title, description, link and image when Pinterest allows it) and keywords (match type and bid). Every row carries Pinterest's results for the range: spend, impressions, clicks, ctr, cpc, cpm, conversions, checkouts, checkoutValue and checkoutRoas, ordered by spend. breakdown daily gives a day-by-day trend; age, gender, country, location, keyword, interest and app_type split the results by audience at the account, campaigns or ad_groups level. Pinterest serves results for the last 90 days only (an older start date is moved up with a note). When Pinterest refuses the pin creative, a note says so and the rest still answers. Pinterest answers are cached for 30 minutes. Money is in each ad account's own currency (the currency field on each account): never add amounts of different currencies together. Each account answers separately (accounts[].sections); an account the network refused carries a plain error and the others still answer. Answers are cached for 10 minutes and each store has a daily allowance of live requests; the WeProfit numbers (orders, profit, POAS) stay in get_campaign_profit and get_performance_report.

get_portfolio_summary

ChatGPT
All stores combined: revenue, refunds, taxes, COGS, fees, shipping, ad spend, net profit, margin, ROAS, POAS (net profit = revenue - refunds - taxes - COGS - fees - shipping - ad spend; taxes = the unrefunded sales tax, revenue includes it), converted to the account's display currency when FX rates allow (falls back to native amounts with a warning, flagged by currencyConverted). Per-store breakdown included. Same math as the dashboard portfolio.

get_profit_summary

ChatGPT
P&L summary for one store and date range: revenue, refunds, taxes, COGS, fees, shipping cost, ad spend, net profit, margin, order counts and accuracy. Net profit = revenue − refunds − taxes − COGS − fees − shipping − ad spend (taxes = the sales tax the orders collected and did not refund; revenue includes it); cancelled orders excluded. Identical math to the dashboard Profit page. A store that never had an order source (a custom website) also counts purchases tracked in the browser with no matching order as estimated revenue (browserPurchases, browserPurchaseRevenue, revenueSource).

get_profit_timeseries

ChatGPT
Per-day P&L items (store-timezone days, the days the dashboard Overview and Profit page use) for one store and date range: revenue, costs, ad spend, net profit per day. On a store that never had an order source every item also carries browserPurchaseRevenue (0 on a day without one).

get_search_console_report

ChatGPT
Live, read-only Google Search Console report of this store's own site: the Search Console property of the store's Google sign-in (the one on the store's Ad networks page, Google Analytics 4) that covers the store's own domain (a Domain property of a parent domain is read for the store's own pages only, named in notes); when none does, the answer says so (nothing is ever changed, no other site is read). dimensions: any of query, page, country, device, date, searchAppearance (default query; an empty list gives the totals only; searchAppearance only alone, a Search Console rule). Each row has clicks, impressions, ctr (a ratio: 0.05 = 5%) and position (the average position, 1 = top); totals are the whole site for the same filters, so they include the rare queries Google leaves out of the rows. search_type: web, image, video, news, discover, googleNews (default web; discover and googleNews have no queries). filters (up to 10, all must match): {dimension: query | page | country | device | searchAppearance, operator: contains | equals | notContains | notEquals | includingRegex | excludingRegex (default contains), expression}; country is the ISO 3166-1 alpha-3 code (usa, fra), device DESKTOP, MOBILE or TABLET. from / to YYYY-MM-DD (Pacific time days; default the 28 days ending 2 days ago): Search Console keeps 16 months of data and is about 2 days behind (data_state final or all: all adds fresher data that can still change). row_limit 1-1000 (default 100), start_row for the next page (nextStartRow says where it is); rows are ordered by clicks. aggregation auto, by_page, by_property (by_property not with a page split or page filter; a page split counts by page, so its rows can add up to more than the totals); include_sitemaps true adds the site's sitemaps (submitted URLs, errors, warnings, last read). Examples: "Top search queries last month" (default); "Which pages get impressions but few clicks?" (dimensions [page], row_limit 200); "Queries containing shoes on mobile" (filters [{dimension: query, expression: shoes}, {dimension: device, operator: equals, expression: MOBILE}]); "Clicks by day" (dimensions [date]). Answers are cached for 30 minutes and each store has a daily allowance of 200 live Search Console requests by default.

get_session

ChatGPT
One session, fully explained: visitor, start/end/duration, landing page, referrer, UTMs, ad ids and ad click ids, channel, device/browser/OS, country, the recorded consent value, the chronological event timeline with page URLs, and any orders it produced with revenue and profit. Omit store_id to search every readable store that is not archived. Landing pages, referrers and page URLs keep the scheme, host, path, utm_* parameters and the ad click and ad tracking parameters WeProfit uses for attribution; other parameter values and token-like path segments show as [redacted], and the part after is left out. Contains no customer name, email, phone, street address or payment card fields; visitor, session, order and ad click ids are pseudonymous identifiers.

get_sync_status

ChatGPT
Ad-spend sync state per connection: last successful sync, last error, staleness vs the hourly cron. Answers 'why is Meta spend missing for a date'. Per-run history is not stored: this reports current state and says so.

get_tiktok_ads_report

ChatGPT
Live, read-only TikTok Ads report from the TikTok ad accounts connected to this store (GET requests only; nothing is created or changed). Levels: account (totals), campaigns, ad_groups and ads. Without a breakdown, each row joins the settings with the results for the range: campaigns show objective, status, budget and budget mode; ad groups show optimization goal, billing event, bid, budget, schedule and the targeting (locations, age groups, gender, languages, interest and behaviour categories, included and excluded audiences, placements) with a one-line summary; ads show ad text, call to action, landing page, identity, video and image ids, and the video cover or image when TikTok returns them. Rows are ordered by spend; entities with no delivery in the range follow with metrics null. breakdown=daily gives a day-by-day trend (up to the last 90 days); breakdown=age, gender, country, platform, connection_type or language splits results by audience (no reach, frequency, video or payment metrics there). Metrics: spend, impressions, clicks, ctrPercent, cpc, cpm, reach, frequency, conversions, costPerConversion, conversionRatePercent, completePayments, costPerCompletePayment, completePaymentRoas, video plays, 2 s and 6 s views, average play time and completed views. When TikTok did not give WeProfit a permission for one part, that part shows a note and the rest still answers. Money is in each ad account's own currency (the currency field on each account): never add amounts of different currencies together. Each account answers separately (accounts[].sections); an account the network refused carries a plain error and the others still answer. Answers are cached for 10 minutes and each store has a daily allowance of live requests; the WeProfit numbers (orders, profit, POAS) stay in get_campaign_profit and get_performance_report.

get_tracking_errors

ChatGPT
Recent tracking/delivery errors (ingest, normalize, order, meta_dispatch, webhook, reconcile, shopify_auth) with message and details (their text is cleaned before it is returned: cleaned values show as [redacted] and internal trace ids are left out), newest first. Omit store_id to search every readable store that is not archived. Filter by scope; page with offset.

get_visitor

ChatGPT
One visitor's journey: first/last seen, sessions, events, orders, revenue and profit, first-touch and last-touch attribution (UTMs, campaign and ad ids, ad click ids), landing pages and referrers, countries, devices and conversion status, with stable session and order ids for follow-up calls. Omit store_id to search every store this token can read that is not archived. Landing pages and referrers keep the scheme, host, path, utm_* parameters and the ad click and ad tracking parameters WeProfit uses for attribution; other parameter values and token-like path segments show as [redacted], and the part after is left out. Contains no customer name, email, phone, street address or payment card fields; visitor, session, order and ad click ids are pseudonymous identifiers.

google_ads_query

ChatGPT
Run ONE GAQL SELECT (Google Ads Query Language) on the Google Ads account(s) connected to this store, read-only through GoogleAdsService.search: the way to read anything else the Google Ads interface shows that get_google_ads_report does not. Only a single SELECT is accepted; a LIMIT of at most 1000 is added or lowered. Each *_micros field (costMicros in the answer) and each micros metric without the suffix (averageCpc, costPerConversion) gets a sibling in account currency units (costValue, averageCpcValue); the account currency is on each account. When Google refuses a query, its own error text comes back: fix the field and retry. Auction Insights: WeProfit doesn't have access to Auction Insights data. You can see it in your Google Ads account under Campaigns > Insights and reports > Auction insights. Same cache (10 minutes) and daily allowance as get_google_ads_report. GAQL: SELECT fields FROM one_resource WHERE conditions ORDER BY field DESC LIMIT n. Dates: segments.date BETWEEN '2026-10-01' AND '2026-10-31' or segments.date DURING LAST_30_DAYS (also LAST_7_DAYS, THIS_MONTH, LAST_MONTH). WHERE joins conditions with AND only (no OR); strings and enum values in single quotes; IN ('A', 'B'); LIKE '%shoe%'; != 'REMOVED'. Resources: campaign, ad_group, ad_group_ad, keyword_view, search_term_view, ad_group_ad_asset_view, asset_group, asset_group_asset, campaign_asset, ad_group_asset, campaign_criterion, ad_group_criterion, campaign_audience_view, geographic_view, user_location_view, age_range_view, gender_view, landing_page_view, expanded_landing_page_view, detail_placement_view, shopping_performance_view, campaign_budget, bidding_strategy, conversion_action, change_event, recommendation, customer. Fields: campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, campaign.bidding_strategy_type, campaign_budget.amount_micros, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.quality_info.quality_score, search_term_view.search_term, ad_group_ad.ad.final_urls, ad_group_ad.ad.responsive_search_ad.headlines, asset.text_asset.text, segments.device, segments.day_of_week, segments.hour, segments.conversion_action_name, segments.product_title. Metrics: metrics.impressions, metrics.clicks, metrics.ctr, metrics.average_cpc, metrics.cost_micros, metrics.conversions, metrics.conversions_value, metrics.cost_per_conversion, metrics.conversions_from_interactions_rate, metrics.all_conversions, metrics.view_through_conversions, metrics.search_impression_share, metrics.search_top_impression_share, metrics.search_absolute_top_impression_share, metrics.search_budget_lost_impression_share, metrics.search_rank_lost_impression_share, metrics.top_impression_percentage, metrics.absolute_top_impression_percentage, metrics.video_trueview_views. Example: SELECT campaign.name, metrics.cost_micros, metrics.conversions FROM campaign WHERE segments.date DURING LAST_7_DAYS AND campaign.status = 'ENABLED' ORDER BY metrics.cost_micros DESC LIMIT 20

google_keyword_forecast

ChatGPT
Google Keyword Planner "Get search volume and forecasts", part 2: what a hypothetical campaign would get. Nothing is created in the account. Give keywords with match types (BROAD, PHRASE, EXACT; optional max_cpc each), optional negative_keywords, bidding_strategy (manual_cpc with max_cpc, maximize_clicks (default), maximize_conversions), daily_budget (account currency), locations, language, network, optional conversion_rate (0-1) and forecast_start / forecast_end (default: the next 30 days, within a year). Returns clicks, impressions, cost, ctr, averageCpc, conversions, conversionRate and averageCpa for the period. Google's forecast has no conversion value (conversionValue is null). Read-only Keyword Planner through the store's own connected Google Ads account: nothing is saved, no plan is created and nothing is added to the account. Bids are in the account currency. Cached 24 hours; the Keyword Planner tools share a small daily allowance per store.

google_keyword_group_ideas

ChatGPT
Google Keyword Planner grouped ideas (ad group themes): which of the account's ad groups each keyword fits, with the suggested keyword and match type; keywords that fit none are flagged. Pass keywords (1-100) and optionally ad_group_ids (default: up to 25 enabled Search ad groups of the account). Read-only Keyword Planner through the store's own connected Google Ads account: nothing is saved, no plan is created and nothing is added to the account. Bids are in the account currency. Cached 24 hours; the Keyword Planner tools share a small daily allowance per store.

google_keyword_ideas

ChatGPT
Google Keyword Planner "Discover new keywords". Seeds: keywords (1-10), a url (one page), keywords and url together, or a site (a whole domain). Options: countries or geo_target_ids, language, network, include_adult_keywords, year_month_start and year_month_end, keyword_concepts (the "refine keywords" groups), device_breakdown, exclude_account_keywords (drops ideas the account already has), limit and page_token (nextPageToken). Per idea: avgMonthlySearches, the last 12 monthly volumes, competition and competitionIndex, lowTopOfPageBid and highTopOfPageBid, averageCpc, close variants and concepts. Read-only Keyword Planner through the store's own connected Google Ads account: nothing is saved, no plan is created and nothing is added to the account. Bids are in the account currency. Cached 24 hours; the Keyword Planner tools share a small daily allowance per store.

google_keyword_search_volume

ChatGPT
Google Keyword Planner "Get search volume and forecasts", part 1: historical metrics for your own keyword list (1-200): avgMonthlySearches, monthly volumes, competition and its index, top-of-page bids, averageCpc and close variants. Same location, language, network, historical range and device options as google_keyword_ideas. Read-only Keyword Planner through the store's own connected Google Ads account: nothing is saved, no plan is created and nothing is added to the account. Bids are in the account currency. Cached 24 hours; the Keyword Planner tools share a small daily allowance per store.

google_location_language_lookup

ChatGPT
Turn place and language names into the Google ids the Keyword Planner tools take ("Morocco", "Paris", "French"): locations come from Google's location suggestions (geoTargetId, name, canonical name, country, type, reach); languages give languageId and code. kind location, language or both (default). Read-only; cached 7 days.

list_connections

ChatGPT
Every connection of one store: platform connections (Shopify/Wix/WordPress/ClickFunnels with status and liveness), ad-network destinations (pixel, label, status, last success/error) and ad-spend connections (account, status, last sync, last error). No tokens or secrets.

list_stores

ChatGPT
List the stores this connection can read (active stores where the connected user is the store owner, or staff with developer access). Always call this first to resolve store ids. readAllowed is false (with lockReason) when the store's plan does not allow reports right now: its data tools refuse it and account-wide tools leave it out, listing it under lockedStores. lockReason 'unsubscribed' means the store has no active WeProfit plan; 'locked' means its last billing cycle went over the plan's order limit (tracking keeps running). The store owner can see the plan status on the store's Billing page. archived is true for a store the connected user archived in their dashboard: it stays readable by id but is left out of the default all-stores results, like the dashboard portfolio.

query_data

ChatGPT
Flexible aggregation over raw store data: build reports the dashboard does not have (spend by hour, add-to-carts by landing page, AOV by channel…). Pick ONE dataset, then group whitelisted dimensions and aggregate whitelisted metrics. Money follows the same definitions as the dashboard; cancelled orders are always excluded; results are aggregates, and the catalog has no customer name, email, phone or address fields and no visitor, session or order ids. Catalog: {"orders":{"permission":"analytics.view","dimensions":{"day":"UTC day","hour":"UTC hour of day (0-23)","dow":"Day of week","financial_status":"paid / refunded / …","tracked":"true = attributed to a visitor","link_method":"cart_attribute / checkout_token / order_url / email / landing_site / none","link_confidence":"exact / strong / inferred / none","profit_basis":"exact / partial / estimate / none","currency":"Order currency","channel":"Session channel; orders with no session row read 'untracked' (get_campaign_profit resolves some of those via landing-page attribution, so its channel split can differ)","utm_source":"Session UTM source","utm_medium":"Session UTM medium","utm_campaign":"Session UTM campaign","device_type":"Session device type","session_country":"Session country (order-address enriched)"},"metrics":{"orders":"Order count","revenue":"Sum of order totals","refunds":"Sum of refunded amounts","cogs":"Cost of goods (orders with a computed snapshot)","fees":"Payment/platform fees","shipping_cost":"Shipping cost","taxes":"Sales tax / VAT still owed on the orders (their unrefunded tax); revenue includes it, profit subtracts it","net_before_ad_spend":"Profit before ad spend (same equation as the dashboard, taxes included; ad spend lives in the ad_spend dataset)","aov":"Average order value over ORDERS in this dataset (the Overview AOV divides by tracked purchases from the daily rollup, so the two can differ slightly)"}},"events":{"permission":"events.view","dimensions":{"day":"UTC day","hour":"UTC hour of day (0-23)","event_name":"page_view / product_view / add_to_cart / initiate_checkout / purchase / …","source":"browser / web_pixel / server / shopify_webhook / …","url":"Page URL as scheme, host and path only (query string and fragment left out, token-like path segments shown as [redacted]); filter with values in this form; high cardinality, so filter or keep limits small","country":"Event-time country","channel":"Session channel"},"metrics":{"events":"Event count","unique_visitors":"Distinct visitors","unique_sessions":"Distinct sessions","value_sum":"Sum of event values (purchase amounts etc.)"}},"sessions":{"permission":"analytics.view","dimensions":{"day":"UTC day","hour":"UTC hour of day (0-23)","channel":"Traffic channel (meta_paid, google_organic, ai, direct, …)","utm_source":"UTM source","utm_medium":"UTM medium","utm_campaign":"UTM campaign","campaign_id":"Ad-platform campaign id (when resolved)","device_type":"desktop / mobile / tablet","browser":"Browser family","os":"Operating system","country":"Country","landing_url":"Landing page as scheme, host and path only (query string and fragment left out, token-like path segments shown as [redacted]); use the utm_* dimensions for campaigns","referrer":"Referrer as scheme, host and path only (query string and fragment left out, token-like path segments shown as [redacted])"},"metrics":{"sessions":"Session count","visitors":"Distinct visitors"}},"ad_spend":{"permission":"analytics.view","dimensions":{"date":"Spend day","network":"meta / google / tiktok / pinterest / '' or any custom slug (manual and scheduled spend accept free-text networks, e.g. 'snapchat')","campaign_id":"Campaign id ('' = store-wide bucket)","source":"manual / api / schedule / platform slug (synced)"},"metrics":{"spend":"Spend in store currency"}}}

search_docs

ChatGPT
Search WeProfit how-to guides and metric definitions. Use this to walk the user through any MANUAL action (connecting ad accounts, installing tracking, transfers, staff, 2FA…). The MCP is read-only, so guide the user step by step instead of attempting changes. Then fetch the full guide with get_guide.

Capabilities

Profit And Loss ReportsCampaign And Ad ProfitOrder Attribution ExplanationsTracking Health ChecksStore ComparisonSetup Guides

Example Prompts

Click any prompt to copy it.

Similar Apps