Search

Profit In Practice End-To-End COGS And Margin Integration For Google Shopping

How to collect COGS per product, model profit per order and send it to Google Ads as the conversion value, so Shopping and Performance Max bid on profit.

By , Founder
Published 13 min read

If you’re still optimizing Google Shopping on revenue and ROAS alone, you’re flying blind.

In a world of rising acquisition costs, discount-heavy promotions, and wildly different margins across SKUs, revenue-based ROAS tells you where money came in — not whether any stayed behind as profit.

This guide gives you a practitioner-grade blueprint to collect, model, and activate COGS and margin data end-to-end so you can:

  • Track true gross profit per order, not just revenue
  • Optimize Shopping and Performance Max toward profit (POAS), not ROAS
  • Fix reporting distortions from returns, cancellations, and discounts
  • Answer all those hard questions like:
    • How to integrate COGS and margin tracking with Google Shopping?
    • How to track margins effectively in Google Shopping?
    • How to improve Google Shopping ROI with margin tracking?

1. Why Revenue-Based ROAS Breaks Down In Google Shopping

Google Shopping is great at showing you which products generate revenue. But several structural realities make raw revenue a poor optimization signal:

  1. Margin variance across the catalog
    A $100 sale at 15% margin is not the same as a $100 sale at 60% margin. Revenue-based ROAS treats them identically.

  2. Multi-item baskets
    A user might click on Product A (mid-margin) and then buy Products B and C (high-margin). If you only look at revenue on the clicked product, you under- or overvalue that traffic.

  3. Promotions, discounts, and fees
    20% off sales, coupons, and payment or marketplace fees can erase margin even when ROAS looks exceptional.

  4. Returns and cancellations
    Revenue-based tracking usually counts the initial sale but rarely subtracts returns cleanly. Your ROAS stays inflated long after the cash went back to the customer.

Bar chart of two $100 sales: at 15% margin the gross profit is $15, at 60% margin it is $60, while revenue-based ROAS counts both as $100 of revenue.
A $100 sale at 15% margin leaves $15 of gross profit and one at 60% leaves $60, yet revenue-based ROAS values both at $100.Source: Worked example from this article: a $100 sale at 15% and at 60% margin
Show the data
Two $100 sales with the same revenue and very different profit
SaleRevenueGross profit
$100 sale at 15% margin$100$15
$100 sale at 60% margin$100$60

To get Google to optimize for actual business outcomes, you need to upgrade from ROAS (revenue on ad spend) to POAS (profit on ad spend) — and that means integrating COGS and margin deeply into your Shopping and Google Ads stack.

2. Step 1 - Define The Profit Metric You Want Google To Optimize

Before you touch feeds or tags, get crystal clear on what “profit” means in your context. Your definition drives every downstream modeling and integration decision.

2.1 Choose Your Optimization Metric

For most ecommerce advertisers, you’ll choose one of these as the conversion value you send to Google Ads:

  1. Gross profit per order (GP1)
    Formula (per line item):

    Gross profit = (Item revenue - COGS) × Quantity

    Roll this up to the order level by summing across all items.

  2. Contribution margin including variable costs (GP2)
    Here you also subtract variable costs like shipping, payment fees, packaging, and marketplace commissions:

    Contribution margin = Revenue
                         - COGS
                         - Discounts
                         - Shipping costs
                         - Payment fees
                         - Packaging/handling
  3. Net profit proxy
    Some brands also subtract a standard overhead allocation (e.g., 10–15% of revenue) if they want to optimize closer to true net profit.

Recommendation:

  • Use gross profit (GP1) if you want a clean, simple model and your variable costs are relatively flat.
  • Use contribution margin (GP2) if shipping, transaction fees, or marketplace commissions significantly affect profitability and you want your POAS targets to reflect that reality.

2.2 Decide What Not To Include

Don’t try to cram everything into the conversion value. As a rule of thumb:

  • Include anything that varies by order or product (COGS, discounts, shipping, fees) so Google sees the true incrementality of each click.
  • Exclude fixed overhead (office rent, salary for the CEO) from the Google Ads conversion value, and handle that in your financial modeling outside of Ads.

This keeps the signal both accurate and stable enough for Smart Bidding to work with.

Diagram of three profit definitions built from revenue: gross profit (GP1) after COGS, contribution margin (GP2) after variable costs, and net profit after fixed overhead, which stays outside Google Ads
GP1 and GP2 change with every order, so either one works as the conversion value; net profit after fixed overhead belongs in finance reporting.

3. Step 2 - Collect COGS And Margin Data At The Product Level

Once you know what profit metric you want, you need reliable product-level COGS and related cost data.

3.1 Define Your Data Sources

Typical COGS inputs live in one or more of:

  • ERP / inventory system (e.g., cost price, landed cost, supplier info)
  • Ecommerce platform (Shopify, Magento, BigCommerce, custom)
  • Accounting platform (for fees, commissions, and adjustments)
  • Logistics / 3PL system (shipping and packaging costs)

Your first job is to extract these into a single COGS table, keyed by a stable product identifier.

3.2 Standardize Product Identifiers

Google Shopping lives on item IDs (the id field in your Merchant Center feed). Your internal systems often use SKUs.

Create a mapping layer:

products
--------
internal_sku
google_item_id
brand
category
...

Make sure every item in your Merchant Center feed has:

  • A unique google_item_id
  • A corresponding internal_sku in your source systems

This mapping is critical — it’s how COGS from your ERP ends up associated with the same product ID Google Shopping sees.

Flow diagram: ERP, ecommerce platform, accounting and 3PL costs feed one product_costs table keyed by internal_sku, which a mapping layer joins to google_item_id, the Merchant Center feed id
Costs from four systems meet the products in your ads only through the internal_sku to google_item_id mapping.

3.3 Build Your COGS Table

At minimum, aim for a structure like:

product_costs
-------------
internal_sku
base_cogs              -- unit cost, ideally landed cost
avg_shipping_cost      -- optional per-unit estimate
payment_fee_rate       -- e.g., 0.025 for 2.5%
packaging_cost         -- optional
margin_bucket          -- low / medium / high, if you still use segmentation
valid_from             -- cost effective date
valid_to               -- optional end date

Maintain this table centrally and treat it as the single source of truth for all profit-related modeling.

3.4 Handling Products Without A Cost Price

You will have SKUs with missing COGS. To avoid poisoning your profit data:

  1. Fallback rules

    • Use brand- or category-level average margins temporarily.
    • Or assign a conservative default margin (e.g., 20%) and flag for cleanup.
  2. Fail-safe in bidding

    • Either exclude these products from profit-based bidding until COGS is set, or
    • Bid on them using a separate “revenue-only” conversion action with stricter targets.
  3. Operational loop
    Make missing COGS a KPI for merchandising/finance to tackle each week until coverage is near 100%.

4. Step 3 - Model Order-Level Profit From COGS

With product-level COGS in place, the next step is to turn orders into profit events that Google Ads can consume.

4.1 Core Data Model

You’ll typically work with four logical tables (even if they’re views in your warehouse):

orders
------
order_id
order_datetime
customer_id
currency
shipping_revenue
tax
coupon_code
order_status

order_items
-----------
order_id
internal_sku
quantity
item_price_ex_vat
item_discount_amount

product_costs
-------------
internal_sku
base_cogs
avg_shipping_cost
payment_fee_rate
packaging_cost

ad_clicks
--------
order_id (or gclid/order_id join table)
gclid / gbraid / wbraid
campaign
ad_group
...

4.2 Example Profit Calculation Per Line Item

For each order_item, join to product_costs and compute:

line_revenue   = (item_price_ex_vat - item_discount_amount) × quantity

line_cogs      = base_cogs × quantity

line_ship_cost = avg_shipping_cost × quantity

line_fee_cost  = line_revenue × payment_fee_rate

line_profit    = line_revenue
                 - line_cogs
                 - line_ship_cost
                 - line_fee_cost
                 - packaging_cost × quantity

Then aggregate to order level:

order_profit = SUM(line_profit for all items in the order)
Worked example of line-item profit: two units at $50 with a $5 discount give $90 revenue; minus $40 COGS, $6 shipping, $2.25 payment fees and $2 packaging leaves $39.75 line profit
For example, two units at $50 with a $5 discount bring in $90 of revenue but $39.75 of profit: the number to send as the conversion value.

Depending on your metric choice from Step 1, you may omit certain costs (e.g., shipping) from order_profit.

4.3 Net Versus Gross Profit As Google Ads Conversion Value

Many teams ask:

Should we send gross profit or net profit as the Google Ads conversion value?

Guidelines:

  • Use gross profit or contribution margin as your conversion value. These capture product-level and order-level economics that depend on each click.
  • Keep true net profit (after all fixed overhead) for your finance and board reporting.

The goal inside Google Ads is not perfect accounting; it’s to give Smart Bidding a clean, high-signal proxy for business value that varies meaningfully between clicks.

5. Step 4 - How To Integrate COGS And Margin Tracking With Google Shopping

Now that you can compute profit per order, you need to connect it to Google Shopping and Performance Max.

There are three key integration surfaces:

  1. Merchant Center product data (for reporting and segmentation)
  2. Conversion tracking in Google Ads (for bidding)
  3. Analytics (for cohort and LTV insights)
Diagram of profit per order going to three places: cost_of_goods_sold in Merchant Center for reporting and segmentation, profit as the Google Ads conversion value for bidding, and analytics for cohort and LTV insights
Profit data goes to three places, but only the Google Ads conversion value changes how campaigns bid.

5.1 Use Merchant Center COGS For Reporting Not Bidding

Google Merchant Center supports a cost_of_goods_sold attribute. Populating this lets you analyze profit in product performance reports, especially when combined with Conversion with Cart Data (CwCD) reporting.

However:

  • COGS in Merchant Center/Shopping is primarily a reporting field, not a direct bidding input.
  • You cannot currently plug the COGS column itself into a bidding formula or Google Ads bid strategy.

So, while you should fill cost_of_goods_sold where possible, profit-based bidding still relies on sending profit as the conversion value in Google Ads.

5.2 Margin-Based Feed Segmentation When You Must

If you’re not ready to overhaul conversion tracking, a transitional approach is to:

  1. Use feed rules or an external feed tool to compute margin % from price and cost_of_goods_sold.
  2. Bucket products into margin tiers (e.g., margin_low, margin_mid, margin_high) using custom labels.
  3. Build separate Shopping or Performance Max campaigns by margin tier, with different ROAS targets.

This answers basic questions like “How to track margins effectively in Google Shopping?” at a segment level.

Caveats:

  • It assumes users buy the same product they clicked — often untrue in multi-item baskets.
  • It fragments your data across many campaigns, starving Smart Bidding of volume.

Use this as a stepping stone, not your end state.

Three-step diagram of margin tiers in the feed: compute margin from price and cost_of_goods_sold, label products margin_low, margin_mid or margin_high, run one campaign per tier with its own ROAS target
Margin tiers give each campaign its own ROAS target, but they miss what shoppers buy after the click and split the data bidding learns from.

5.3 Profit-Based Conversion Values The Real Answer

The robust way to improve Google Shopping ROI with margin tracking is to:

  • Compute profit per order (Section 3), and
  • Send that profit value to Google Ads as the conversion value for your primary purchase conversion action.

Once you do this, Google’s value-based bidding strategies (like “Maximize conversion value” or “Target ROAS”) effectively become profit-based bidding strategies.

This is the core of:

  • How to improve Google Shopping ROI with margin tracking
  • How to link COGS data to Google Shopping performance

6. Step 5 - Send Profit Instead Of Revenue As Your Google Ads Conversion Value

There are three main implementation paths, depending on your tech stack and latency tolerance.

Comparison of three ways to send profit to Google Ads: a real-time thank-you page tag the same day, server-side tracking minutes after the order, and offline conversion imports days or weeks later
The three paths differ in when profit reaches Google Ads: at checkout, from your backend, or once final costs are settled.

6.1 Real-Time Tracking On The Thank-You Page

Best if:

  • You can compute approximate profit at checkout (prices and COGS are stable, shipping cost is known upfront).

How it works:

  1. When an order is placed, your backend or tag manager assembles all line items.

  2. It looks up COGS and other variable costs for each SKU.

  3. It calculates order_profit based on your chosen formula.

  4. It fires the purchase conversion tag (via gtag, Google Tag Manager, or similar) with:

    gtag('event', 'purchase', {
      'send_to': 'AW-CONVERSION_ID/label',
      'value': order_profit,
      'currency': 'USD',
      'transaction_id': 'ORDER1234'
    });
  5. Google Ads logs the purchase with profit as the value, not revenue.

Pros:

  • Simple architecture
  • Same-day data, great for bid automation

Cons:

  • Harder to correct for returns and post-purchase adjustments unless you also implement conversion adjustments (see Section 7).

6.2 Server-Side Tracking Or A Conversion API

Best if:

  • You want more control and resilience than browser tags can provide.

How it works:

  1. Your backend receives order data and associates it with an ad click (via GCLID / GCLID-like ID, or first-party click/session IDs).
  2. A background job computes order_profit and posts it to Google Ads via API or server-side tag manager.

Pros:

Cons:

  • Requires engineering work and API familiarity

6.3 Offline Conversion Imports Delayed But Precise

Best if:

  • Your true COGS or fees are only known days or weeks after purchase (e.g., dynamic shipping, supplier costs, or marketplaces).

How it works:

  1. Log the initial order with a provisional conversion (often revenue-based or zero-value) using standard web tracking.
  2. After your accounting or warehouse system knows the final COGS, shipping, and fees, compute order_profit for each order.
  3. Import that data as offline conversions mapped to the original clicks or order IDs.

This path is slower but lets you answer advanced questions like:

  • How to analyze COGS data for Google Shopping success?
  • How to pass gross profit per order to Google Ads accurately, even with variable COGS?

7. Fixing Reality Returns Cancellations And Conversion Adjustments

Even with great COGS integration, your profit data will drift if you ignore what happens after the sale.

Common problems include:

  • Orders canceled before shipping
  • Partial returns (one item from a multi-item basket)
  • Full refunds weeks later

To keep your Google Ads data honest, you need a conversion adjustment loop.

7.1 Conceptual Model For Conversion Adjustments

  1. Maintain an order ledger with current status and up-to-date profit:

    order_id
    status           -- completed, canceled, refunded, partial_refund
    original_profit
    current_profit   -- after refunds/fees
    last_updated_at
  2. When current_profit changes (because of a refund, chargeback, or cost update), compute:

    profit_delta = current_profit - original_profit
  3. Translate profit_delta into a conversion adjustment back to Google Ads:

    • If the order is fully refunded, you effectively negate the original profit.
    • If an item is returned, you partially reduce the profit.
Diagram of a conversion adjustment for a return: original profit $40 sent at purchase, one item refunded so current profit is $22, profit delta minus $18, the conversion value restated to $22 or retracted after a full refund
For example, a return that lowers an order's profit from $40 to $22 becomes a −$18 adjustment, so Google Ads keeps only the profit that stayed.

This is the backbone of:

  • Automatic conversion adjustments for refunds in Google Ads
  • How to subtract refunds from Google Ads conversion value
  • Best way to correct Google Ads conversions for returns and refunds

7.2 Practical Recommendations

  • Start with full refunds and cancellations only. Negate those conversions so campaigns stop looking more profitable than they are.
  • Add partial refunds once your data pipeline is stable.
  • Run a regular job (e.g., nightly) that looks at orders updated in the last N days and posts the corresponding adjustments.

You don’t need perfect day-one coverage; moving from 0% to even 50–60% refund adjustment coverage dramatically improves the reliability of your POAS.

8. Shipping Payment Fees Discounts And Other Real-World Costs

Several of your target queries center on the messy bits of real ecommerce economics:

  • How to include cost of goods sold in Google Ads conversion value?
  • Should shipping costs be included in Google Ads conversion value?
  • How to include shipping and transaction costs in POAS?
  • How to account for payment fees and discounts in profit tracking?

Here’s a pragmatic approach.

8.1 Include What Changes Per Click

You want your conversion value to reflect incremental profit from each order. That means including:

  • COGS – this is non-negotiable if you’re serious about POAS.
  • Discounts and coupons – subtract them from revenue first.
  • Shipping costs – include if they vary meaningfully by product, destination, or basket size.
  • Payment fees and marketplace commissions – include if they’re a significant % of revenue.

8.2 How To Include Shipping And Transaction Costs In POAS

In your profit formula, keep these as explicit components:

order_profit = order_revenue
               - total_cogs
               - shipping_costs
               - payment_fees
               - packaging/handling

Then send order_profit as the Google Ads conversion value.

This way, you don’t need Google to “understand” shipping or fees explicitly — they’re baked into the value you send.

8.3 Net Profit Versus Gross Profit As Google Ads Conversion Value

If you want to compare net profit vs gross profit as Google Ads conversion value:

  • Start by sending gross profit or contribution margin as your in-platform value.
  • In your BI tool, layer on fixed cost allocations to compute net profit by campaign or channel.

Trying to send fully-loaded net profit into Google Ads usually adds complexity without improving optimization quality.

9. Privacy How To Bid On Profit Without Showing Google Your Real Margins

A common concern:

How do we bid on profit in Google Ads without showing Google our exact margins?

The answer is simple: scale your profit values.

If you multiply all profit values by a constant factor k (say 0.1 or 5), then:

  • Relative differences between clicks and campaigns stay the same.
  • Smart Bidding still learns which clicks are more or less valuable.
  • Google sees only a rescaled value, not your true dollar margin.

Example:

  • Real profit: $80 → send 8.0 (k = 0.1)
  • Real profit: $20 → send 2.0
Bar chart of real profit against the value sent to Google Ads at k = 0.1: an $80 order is sent as 8.0 and a $20 order as 2.0, so their ratio stays the same.
Both values shrink tenfold, so the $80 order still counts four times as much as the $20 order and bidding ranks them the same way.Source: Example from this article: profit values multiplied by k = 0.1
Show the data
Scaling profit by k = 0.1 keeps the ratio between orders
OrderReal profitValue sent (k = 0.1)
Order with $80 profit80.08.0
Order with $20 profit20.02.0

When you set a Target ROAS on this rescaled value, you just adjust the target accordingly.

This approach lets you fully embrace profit-based bidding while keeping true unit economics private.

10. Tools And Patterns For COGS Integration In Google Shopping Campaigns

If you’re wondering about tools for integrating COGS with Google Shopping analytics and conversion tracking, think in terms of capabilities rather than specific brands.

You’ll typically need:

  1. Data collection & modeling layer

    • Data warehouse or database (BigQuery, Snowflake, Postgres, etc.)
    • ETL or integration tool to pull from ERP, ecommerce, and logistics
    • Jobs (SQL, dbt, or similar) to compute order-level profit
  2. Feed management for Merchant Center

    • Ability to join your product feed with the product_costs table
    • Populate cost_of_goods_sold and, optionally, margin-based custom labels
  3. Conversion tracking integration

    • Web/SDK tags, server-side GTM, or a dedicated conversion API service
    • Logic to look up order_profit and send it as conversion value in real time or via offline imports
  4. Analytics & reporting

    • Dashboards showing POAS, profit per click, and profit per impression
    • Breakdowns by brand, category, margin bucket, device, and audience
Data flow diagram from ERP, ecommerce platform, 3PL and accounting into a modelling layer that builds product_costs and order_profit, then out to feed management, conversion tracking and analytics
The four capability layers form one flow: sources into a modelling layer, then out to the feed, the conversion value and your dashboards.

A platform like Productmetrics.io can sit across several of these layers — especially the COGS modeling and profit-based conversion integration pieces — so practitioners don’t have to build everything from scratch.

10.1 Recommendations For COGS Integration In Google Shopping Campaigns

To answer the query “recommendations for COGS integration in Google Shopping campaigns” directly, here’s a prioritized list:

  1. Get your COGS coverage above 90% of revenue. Partial coverage leads to misleading POAS.
  2. Start with a single profit metric (e.g., contribution margin before fixed overhead) and avoid changing it mid-quarter.
  3. Send profit as the primary conversion value in Google Ads as soon as your calculations are stable.
  4. Use Merchant Center COGS for diagnostics and QA, not as your main optimization lever.
  5. Limit campaign fragmentation. Don’t over-split by margin buckets; let Smart Bidding work on richer, consolidated data.
  6. Implement refund and cancellation adjustments within 60–90 days of an order wherever possible.
  7. Document your entire data flow — from ERP to Ads — so future changes don’t silently break profit tracking.

11. Implementation Checklist From ROAS To Profit

Use this as a practical runbook for your team.

Phase 1 - Foundations (1–3 weeks)

  • Align stakeholders on the definition of profit to use in Google Ads.
  • Inventory all COGS and cost data sources (ERP, ecommerce, 3PL, accounting).
  • Map internal SKUs to Google item IDs in your Merchant Center feed.
  • Build a product_costs table with COGS and key variable costs.

Phase 2 - Profit Modeling (2–4 weeks)

  • Build order and order_item tables (or views) if you don’t already have them.
  • Implement SQL or modeling logic to compute order_profit per order.
  • Validate profit outputs against finance for a sample of orders.
  • Populate Merchant Center cost_of_goods_sold for reporting.

Phase 3 - Activation In Google Ads (2–4 weeks)

  • Choose your activation path: real-time web tags, server-side, or offline imports.
  • Implement a profit-based purchase conversion action and test with low traffic.
  • Gradually switch Shopping and Performance Max campaigns to optimize on profit.
  • Set initial POAS/Target ROAS goals based on historical margins and adjust over time.

Phase 4 - Hardening And Optimization (Ongoing)

  • Add conversion adjustments for refunds and cancellations.
  • Tighten handling for products without COGS and missing data.
  • Monitor POAS by campaign, brand, and audience; shift budget toward the highest profit density.
  • Periodically revisit your profit definition as your business model evolves.
Bar chart of the shortest and longest duration per phase: foundations 1 to 3 weeks, profit modelling 2 to 4 weeks, activation in Google Ads 2 to 4 weeks.
Phases 1 to 3 take 5 to 11 weeks in total; Phase 4, hardening and optimisation, runs on from there.Source: Implementation checklist in this article (Phase 4 is ongoing)
Show the data
Weeks per phase, from ROAS to profit-based bidding
PhaseShortest (weeks)Longest (weeks)
Phase 1: foundations13
Phase 2: profit modelling24
Phase 3: activation in Google Ads24

12. Where Productmetrics.io Fits

Building all of this from scratch — COGS collection, profit modeling, and integration into Google Shopping and Google Ads — is absolutely possible. But it’s also exactly the kind of plumbing most growth and performance teams don’t have time to own long term.

Productmetrics.io is designed to:

  • Connect your product, order, and COGS data into a coherent profit model
  • Turn that model into clean, reliable profit-based conversion values for Google Ads
  • Help you monitor POAS, margins, and profitability across Shopping and Performance Max campaigns

If you’re ready to move from theoretical profit to profit in practice, this is the moment to make COGS and margin a first-class citizen in your Google Shopping stack.

Next step: Connect your product, finance, and acquisition teams, and design your profit model. Then use Productmetrics.io to operationalize it end-to-end — from raw COGS to profit-optimized bidding in Google Ads.

Written by

, Founder of Product Metrics

1M+ products analysed · Nominated at the Dutch Search Awards for Best Measurement Campaign (2023) and Best Use of Data (2024)

Linkedin

Keep reading.

See which of your products to push, fix or pause. Start with your own products, or a 30-second estimate.

Check one product first: work out its break-even ROAS in the calculator. Then see where all your products stand.

Find your hidden profit30-second estimate · no login
Analyse your products for freeFree analysis, no credit card

Questions, or want to spar about your products? Book a demo: a video call with Berend, then a demo account.