Most Shopify stores send one purchase event to every ad platform. A customer buys a $12 phone case. Another buys a $340 leather bag. Both fire the same Purchase event. Both get weighted identically by Meta's algorithm. Both contribute equally to your campaign optimization.
You're telling the algorithm that every order is the same. It believes you.
The result is a fundamental mismatch between what your business values and what your ad platforms optimize for. Meta, Google, and TikTok can optimize for almost anything you define and measure. Feed them a single, undifferentiated purchase event and the algorithm does the only thing it can: find more people who buy something from your store.
The algorithm treats every order as identical
When every purchase fires the same event, Meta learns one thing: this audience converts.
It doesn't distinguish between:
- A first-time acquisition and a repeat order from a customer already in your CRM
- A high-margin product and a loss-leader running on promotion
- A full-price order and one where a discount code wiped out the margin
- Your hero SKU and a clearance item you're trying to move
- A high-LTV customer and a one-and-done buyer
The algorithm optimizes toward more purchases. The margin, the LTV, and the strategic value of those purchases sit entirely outside its awareness.
Three signal gaps that cost you money
Prospecting campaigns keep re-converting existing customers
When a repeat customer converts through a prospecting campaign, Meta records a purchase and counts it as a win. Budget flows toward re-converting existing customers at prospecting CPMs. Your true new customer acquisition cost runs far higher than what the blended ROAS suggests.
Here's what this looks like in practice: a DTC skincare brand running Meta Advantage+ sees a 4x blended ROAS. Looks great. But 60% of those conversions are existing customers who would have purchased anyway through email or organic. The true new customer CAC is 3x what the dashboard reports.
Sending Purchase_NC for new customers and Purchase_RC for repeat customers gives Meta the distinction it needs:
- Prospecting campaigns stop re-acquiring your existing base
- Reported ROAS drops slightly
- Actual CAC drops significantly
Conversion value doesn't reflect margin
Most brands send the order total as the conversion value. That number includes discounts, shipping, and products with very different margin profiles.
An algorithm optimizing for revenue works against profitability while appearing to perform well on ROAS. A fashion ecommerce brand sending raw order totals tells Meta that a $200 sale with a 50%-off code is just as valuable as a $200 full-price order. One has $100 in margin. The other has $20.
Adjusting conversion values to reflect actual margin gives the algorithm an accurate signal of what a conversion is worth:
- Filter out heavily discounted orders below your margin threshold
- Weight high-margin SKUs higher in conversion value
- Let Meta Advantage+ optimize for margin, not revenue
Product-level signal is missing entirely
A product-enriched event tells the algorithm which audiences buy specific products, at what price points, in what combinations.
For stores with diverse catalogs, the audiences converting on your entry-level product and your premium line are different people. A subscription wellness brand selling $15 sample kits and $120 monthly bundles needs the algorithm to build separate audience models for each.
Feeding product category, SKU, and price tier as event parameters enables exactly this. You stop optimizing toward an averaged audience and start running campaigns that cover your full catalog with precision.
From generic events to enriched signals: the sequence
Getting from a crude Purchase event to a fully enriched, platform-optimized signal requires the right collection layer. Here is the sequence.
Move event capture server-side
Browser pixels only see what's visible in the browser at checkout. Server-side collection via Shopify webhooks gives you the full order record at the moment of capture: SKUs, margin, discount codes, channel, and full customer history. You cannot enrich what you didn't collect.
Tag new vs. repeat customers at the source
Cross-reference the order against your customer purchase history at the point of event capture. First-time buyers get Purchase_NC. Repeat buyers get Purchase_RC. This distinction needs to happen before the event leaves your infrastructure, not after.
Adjust conversion values before they reach platforms
Replace order totals with margin-adjusted values. Filter out orders where discount codes reduced margin below your threshold. This transformation should happen per platform, because Meta, Google, and TikTok each use conversion value differently.
Enrich with product-level parameters
Add SKU, product category, and price tier to every purchase event. For catalog-heavy stores, this is what lets the algorithm build separate audience models for different product lines rather than averaging everything together.
Monitor signal quality continuously
Enriched events degrade silently. A Shopify schema change, a platform API update, or a new product category that wasn't mapped correctly can quietly strip enrichment parameters from your events for weeks before anyone notices. Signal health monitoring catches this before it compounds.
Check out our Signal Recovery Playbook →
Cleaner, richer signals with EdgeTag
The gap between what brands send and what they should send is an infrastructure limitation, not a strategic one. Most growth teams know they need better signals. They lack the collection layer to produce them.
EdgeTag captures purchase events via native Shopify webhooks with the full order record available at the moment of capture: product SKUs, margin data, customer purchase history, discount codes applied, new vs. repeat customer status. Every enrichment signal, present from day one.
- Automatically tags new customer vs. repeat purchase across all standard ecommerce CRMs
- Filters Meta Advantage+ to high-margin purchases only
- Sends margin-adjusted conversion values to Google and Meta
- Routes product-level signals to the platforms that can act on them
Your algorithm is only as smart as the signal you send it. Send it better ones.
Fix your signals in a single implementation. Live in 15 minutes. No GTM. No engineers. No dev tickets.
