Wpd Calculate Cost Profit By Order

Alpha Insights Documentation

Docs Navigation



Function: wpd_calculate_cost_profit_by_order

Calculate and retrieve complete cost and profit data for a WooCommerce order.

Description

This is the primary function for retrieving order profit calculations. It calculates all costs (products, shipping, fees, custom costs) and returns a comprehensive array of profit data. Use this when you need to get profit information for an order programmatically.

Location

File:includes/wpd-functions.php

Line:~165

Function Signature

wpd_calculate_cost_profit_by_order( $order_id_or_object = null, $update_values = false )

Parameters

Parameter Type Required Description
$order_id_or_object int|WC_Order|null No Order ID, WC_Order object, or null for current order
$update_values bool No Whether to save calculation results to database (default: false)

Return Value

Type: array|false

Description: Array of profit calculations, or false if order invalid

Return Array Structure

array(
    // Revenue
    'order_total' => 125.50,
    'order_total_inc_tax' => 135.00,
    'order_total_ex_tax' => 125.50,
    'order_tax' => 9.50,
    'order_discount' => 10.00,
    // Product Costs
    'product_cost' => 52.00,
    'product_cost_per_unit' => 26.00,
    // Shipping
    'shipping_cost' => 8.00,
    'shipping_revenue' => 10.00,
    // Fees
    'payment_gateway_cost' => 3.95,
    'payment_method' => 'stripe',
    // Custom Costs
    'custom_order_costs' => array(),
    'custom_product_costs' => array(),
    // Calculated Totals
    'total_costs' => 63.95,
    'gross_profit' => 61.55,
    'profit_margin' => 49.04,
    // Meta
    'currency' => 'USD',
    'order_date' => '2024-01-15 14:30:00',
    'order_status' => 'completed'
)

Example Usage

Basic Usage – Get Profit for Order

// By order ID
$profit_data = wpd_calculate_cost_profit_by_order( 12345 );

if ( $profit_data ) {
    $profit = $profit_data['gross_profit'];
    $margin = $profit_data['profit_margin'];
    echo 'Order profit: $' . number_format( $profit, 2 );
    echo 'Margin: ' . number_format( $margin, 2 ) . '%';
}

Using Order Object

// Get order object
$order = wc_get_order( 12345 );

if ( $order ) {
    $profit_data = wpd_calculate_cost_profit_by_order( $order );
    
    // Access specific values
    $revenue = $profit_data['order_total_ex_tax'];
    $costs = $profit_data['total_costs'];
    $profit = $profit_data['gross_profit'];
}

Calculate and Save to Database

// Recalculate and save results
$profit_data = wpd_calculate_cost_profit_by_order( 12345, true );

// Results are now saved to order meta and database
// Future calls will use cached values

In WooCommerce Hook

add_action( 'woocommerce_order_status_completed', 'custom_profit_check' );

function custom_profit_check( $order_id ) {
    // Calculate profit when order completes
    $profit_data = wpd_calculate_cost_profit_by_order( $order_id );
    
    if ( $profit_data && $profit_data['gross_profit'] 

Bulk Profit Calculation

// Calculate profit for multiple orders
$order_ids = array( 100, 101, 102, 103, 104 );
$total_profit = 0;

foreach ( $order_ids as $order_id ) {
    $profit_data = wpd_calculate_cost_profit_by_order( $order_id );
    if ( $profit_data ) {
        $total_profit += $profit_data['gross_profit'];
    }
}

echo 'Total profit: $' . number_format( $total_profit, 2 );

Custom Profit Report

function generate_daily_profit_summary() {
    // Get today's orders
    $args = array(
        'limit' => -1,
        'date_created' => '>=' . strtotime( 'today' ),
        'status' => array( 'processing', 'completed' )
    );
    $orders = wc_get_orders( $args );
    
    $total_revenue = 0;
    $total_costs = 0;
    $total_profit = 0;
    
    foreach ( $orders as $order ) {
        $profit_data = wpd_calculate_cost_profit_by_order( $order );
        if ( $profit_data ) {
            $total_revenue += $profit_data['order_total_ex_tax'];
            $total_costs += $profit_data['total_costs'];
            $total_profit += $profit_data['gross_profit'];
        }
    }
    
    return array(
        'revenue' => $total_revenue,
        'costs' => $total_costs,
        'profit' => $total_profit,
        'margin' => $total_revenue > 0 ? ($total_profit / $total_revenue) * 100 : 0,
        'order_count' => count( $orders )
    );
}

Return Value Details

Revenue Fields

  • order_total: Complete order total including tax
  • order_total_inc_tax: Total including tax
  • order_total_ex_tax: Total excluding tax (used for profit calculation)
  • order_tax: Tax amount collected
  • order_discount: Discounts applied

Cost Fields

  • product_cost: Total cost of all products in order
  • shipping_cost: Shipping fulfillment cost
  • payment_gateway_cost: Payment processing fees
  • custom_order_costs: Array of custom order-level costs
  • custom_product_costs: Array of custom product-level costs
  • total_costs: Sum of all costs

Profit Fields

  • gross_profit: Revenue minus total costs
  • profit_margin: Profit as percentage of revenue

Performance Considerations

Caching

Results are cached after calculation:

  • First call: Performs full calculation
  • Subsequent calls: Returns cached value
  • Cache invalidated when order or costs updated

When to Use update_values Parameter

$update_values = false (default):

  • Just retrieving data for display
  • Don’t need to save to database
  • Faster (reads from cache if available)

$update_values = true:

  • Want to force recalculation
  • Save new calculation to database
  • After updating costs/settings
  • Slower (always recalculates)

Error Handling

$profit_data = wpd_calculate_cost_profit_by_order( $order_id );

if ( false === $profit_data ) {
    // Order doesn't exist or calculation failed
    error_log( 'Could not calculate profit for order #' . $order_id );
    return;
}

// Safe to use profit data
$profit = $profit_data['gross_profit'];

Common Use Cases

Display Profit in Custom Location

add_action( 'woocommerce_admin_order_data_after_order_details', 'display_order_profit' );

function display_order_profit( $order ) {
    $profit_data = wpd_calculate_cost_profit_by_order( $order );
    
    if ( $profit_data ) {
        echo '

Order Profit: ' . wc_price( $profit_data['gross_profit'] ) . '

'; } }

Export Profit Data to CSV

function export_profit_data_csv() {
    $orders = wc_get_orders( array( 'limit' => -1 ) );
    $csv_data = array();
    
    // Header row
    $csv_data[] = array( 'Order ID', 'Date', 'Revenue', 'Costs', 'Profit', 'Margin %' );
    
    foreach ( $orders as $order ) {
        $profit_data = wpd_calculate_cost_profit_by_order( $order );
        if ( $profit_data ) {
            $csv_data[] = array(
                $order->get_id(),
                $order->get_date_created()->date( 'Y-m-d' ),
                $profit_data['order_total_ex_tax'],
                $profit_data['total_costs'],
                $profit_data['gross_profit'],
                $profit_data['profit_margin']
            );
        }
    }
    
    // Output CSV
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="profit-export.csv"');
    $output = fopen('php://output', 'w');
    
    foreach ( $csv_data as $row ) {
        fputcsv( $output, $row );
    }
    
    fclose( $output );
    exit;
}

Related

Got A Question?

Subscribe
Notify of
guest
0 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
Alpha Insights

Alpha Insights

The World's Most Advanced WooCommerce Drag & Drop Report Builder.

5/5 – Trustpilot

Alpha Insights