> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vortexiq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# MediaMath (T1) on Vortex IQ

> Monitor MediaMath (T1) campaign performance and spend efficiency, and catch tracking or pacing problems before budget is wasted.

export const CapabilityPage = ({data}) => {
  const d = data || ({});
  const [tab, setTab] = useState('overview');
  const [sel, setSel] = useState(null);
  const [q, setQ] = useState('');
  const [outcome, setOutcome] = useState('');
  const [status, setStatus] = useState('');
  const [limit, setLimit] = useState(8);
  const monitor = d.monitor || [];
  const audits = d.audits || [];
  const autos = d.autos || [];
  const outcomes = useMemo(() => {
    const s = new Set();
    monitor.forEach(m => s.add(m.o));
    audits.forEach(a => s.add(a.o));
    return [...s].sort();
  }, [monitor, audits]);
  const rows = useMemo(() => {
    const t = q.trim().toLowerCase();
    if (tab === 'monitor') {
      return monitor.filter(m => (!t || (m.n + ' ' + (m.d || '')).toLowerCase().includes(t)) && (!outcome || m.o === outcome));
    }
    if (tab === 'audit') {
      return audits.filter(a => (!t || (a.n + ' ' + (a.why || '')).toLowerCase().includes(t)) && (!outcome || a.o === outcome) && (!status || a.s === status));
    }
    if (tab === 'automate') {
      return autos.filter(w => !t || (w.n + ' ' + (w.d || '')).toLowerCase().includes(t));
    }
    return [];
  }, [tab, q, outcome, status, monitor, audits, autos]);
  const pill = (text, kind) => {
    const tone = kind === 'good' ? {
      color: '#1f9e54',
      borderColor: '#1f9e54',
      background: '#ecf8f110'
    } : kind === 'warn' ? {
      color: '#c07a17',
      borderColor: '#c07a17',
      background: '#fdf6e910'
    } : kind === 'bad' ? {
      color: '#c53527',
      borderColor: '#c53527',
      background: '#fdf0ee10'
    } : kind === 'brand' ? {
      color: '#5529d6',
      borderColor: '#5529d6'
    } : {
      color: 'inherit',
      borderColor: 'currentColor',
      opacity: 0.65
    };
    return <span key={text} style={{
      fontSize: '10.5px',
      fontFamily: 'ui-monospace, monospace',
      border: '1px solid',
      borderRadius: '999px',
      padding: '2px 8px',
      whiteSpace: 'nowrap',
      ...tone
    }}>
        {text}
      </span>;
  };
  const sevKind = s => s === 'critical' ? 'bad' : s === 'high' ? 'warn' : 'muted';
  const fixKind = s => s === 'Prepared fix' ? 'good' : s === 'Candidate remediation' ? 'warn' : 'muted';
  const card = (item, kind) => {
    const title = item.n;
    const badges = kind === 'monitor' ? [pill(item.o, 'brand'), pill(item.a === 'Watch only' || item.a === 'Merchant rule' ? item.a : `Alert ${item.a}`, 'muted')] : kind === 'audit' ? [pill(item.sev, sevKind(item.sev)), pill(item.s, fixKind(item.s))] : [pill(item.role, 'brand'), pill(item.ready, 'good')];
    const body = kind === 'monitor' ? item.nc ? 'Description pending editorial review; the signal is live.' : item.d : kind === 'audit' ? item.why : item.d;
    return <button key={title} onClick={() => setSel({
      kind,
      item
    })} style={{
      display: 'block',
      width: '100%',
      textAlign: 'left',
      border: '1px solid rgba(128,128,128,.28)',
      borderRadius: '10px',
      padding: '12px 14px',
      marginBottom: '8px',
      background: 'transparent',
      cursor: 'pointer',
      font: 'inherit',
      color: 'inherit'
    }}>
        <div style={{
      display: 'flex',
      gap: '10px',
      justifyContent: 'space-between',
      alignItems: 'flex-start',
      flexWrap: 'wrap'
    }}>
          <strong style={{
      fontSize: '14px'
    }}>{title}</strong>
          <span style={{
      display: 'flex',
      gap: '5px',
      flexWrap: 'wrap'
    }}>{badges}</span>
        </div>
        {body ? <div style={{
      fontSize: '12.5px',
      opacity: 0.72,
      marginTop: '4px'
    }}>{body}</div> : null}
      </button>;
  };
  const tabBtn = (id, label) => <button key={id} onClick={() => {
    setTab(id);
    setLimit(8);
    setQ('');
  }} style={{
    border: 0,
    background: 'none',
    font: 'inherit',
    fontWeight: 600,
    fontSize: '14px',
    padding: '9px 14px',
    cursor: 'pointer',
    color: tab === id ? '#5529d6' : 'inherit',
    opacity: tab === id ? 1 : 0.65,
    borderBottom: tab === id ? '2px solid #5529d6' : '2px solid transparent'
  }}>
      {label}
    </button>;
  const inputStyle = {
    border: '1px solid rgba(128,128,128,.3)',
    borderRadius: '999px',
    padding: '7px 13px',
    font: 'inherit',
    fontSize: '13px',
    background: 'transparent',
    color: 'inherit'
  };
  return <div style={{
    position: 'relative'
  }}>
      {}
      <div style={{
    display: 'grid',
    gridTemplateColumns: 'repeat(auto-fit,minmax(120px,1fr))',
    gap: '10px',
    margin: '18px 0'
  }}>
        {(d.stats || []).map(([v, l]) => <div key={l} style={{
    border: '1px solid rgba(128,128,128,.28)',
    borderRadius: '10px',
    padding: '11px 13px'
  }}>
            <div style={{
    fontSize: v.length > 6 ? '15px' : '21px',
    fontWeight: 700,
    letterSpacing: '-.02em',
    color: v.length > 6 ? '#5529d6' : 'inherit'
  }}>{v}</div>
            <div style={{
    fontSize: '11px',
    opacity: 0.66
  }}>{l}</div>
          </div>)}
      </div>

      <div style={{
    display: 'flex',
    gap: '4px',
    borderBottom: '1px solid rgba(128,128,128,.25)',
    marginBottom: '16px',
    flexWrap: 'wrap'
  }}>
        {tabBtn('overview', 'Overview')}
        {tabBtn('monitor', `Monitor (${monitor.length})`)}
        {tabBtn('audit', `Audit (${audits.length})`)}
        {tabBtn('automate', 'Automate')}
      </div>

      {tab === 'overview' && <div>
          <div style={{
    display: 'grid',
    gridTemplateColumns: 'repeat(auto-fit,minmax(240px,1fr))',
    gap: '10px'
  }}>
            {outcomes.map(o => <div key={o} style={{
    border: '1px solid rgba(128,128,128,.28)',
    borderLeft: '3px solid #5529d6',
    borderRadius: '10px',
    padding: '11px 14px'
  }}>
                <strong style={{
    fontSize: '13.5px'
  }}>{o}</strong>
              </div>)}
          </div>
          <p style={{
    fontSize: '13px',
    opacity: 0.75,
    marginTop: '16px'
  }}>
            Every capability follows the same controlled sequence: connect, monitor, detect, recommend,
            approve, execute, verify. Nothing changes a connected system without the approval step.
          </p>
        </div>}

      {tab !== 'overview' && <div>
          <div style={{
    display: 'flex',
    gap: '8px',
    marginBottom: '12px',
    flexWrap: 'wrap'
  }}>
            <input style={{
    ...inputStyle,
    flex: 1,
    minWidth: '170px'
  }} placeholder={`Search ${tab === 'monitor' ? 'signals' : tab === 'audit' ? 'checks' : 'workflows'}...`} value={q} onChange={e => {
    setQ(e.target.value);
    setLimit(8);
  }} />
            {tab !== 'automate' && <select style={inputStyle} value={outcome} onChange={e => {
    setOutcome(e.target.value);
    setLimit(8);
  }}>
                <option value="">All outcomes</option>
                {outcomes.map(o => <option key={o} value={o}>{o}</option>)}
              </select>}
            {tab === 'audit' && <select style={inputStyle} value={status} onChange={e => {
    setStatus(e.target.value);
    setLimit(8);
  }}>
                <option value="">All fix statuses</option>
                <option>Prepared fix</option>
                <option>Candidate remediation</option>
                <option>Report only</option>
              </select>}
          </div>

          {rows.length === 0 && tab === 'automate' && <div style={{
    border: '1px dashed #5529d6',
    borderRadius: '10px',
    padding: '15px'
  }}>
              <strong style={{
    fontSize: '14px'
  }}>Ready to build your first {d.name} workflow</strong>
              <p style={{
    fontSize: '12.5px',
    opacity: 0.75,
    margin: '6px 0 0'
  }}>
                Vortex IQ is integrated with {d.reads} read and {d.writes} write operations on {d.name}.
                Pick a trigger, add them as steps, and every step that changes data pauses for approval.
              </p>
            </div>}
          {rows.length === 0 && tab !== 'automate' && <div style={{
    opacity: 0.6,
    fontSize: '13px'
  }}>Nothing matches this search or filter.</div>}

          {rows.slice(0, limit).map(r => card(r, tab))}

          {rows.length > limit && <button onClick={() => setLimit(rows.length)} style={{
    ...inputStyle,
    display: 'block',
    margin: '10px auto 0',
    cursor: 'pointer'
  }}>
              View all {rows.length}
            </button>}
        </div>}

      {}
      {sel && <>
          <div onClick={() => setSel(null)} style={{
    position: 'fixed',
    inset: 0,
    background: 'rgba(10,6,26,.45)',
    zIndex: 40
  }} />
          <aside style={{
    position: 'fixed',
    top: 0,
    right: 0,
    width: 'min(430px, 94vw)',
    height: '100vh',
    overflowY: 'auto',
    background: 'var(--background, #fff)',
    backgroundColor: 'light-dark(#fff, #0c061f)',
    borderLeft: '1px solid rgba(128,128,128,.3)',
    padding: '20px 22px',
    zIndex: 50
  }}>
            <button onClick={() => setSel(null)} style={{
    float: 'right',
    border: '1px solid rgba(128,128,128,.3)',
    background: 'transparent',
    color: 'inherit',
    borderRadius: '999px',
    width: '30px',
    height: '30px',
    cursor: 'pointer'
  }}>
              ×
            </button>
            <DetailBody sel={sel} d={d} pill={pill} sevKind={sevKind} fixKind={fixKind} />
          </aside>
        </>}
    </div>;
};

Monitor MediaMath (T1) campaign performance and spend efficiency, and catch tracking or pacing problems before budget is wasted.

No changes are made without the configured approval policy. Read-only operations do not modify the connected system; schedules, access scopes, API usage and data handling remain governed by Vortex IQ controls.

[Connect or manage this source](https://app.vortexiq.ai/workbench/settings/sources) · [View setup guide](/integrations/mediamath) · [Create a workflow](https://app.vortexiq.ai/workbench/flows/create?connector=mediamath)

<CapabilityPage data={{"name": "MediaMath (T1)", "reads": 4, "writes": 1, "stats": [["72", "performance signals"], ["5", "automated checks"], ["0", "prepared fixes"], ["0", "proven workflows"], ["5", "API operations"]], "resRows": [{"n": "advertisers", "r": 1, "w": 0}, {"n": "campaigns", "r": 1, "w": 0}, {"n": "creatives", "r": 1, "w": 0}, {"n": "logins", "r": 0, "w": 1}, {"n": "report ingstdperformances", "r": 1, "w": 0}], "opsPhrase": "over 13,000", "connPhrase": "more than 200", "monitor": [{"n": "Active PMP Catalog Deals on Out-of-Stock SKUs", "o": "Protect revenue", "a": "5 / 50", "d": "T1 PMP deals are expensive ,  running them at OOS SKUs burns through the agreed floor with no conversion.", "nc": false}, {"n": "Branded Paid Clicks Cannibalising Organic", "o": "Protect revenue", "a": "Merchant rule", "d": "Defensive branded targeting on T1 cannibalising free organic ,  common pattern in agency-trading-desk accounts.", "nc": false}, {"n": "Landing Pages with Poor Web Vitals", "o": "Protect revenue", "a": "Merchant rule", "d": "T1 display/video click-throughs land on the same merchant pages ,  LCP regression breaks the whole funnel.", "nc": false}, {"n": "ROAS Dropped Below Threshold", "o": "Grow revenue", "a": "3 / 1.5", "d": "T1 programmatic ROAS shifts mean inventory or audience decay ,  investigate within the day.", "nc": false}, {"n": "Spend on Campaigns with Active Feed Rejections", "o": "Protect revenue", "a": "Merchant rule", "d": "£ on T1 catalog/PMP campaigns whose Feedonomics feed has rejections. Creative falls back, CR drops.", "nc": false}, {"n": "T1 Audit Pixel Firing Rate Decay", "o": "Grow revenue", "a": "Merchant rule", "d": "T1's older identity layer is hit hardest by ITP ,  pixel decay = audience signal collapse.", "nc": false}, {"n": "ROAS", "o": "Grow revenue", "a": "3 / 1.5", "d": "ROAS for the selected period.", "nc": true}, {"n": "Spend vs Budget", "o": "Run operations", "a": "Watch only", "d": "Spend vs Budget for the selected period.", "nc": true}, {"n": "Total Revenue", "o": "Grow revenue", "a": "Watch only", "d": "Total Revenue for the selected period.", "nc": true}, {"n": "Total Spend", "o": "Run operations", "a": "Watch only", "d": "Total Spend for the selected period.", "nc": true}, {"n": "Wasted Spend", "o": "Run operations", "a": "Watch only", "d": "Wasted Spend for the selected period.", "nc": true}, {"n": "Zero-Conversion Spend", "o": "Grow revenue", "a": "Watch only", "d": "Zero-Conversion Spend for the selected period.", "nc": true}, {"n": "CPA by Keyword", "o": "Run operations", "a": "Watch only", "d": "CPA by Keyword.", "nc": false}, {"n": "CPA by Region", "o": "Customer experience", "a": "Watch only", "d": "CPA by Region.", "nc": false}, {"n": "CPC by Campaign", "o": "Grow revenue", "a": "Watch only", "d": "CPC by Campaign.", "nc": false}, {"n": "CPC by Device", "o": "Customer experience", "a": "Watch only", "d": "CPC by Device.", "nc": false}, {"n": "CPC by Hour", "o": "Customer experience", "a": "Watch only", "d": "CPC by Hour over time.", "nc": false}, {"n": "CTR by Campaign", "o": "Grow revenue", "a": "Watch only", "d": "CTR by Campaign.", "nc": false}, {"n": "CTR by Device", "o": "Customer experience", "a": "Watch only", "d": "CTR by Device.", "nc": false}, {"n": "CTR by Keyword", "o": "Run operations", "a": "Watch only", "d": "CTR by Keyword.", "nc": false}, {"n": "CTR by Region", "o": "Customer experience", "a": "Watch only", "d": "CTR by Region.", "nc": false}, {"n": "Campaign Comparison", "o": "Grow revenue", "a": "Watch only", "d": "Campaign Comparison, broken down by row.", "nc": false}, {"n": "Conversion Actions Breakdown", "o": "Grow revenue", "a": "Watch only", "d": "Conversion Actions Breakdown.", "nc": false}, {"n": "Conversion Funnel", "o": "Grow revenue", "a": "Watch only", "d": "Conversion Funnel, stage by stage.", "nc": false}, {"n": "Conversion Lag", "o": "Grow revenue", "a": "Watch only", "d": "Conversion Lag, compared across items.", "nc": false}, {"n": "Conversion Rate by Campaign", "o": "Grow revenue", "a": "Watch only", "d": "Conversion Rate by Campaign.", "nc": false}, {"n": "Conversion Rate by Device", "o": "Grow revenue", "a": "Watch only", "d": "Conversion Rate by Device.", "nc": false}, {"n": "Conversions by Campaign", "o": "Grow revenue", "a": "Watch only", "d": "Conversions by Campaign.", "nc": false}, {"n": "Conversions by Day of Week", "o": "Grow revenue", "a": "Watch only", "d": "Conversions by Day of Week.", "nc": false}, {"n": "Conversions by Device", "o": "Grow revenue", "a": "Watch only", "d": "Conversions by Device.", "nc": false}, {"n": "Landing Page CPC", "o": "Customer experience", "a": "Watch only", "d": "Landing Page CPC, broken down by row.", "nc": false}, {"n": "Landing Page Conv. Rate", "o": "Customer experience", "a": "Watch only", "d": "Landing Page Conv. Rate, broken down by row.", "nc": false}, {"n": "Landing Page Performance", "o": "Customer experience", "a": "Watch only", "d": "Landing Page Performance, broken down by row.", "nc": false}, {"n": "Landing Page Revenue", "o": "Grow revenue", "a": "Watch only", "d": "Landing Page Revenue, broken down by row.", "nc": false}, {"n": "Overspending Campaigns", "o": "Grow revenue", "a": "Watch only", "d": "Overspending Campaigns, broken down by row.", "nc": false}, {"n": "Quality Score Distribution", "o": "Run operations", "a": "7 / 4", "d": "Quality Score Distribution, compared across items.", "nc": false}, {"n": "ROAS by Campaign", "o": "Grow revenue", "a": "Watch only", "d": "ROAS by Campaign.", "nc": false}, {"n": "ROAS by Day of Week", "o": "Grow revenue", "a": "Watch only", "d": "ROAS by Day of Week.", "nc": false}, {"n": "ROAS by Device", "o": "Grow revenue", "a": "Watch only", "d": "ROAS by Device.", "nc": false}, {"n": "ROAS by Region", "o": "Grow revenue", "a": "Watch only", "d": "ROAS by Region.", "nc": false}, {"n": "Revenue by Campaign", "o": "Grow revenue", "a": "Watch only", "d": "Revenue by Campaign.", "nc": false}, {"n": "Search Terms Report", "o": "Grow revenue", "a": "Watch only", "d": "Search Terms Report, broken down by row.", "nc": false}, {"n": "Spend by Campaign", "o": "Grow revenue", "a": "Watch only", "d": "Spend by Campaign.", "nc": false}, {"n": "Spend by Device", "o": "Customer experience", "a": "Watch only", "d": "Spend by Device.", "nc": false}, {"n": "Spend by Hour", "o": "Customer experience", "a": "Watch only", "d": "Spend by Hour.", "nc": false}, {"n": "Top Cities by Conversions", "o": "Grow revenue", "a": "Watch only", "d": "Top Cities by Conversions.", "nc": false}, {"n": "Top Keywords by Conversions", "o": "Grow revenue", "a": "Watch only", "d": "Top Keywords by Conversions.", "nc": false}, {"n": "Top Keywords by Spend", "o": "Run operations", "a": "Watch only", "d": "Top Keywords by Spend.", "nc": false}, {"n": "Top Performing Campaigns", "o": "Grow revenue", "a": "Watch only", "d": "Top Performing Campaigns, broken down by row.", "nc": false}, {"n": "Underspending Campaigns", "o": "Grow revenue", "a": "Watch only", "d": "Underspending Campaigns, broken down by row.", "nc": false}, {"n": "Wasted-Spend Burst (flight pacing drift)", "o": "Run operations", "a": "5 / 50", "d": "T1 flight pacing drift = under-deliver-then-burn-end-of-flight; catches before the last 48h surge.", "nc": false}, {"n": "Worst Performing Campaigns", "o": "Grow revenue", "a": "Watch only", "d": "Worst Performing Campaigns, broken down by row.", "nc": false}, {"n": "All Conversions", "o": "Grow revenue", "a": "Watch only", "d": "All Conversions for the selected period.", "nc": true}, {"n": "Budget Utilisation", "o": "Run operations", "a": "70 / 30", "d": "Budget Utilisation for the selected period.", "nc": true}, {"n": "CPA Trend", "o": "Run operations", "a": "Watch only", "d": "CPA Trend for the selected period.", "nc": true}, {"n": "CPC Anomaly", "o": "Run operations", "a": "Watch only", "d": "CPC Anomaly for the selected period.", "nc": true}, {"n": "CPC Spike Detection", "o": "Run operations", "a": "Watch only", "d": "CPC Spike Detection for the selected period.", "nc": true}, {"n": "CPC Trend", "o": "Run operations", "a": "0 / 25", "d": "CPC Trend for the selected period.", "nc": true}, {"n": "CTR Decline Alert", "o": "Protect revenue", "a": "Watch only", "d": "CTR Decline Alert for the selected period.", "nc": true}, {"n": "CTR Trend", "o": "Run operations", "a": "Watch only", "d": "CTR Trend for the selected period.", "nc": true}, {"n": "Clicks vs Conversions", "o": "Grow revenue", "a": "Watch only", "d": "Clicks vs Conversions for the selected period.", "nc": true}, {"n": "Conversion Drop Alert", "o": "Grow revenue", "a": "Watch only", "d": "Conversion Drop Alert for the selected period.", "nc": true}, {"n": "Conversion Rate Trend", "o": "Grow revenue", "a": "Watch only", "d": "Conversion Rate Trend for the selected period.", "nc": true}, {"n": "Conversions Trend", "o": "Grow revenue", "a": "Watch only", "d": "Conversions Trend for the selected period.", "nc": true}, {"n": "Conversions by Country", "o": "Grow revenue", "a": "Watch only", "d": "Conversions by Country for the selected period.", "nc": true}, {"n": "Conversions by Hour", "o": "Grow revenue", "a": "Watch only", "d": "Conversions by Hour for the selected period.", "nc": true}, {"n": "Impression Share", "o": "Run operations", "a": "70 / 40", "d": "Impression Share for the selected period.", "nc": true}, {"n": "Impressions Trend", "o": "Run operations", "a": "Watch only", "d": "Impressions Trend for the selected period.", "nc": true}, {"n": "ROAS Trend", "o": "Grow revenue", "a": "Watch only", "d": "ROAS Trend for the selected period.", "nc": true}, {"n": "Spend Anomaly", "o": "Run operations", "a": "Watch only", "d": "Spend Anomaly for the selected period.", "nc": true}, {"n": "Spend Over Time", "o": "Run operations", "a": "0 / -10", "d": "Spend Over Time for the selected period.", "nc": true}, {"n": "Spend by Country", "o": "Customer experience", "a": "Watch only", "d": "Spend by Country for the selected period.", "nc": true}], "audits": [{"n": "Conversion tracking broken (clicks \u003e 0 but conversions = 0)", "o": "Grow revenue", "sev": "critical", "s": "Report only", "why": "Over 100 clicks with zero recorded conversions almost never means genuinely zero sales; it means the ad platform cannot see the sales that are happening. Every bid strategy that optimises toward conversions is currently optimising against no signal at all, which makes the campaign's spend effectivel", "codes": ["AD-TRACK-002"]}, {"n": "Wasted spend ,  campaigns with ROAS \u003c 1 over 30d", "o": "Grow revenue", "sev": "critical", "s": "Candidate remediation", "why": "A campaign returning less than $1 of revenue for every $1 spent is losing money on every dollar put into it, before accounting for product cost or fulfilment. Over 30 days that is not a bad day, it is a sustained drain on ad budget that could be funding a campaign that actually returns a profit.", "codes": ["AD-SPEND-001"]}, {"n": "Missing UTM tags in ad destination URLs", "o": "Control risk and change", "sev": "high", "s": "Report only", "why": "Ads landing without UTM tags cannot be attributed, so the spend disappears from every report and the channel looks worse than it is.", "codes": ["AD-TRACK-001"]}, {"n": "Budget \u003e 80% used before mid-month", "o": "Grow revenue", "sev": "medium", "s": "Candidate remediation", "why": "More than 80% of this month's budget is gone before the month is half over. At this pace the campaign runs out of budget and stops serving for the back half of the month, losing whatever sales it would have driven during that gap.", "codes": ["AD-SPEND-002"]}, {"n": "Disapproved ads in active campaigns", "o": "Grow revenue", "sev": "medium", "s": "Candidate remediation", "why": "A disapproved ad stops serving immediately, so any budget allocated to it is not reaching anyone. If it sits in an active campaign unnoticed, the campaign quietly loses reach and volume with no error visible outside the ad platform itself.", "codes": ["AD-CREATIVE-001"]}], "autos": [], "inValidation": 0}} />
