{
  "id": "get_arb_report",
  "mcp_tool": "get_arb_report",
  "status": "approved",
  "source_system": "cake",
  "environment": ["staging", "prod"],
  "sharded": true,
  "shard_schema": "lucos_ro_cake",
  "shard_view_prefix": "lucos_ro_arb_click",
  "connections": {
    "whale": "cake_whale_ro",
    "shorty": "cake_shorty_ro"
  },
  "objects": [
    "whale.lucos_ro_arb_google_campaign_hourly",
    "whale.lucos_ro_arb_meta_campaign_daily",
    "whale.lucos_ro_arb_sessions",
    "whale.lucos_ro_arb_session_quality",
    "whale.lucos_ro_arb_session_page_loads",
    "whale.lucos_ro_arb_campaign_performance",
    "whale.lucos_ro_arb_campaign_routing",
    "whale.lucos_ro_arb_conversions",
    "lucos_ro_cake.lucos_ro_arb_click_*"
  ],
  "parameters": {
    "group_by": {
      "type": "enum",
      "required": false,
      "default": "campaign",
      "values": ["campaign", "day"]
    },
    "campaign_id": { "type": "string", "required": false },
    "source": { "type": "enum", "required": false, "values": ["google", "meta", "none"] },
    "status": {
      "type": "enum",
      "required": false,
      "values": [
        "profitable",
        "near_breakeven",
        "loss_acceptable",
        "loss_concerning",
        "no_spend",
        "no_revenue",
        "unknown"
      ]
    },
    "site": { "type": "string", "required": false },
    "sort_by": {
      "type": "enum",
      "required": false,
      "values": [
        "date",
        "buy_spend",
        "sell_revenue",
        "profit",
        "profit_pct",
        "roas",
        "sell_clicks",
        "buy_clicks",
        "buy_impressions",
        "session_count",
        "ivt_rate",
        "avg_quality_score",
        "conv_mapping_orders",
        "conv_mapping_sales_amount"
      ]
    },
    "sort_dir": { "type": "enum", "required": false, "values": ["desc", "asc"] },
    "date_from": { "type": "date", "required": false },
    "date_to": { "type": "date", "required": false },
    "limit": { "type": "int", "required": false, "default": 50 }
  },
  "constraints": {
    "max_window_days": 92,
    "default_window_days": 7,
    "max_rows": 500,
    "timeout_ms": 60000
  },
  "allow_fields": [
    "date",
    "campaign_id",
    "site",
    "source",
    "buy_account_id",
    "buy_campaign_name",
    "buy_impressions",
    "buy_clicks",
    "buy_link_clicks",
    "buy_outbound_clicks",
    "buy_reach",
    "buy_conversions",
    "buy_spend",
    "sell_clicks",
    "sell_revenue",
    "sell_cpc",
    "profit",
    "profit_pct",
    "roas",
    "ad_ctr_pct",
    "cost_per_link_click",
    "cost_per_sell_click",
    "lp_click_out_rate_pct",
    "session_count",
    "ivt_flagged_sessions",
    "ivt_rate",
    "perf_sessions",
    "page_load_start_count",
    "page_load_complete_count",
    "avg_page_load_ms",
    "avg_page_complete_ms",
    "attributed_orders",
    "attributed_revenue",
    "attributed_visits",
    "attributed_page_views",
    "conv_mapping_orders",
    "conv_mapping_sales_amount",
    "tag",
    "variant",
    "subcategory",
    "avg_quality_score",
    "status",
    "has_perf_data",
    "engagement_session_count",
    "avg_time_on_page",
    "avg_scroll_depth"
  ],
  "deny_fields": [
    "ip",
    "user_agent",
    "referrer",
    "url",
    "gclid",
    "fbclid",
    "session_id",
    "session_token",
    "device_id",
    "click_id",
    "subid",
    "search_terms"
  ],
  "post_processing": [
    "Mirrors adsense.admedia.com ArbReportModel::getArbReport (group_by=day) and ::getArbAggregatedReport (group_by=campaign), which back /arb/report and /arb/aggregated-report.",
    "Sell side: lucos_ro_cake.lucos_ro_arb_click_YYYYMM month views. root_subid is split on '_' — segment 1 is site, segment 2 is campaign_id. Rows whose campaign_id never appears in lucos_ro_arb_sessions are dropped, as the report does; their revenue is reported in sell_side.revenue_not_in_arb_campaigns rather than lost.",
    "Buy side: Meta wins over Google when both have the same campaign_id on the same date, as the report does.",
    "Deliberate difference 1: the report keeps ONE root_subid per date+campaign and overwrites the rest. This tool sums them. Same for Google/Meta groups split by a campaign rename within a day.",
    "Deliberate difference 2: ratios with a zero denominator are null, where the page renders 0.",
    "adv_conversions / adv_cvr / adv_roas / adv_aov are omitted — the report initialises them to 0 and never sets them.",
    "Sessions queries use created_at >= from AND created_at < to+1, equivalent to the report's DATE(created_at) BETWEEN for a DATETIME column.",
    "summary is computed over every matching row before the limit, so totals stay correct when rows are capped."
  ],
  "notes": "ARB (direct advertiser arbitrage) buy vs sell reconciliation. Buy side is ARB Google Ads and Meta spend (scope enforced inside the whale views: Meta by account, Google by account OR by the 126664/128018 campaign naming, which covers accounts ARB opens later); sell side is Shorty arb_click revenue. Same databases and RO user as the cake tools."
}
