The cause: GA4's default attribution model is "last-click attribution". The last touch point before conversion gets 100% credit, even if earlier channels did the awareness work.
GA4 offers several attribution models:
| Model | How it works | Real-world example | Problem |
|---|---|---|---|
| Last-click (default) | Last channel before conversion gets 100% credit | Meta → Search (buy) = Google 100% | Ignores awareness work |
| First-click | First channel gets 100% credit | Google → Meta → Search (buy) = Google 100% | Ignores conversion work |
| Data-driven | Google AI allocates credit based on historical likelihood each touch drives conversion | Meta 40%, Google 60% for this conversion | Black box, GA4 Premium only |
| Linear | All channels split credit equally | Meta 33%, Google 33%, Email 33% | Oversimplifies real impact |
| Time decay | Recent touches get more credit (exponential) | Meta 20%, Google 80% (Search was recent) | Better than last-click, still imperfect |
AU reality check: Most dropshippers are running Meta (awareness) + Google (conversion). With last-click attribution (GA4 default), all the credit goes to Google. This is why Google Ads always looks better in GA4 than it really is.
Step 1: Ensure GA4 is on both your store and Meta Pixel
Both need to see the same user:
~~~ // Shopify store: GA4 tracking code <script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXX"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-XXXXXXXX', { 'allow_google_signals': true, 'allow_ad_personalization_signals': true }); </script>
// Shopify store: Meta Pixel <script> !function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; // ... standard Meta Pixel code </script> ~~~
Both GA4 and Meta Pixel must fire on page load and on conversion.
Step 2: Use Google's "Google Signals" to track cross-device
This allows GA4 to follow a user from their Android phone (where they saw Meta ads) to their desktop (where they searched Google Search).
Setup: GA4 Admin → Data Collection > Additional Settings > Enable Google Signals
Step 3: Change attribution model
GA4 Admin → Reporting > Attribution Settings:
Real change: With time-decay attribution:
This is more accurate than "Google 100%".
GA4 attribution is never perfect. The free way to verify: post-purchase survey.
Add a question to your post-purchase email or Shopify order page:
"How did you find us? (Choose one)
After 100 orders, you will have real data on how customers discovered you:
Real AU example (posture corrector operator):
| Discovery method | GA4 credit | Post-purchase survey | Real % |
|---|---|---|---|
| Meta ads | 20% | Meta ad → then Googled brand | 30% |
| Google Search (brand) | 50% | Searched brand name | 35% |
| Organic / direct | 20% | Friend link, word of mouth | 25% |
| Other (Pinterest, etc.) | 10% | - | 10% |
Insight: GA4 was crediting Google Search 50%, but post-purchase survey shows only 35% of customers actually found you via Google first. 15% of "Google conversions" were really "Meta → Google" customers. Meta was actually driving 30% of revenue, not 20%.
This insights changes budget allocation: if Meta drives 30% but GA4 showed 20%, you should increase Meta budget (underinvested). If Google shows 50% but really drives 35%, you can decrease Google budget (overinvested).
Corrected attribution example (kitchen gadget operator):
GA4 last-click attribution (default, wrong):
Post-purchase survey attribution (corrected):
Corrected take-away: Google is still best (3.5x ROAS), but Meta is not as weak (1.5x vs 1.2x). The A