2025 STATE OF GOOGLE ADS UPDATE

GOOGLE ADS TRENDS UPDATE

Februray 2025 Market Report

Executive Summary

This report analyzes performance data from over 100 Google Ads accounts managed by our agency during February 2025. We've identified significant trends and actionable insights by examining accounts across different spend tiers while ensuring data accuracy by excluding inactive accounts.

Key Finding: Average cost-per-click (CPC) has risen by 8.3% since January 2025, continuing the upward trend we've observed throughout Q1. Despite rising costs, conversion rates have improved by 12.7%, indicating better targeting and ad relevance across our accounts.

Our analysis focuses on accounts with at least 1 impression during the reporting period, ensuring that all metrics and trends accurately reflect active campaign performance.

Most Significant Findings:

  • E-commerce accounts are showing the strongest ROAS at 303%, significantly outperforming other industry verticals
  • High-spend accounts (>$2000/month) continue to demonstrate the best overall performance with 211% average ROAS
  • Mobile performance has improved across all metrics, with mobile CTR now exceeding desktop by 1.2 percentage points
  • Performance Max campaigns are delivering 18% better conversion rates compared to traditional campaign types

Strategic Recommendations

  • Allocate additional budget to high-performing e-commerce campaigns to capitalize on exceptional ROAS
  • Consider consolidating smaller accounts to achieve the efficiency benefits observed in higher-spend accounts
  • Prioritize mobile experience and bidding strategies to leverage growing mobile performance advantages
  • Test Performance Max campaigns for accounts currently not utilizing this campaign type

Survey Highlights

$1.75
Average CPC in March 2025
+8.3% MoM
4.2%
Average CTR across all accounts
+0.8% MoM
303%
Average ROAS for e-commerce accounts
TOP PERFORMER
7.5%
Average conversion rate
+12.7% MoM
18%
Better conversion rate with Performance Max
47%
Of accounts use Smart Bidding strategies
1

How does account spend level impact performance metrics?

Our analysis consistently shows a strong correlation between monthly ad spend and key performance indicators. Higher-spending accounts generally outperform lower-spending accounts across critical metrics, suggesting economies of scale in Google Ads management.

Average ROAS by Account Spend Tier

Conversion Rate by Account Spend Tier

Insight: High-spend accounts (>$2000/month) achieve an average ROAS of 211%, significantly outperforming low-spend accounts (65%). However, we've observed that medium-spend accounts are closing the gap, with a 143% average ROAS that has improved 12% since January.

The data shows a clear progression in performance as ad spend increases. This trend suggests that higher budgets enable more comprehensive optimization, better A/B testing opportunities, and increased data collection for machine learning algorithms to operate effectively. However, the improvements in medium-spend account performance indicate that strategic optimization can partially offset budget limitations.

2

What are the most significant CPC trends over time?

The rising cost of Google Ads continues to be a significant trend in March 2025, with notable variations across industries and device types.

CPC Trend (Dec 2024 - Mar 2025)

Insight: CPC has increased 8.3% since January 2025, with the most dramatic increases seen in B2B services (+15.2%) and professional services (+12.7%). E-commerce CPCs have remained relatively stable with only a 3.1% increase, suggesting less competition in this vertical.

While costs have increased overall, this trend varies significantly by device. Mobile CPCs are rising more slowly than desktop, showing only a 5.2% increase compared to 9.7% for desktop. This divergence may represent an opportunity to shift budget allocation toward mobile campaigns for improved efficiency.

3

How do industry verticals compare in ROAS performance?

Return on Ad Spend (ROAS) varies dramatically across different industry verticals, with certain categories consistently outperforming others.

ROAS by Industry (March 2025)

ROAS Trend by Top Industries (Q1 2025)

Insight: E-commerce accounts lead in ROAS performance with an average of 303%, followed by Fitness (222%) and Coffee/Specialty Food (247%). In contrast, B2B services typically show lower ROAS (19%) but have higher client lifetime values not captured in the immediate ROAS calculation.

When examining the three top-performing verticals, several common characteristics emerge. These accounts typically feature product-focused conversion actions with clear value attribution, highly targeted keywords with strong purchase intent, and consistent investment in creative optimization. The non-profit sector also shows strong performance (169% ROAS), demonstrating that cause-driven marketing can drive efficient conversion actions.

Mobile vs. Desktop Performance by Industry

The mobile vs. desktop performance gap varies significantly by industry. E-commerce accounts now see 22% higher conversion rates on mobile than desktop, while B2B services still perform 35% better on desktop. This divergence highlights the importance of device-specific strategies tailored to each industry's unique user behavior patterns.

4

How are Shopping vs. Search campaigns performing?

Our March 2025 data reveals distinct performance patterns between Shopping and Search campaigns, with important implications for budget allocation and optimization strategies.

Performance Comparison: Shopping vs. Search

Conversion Cost Comparison by Campaign Type

Insight: Shopping campaigns deliver a 34% lower cost-per-conversion than Search campaigns while maintaining comparable ROAS. However, Search campaigns generate 2.3x more total conversions, highlighting their value in driving overall conversion volume.

The performance gap between Shopping and Search campaigns is most pronounced in the e-commerce vertical, where Shopping campaigns achieve 41% lower cost-per-conversion. Interestingly, Performance Max campaigns that include Shopping functionality show even better efficiency, with a 47% lower cost-per-conversion compared to standard Search campaigns.

What's changing in Shopping campaign performance?

Over Q1 2025, we've observed a consistent improvement in Shopping campaign efficiency. Average CTR for Shopping campaigns has increased from 3.2% in January to 4.1% in March, while CPC has remained relatively stable. This suggests that Google's machine learning systems are getting better at matching Shopping ads to relevant queries.

5

What can we learn from Performance Max campaigns?

Performance Max campaigns continue to gain traction across our account portfolio, with notable performance advantages over traditional campaign types.

Performance Max vs. Traditional Campaigns (Key Metrics)

Key Advantages of Performance Max

🎯
Broader Reach
Automatically serves ads across all Google networks, reaching users on YouTube, Display, Search, Discover, Gmail, and Maps
🤖
Advanced AI Optimization
Leverages Google's machine learning to find the best audiences and placements for your goals
📊
Simplified Management
Requires less hands-on optimization, freeing up time for strategic improvements
💰
Improved ROAS
18% higher average ROAS compared to traditional campaign structures
🔄
Responsive Adaptation
Quickly adjusts to market changes and seasonal trends without manual intervention
📱
Cross-Device Optimization
Efficiently allocates budget across devices based on performance patterns

Insight: Performance Max campaigns show the most significant advantages in e-commerce (+23% ROAS) and lead generation for service businesses (+31% conversion rate). However, they underperform in complex B2B sales cycles, where traditional Search campaigns still deliver better quality leads.

While Performance Max campaigns deliver better overall performance, they require robust conversion tracking and a diverse set of assets to perform optimally. Accounts with limited creative assets or incomplete conversion tracking see much smaller performance improvements. We've found that providing at least 5 different ad headlines, 5 descriptions, and 10 images produces the best results.

Methodology Notes

This report analyzes Google Ads performance data from March 1-31, 2025, comparing it with January and February 2025 data for temporal context.

Data Collection and Processing

  • Account Selection: All accounts managed through our MCC account structure
  • Data Source: Direct export from Google Ads API
  • CRITICAL FILTERING: Only accounts with at least 1 impression during the reporting period were included in all calculations. Accounts with zero impressions were completely excluded from all averages, distributions, and trend calculations.
  • Spend Tier Categorization:
    • Low Spend: <$500/month
    • Medium Spend: $500-$2,000/month
    • High Spend: >$2,000/month

Calculation Methodology

  • Average Metrics: Calculated as weighted averages based on relevant denominators (clicks, impressions, etc.) rather than simple averages of account metrics
  • ROAS: Calculated as (All Conv. Value ÷ Cost) × 100
  • Conversion Rate: (Conversions ÷ Clicks) × 100
  • CTR: (Clicks ÷ Impressions) × 100

Special Notes for March 2025 Report

  • Performance Max data includes standard Performance Max and Performance Max for Shopping campaigns
  • Mobile vs. Desktop analysis is based on device segmentation data
  • Industry categorization is derived from account Tags using the primary industry designation
  • Shopping vs. Search comparison excludes accounts without both campaign types
				
					/**
 * State of Google Ads Report - JavaScript
 * Uses only WordPress-bundled libraries (jQuery)
 */
jQuery(document).ready(function($) {
    // Get data from hidden div
    const chartData = $('#chart-data');
    const accountSizesData = JSON.parse(chartData.attr('data-account-sizes'));
    const cpcDistributionData = JSON.parse(chartData.attr('data-cpc-distribution'));
    const ctrDistributionData = JSON.parse(chartData.attr('data-ctr-distribution'));
    const trendsData = JSON.parse(chartData.attr('data-trends'));
    const roasData = JSON.parse(chartData.attr('data-roas'));
    
    // Colors
    const colors = {
        blue: '#00b0f0',
        green: '#8cc63f',
        orange: '#f0ad4e',
        lightBlue: '#7ad7f9',
        lightGreen: '#b8dc85',
        gray: '#5a5a5a',
        lightGray: '#dddddd'
    };
    
    // Initialize all charts
    initAccountSizeChart();
    initDistributionChart('cpc-distribution');
    initTrendChart('cpc');
    initRoasChart();
    
    // Add tooltip container to body
    $('body').append('<div class="chart-tooltip"><div class="chart-tooltip-title"></div><div class="chart-tooltip-value"></div></div>');
    const tooltip = $('.chart-tooltip');
    
    /**
     * Initialize Account Size Performance Chart
     */
    function initAccountSizeChart() {
        const container = $('#account-size-chart');
        const width = container.width();
        const height = container.height();
        const segments = accountSizesData.segments;
        const metric = 'cpc'; // Default metric
        
        // Create canvas if it doesn't exist
        if (container.find('canvas').length === 0) {
            container.html('<canvas width="' + width + '" height="' + height + '"></canvas>');
        }
        
        const canvas = container.find('canvas')[0];
        const ctx = canvas.getContext('2d');
        
        // Draw the chart
        drawBarChart(ctx, segments, accountSizesData[metric], metric);
        
        // Add event listeners to toggle buttons
        $('.metric-toggle[data-metric]').on('click', function() {
            $('.metric-toggle[data-metric]').removeClass('active');
            $(this).addClass('active');
            
            const newMetric = $(this).data('metric');
            drawBarChart(ctx, segments, accountSizesData[newMetric], newMetric);
        });
    }
    
    /**
     * Initialize Distribution Chart
     */
    function initDistributionChart(chartType) {
        const container = $('#distribution-chart');
        const width = container.width();
        const height = container.height();
        
        // Data for current chart type
        let data;
        if (chartType === 'cpc-distribution') {
            data = cpcDistributionData;
        } else {
            data = ctrDistributionData;
        }
        
        // Create canvas if it doesn't exist
        if (container.find('canvas').length === 0) {
            container.html('<canvas width="' + width + '" height="' + height + '"></canvas>');
        }
        
        const canvas = container.find('canvas')[0];
        const ctx = canvas.getContext('2d');
        
        // Draw the chart
        drawPieChart(ctx, data.ranges, data.values);
        
        // Add event listeners to toggle buttons
        $('.metric-toggle[data-chart]').on('click', function() {
            $('.metric-toggle[data-chart]').removeClass('active');
            $(this).addClass('active');
            
            const newChartType = $(this).data('chart');
            initDistributionChart(newChartType);
        });
    }
    
    /**
     * Initialize Trend Chart
     */
    function initTrendChart(trendType) {
        const container = $('#trend-chart');
        const width = container.width();
        const height = container.height();
        const months = trendsData.months;
        
        // Create canvas if it doesn't exist
        if (container.find('canvas').length === 0) {
            container.html('<canvas width="' + width + '" height="' + height + '"></canvas>');
        }
        
        const canvas = container.find('canvas')[0];
        const ctx = canvas.getContext('2d');
        
        // Draw the chart
        drawLineChart(ctx, months, trendsData[trendType].current, trendsData[trendType].previous, trendType);
        
        // Add event listeners to toggle buttons
        $('.metric-toggle[data-trend]').on('click', function() {
            $('.metric-toggle[data-trend]').removeClass('active');
            $(this).addClass('active');
            
            const newTrendType = $(this).data('trend');
            drawLineChart(ctx, months, trendsData[newTrendType].current, trendsData[newTrendType].previous, newTrendType);
        });
    }
    
    /**
     * Initialize ROAS Chart
     */
    function initRoasChart() {
        const container = $('#roas-chart');
        const width = container.width();
        const height = container.height();
        
        // Create canvas if it doesn't exist
        if (container.find('canvas').length === 0) {
            container.html('<canvas width="' + width + '" height="' + height + '"></canvas>');
        }
        
        const canvas = container.find('canvas')[0];
        const ctx = canvas.getContext('2d');
        
        // Draw the chart
        drawBarChart(ctx, roasData.segments, roasData.values, 'roas');
        
        // Add winner badge to highest ROAS
        const maxRoas = Math.max(...roasData.values);
        const maxIndex = roasData.values.indexOf(maxRoas);
        if (maxIndex !== -1) {
            // Add winner badge
            container.append('<div class="winner-badge">Winner</div>');
        }
    }
    
    /**
     * Draw Bar Chart
     */
    function drawBarChart(ctx, labels, values, metric) {
        const width = ctx.canvas.width;
        const height = ctx.canvas.height;
        const barColors = [colors.blue, colors.green, colors.orange];
        const maxValue = Math.max(...values) * 1.2; // Add 20% padding
        const barWidth = width / (labels.length * 2);
        const spacing = barWidth / 2;
        
        // Clear canvas
        ctx.clearRect(0, 0, width, height);
        
        // Draw y-axis
        ctx.beginPath();
        ctx.moveTo(50, 30);
        ctx.lineTo(50, height - 50);
        ctx.lineTo(width - 30, height - 50);
        ctx.strokeStyle = colors.gray;
        ctx.stroke();
        
        // Draw y-axis labels
        ctx.font = '12px Arial';
        ctx.fillStyle = colors.gray;
        ctx.textAlign = 'right';
        
        const ySteps = 5;
        for (let i = 0; i <= ySteps; i++) {
            const yPos = height - 50 - ((height - 80) / ySteps * i);
            const value = (maxValue / ySteps * i).toFixed(1);
            ctx.fillText(value, 45, yPos + 5);
            
            // Draw grid line
            ctx.beginPath();
            ctx.moveTo(50, yPos);
            ctx.lineTo(width - 30, yPos);
            ctx.strokeStyle = colors.
				
			

Recent Posts