Active Ads (L30)
36
across all campaigns
L30 Total Spend
$84.5K
all active ad formats
Catalog/DPA Share
62%
$52.4K of total spend
Convention-Parsed Ads
83%
30 of 36 structured or catalog
PDP Data Window
33d
Jun 24 → Jul 26 (post-fix)
Framework Overview
We're buying sessions, not sales
Judge ads by what a click costs vs. what the destination earns — over long windows. Attribution ROAS is a lagging, blended illusion. Session economics are the real signal.
1
Buy sessions cheap
Every ad buys clicks. Every click is approximately a session (×0.85 landing rate). The cost per session is the unit price of traffic. Lower is not always better — if cheap sessions land on weak PDPs, it's wasted money. But cheap sessions on rich PDPs are pure upside.
2
Land on proven PDPs
Not all product pages earn equally. The destination's $/session (revenue ÷ sessions over 30–90d) tells you what a session to that PDP is worth historically. Pair cheap traffic with high-earning PDPs and you have a winning combination. Pair it with low-earners and you're burning budget.
3
Judge over 30–90d
Most conversions happen outside attribution windows. A visitor on day 1 might purchase on day 47. The 7-day attributed ROAS you see in Meta is the floor — real return is higher, but requires patience. This framework judges the portfolio-level relationship: sessions bought vs. long-window PDP yield.
Why attribution ROAS lies
Meta reports a blended ROAS that includes view-through, cross-device, and last-touch conversions — many of which would have happened organically. The real incremental floor is much lower. Example: Spoils portfolio currently shows a blended Meta ROAS of ~3.47× — but when you strip catalog to its true incremental signal, the floor is closer to 0.64×. That gap is the lie. This framework ignores attributed ROAS entirely and instead asks: what does a session to this PDP earn over 33–90 days, and what does it cost to buy that session?
The session-margin multiple
Multiple = PDP $/sess ÷ Ad cost-per-session
SCALE (4×+)
PDP earns ≥4× the cost of a session. Strong conviction to increase budget — even with organic attribution noise, the unit economics hold.
HOLD (2–4×)
Positive but not definitively scalable. Watch for improving PDP data or reduce cost-per-session before scaling further.
KILL (<2×)
Buying expensive sessions into low-yield PDPs. Pause or redirect to better destinations. Catalog/DPA ads not individually scorable.
The Horsepower example: 10,000 clicks to Horsepower at $0.28 cost/session = $2,800 in traffic cost. Horsepower earns $0.52/session over 33 days (post-fix window). Over 90 days that trajectory suggests $0.52 × 10,000 = $5,200+ earned — even before attribution window effects. Multiple = 1.86×. Promising, and we only have 33 days of data.
Session Economics
Sweet-Spot Scatter
X axis = ad cost per session (lower = better traffic buyer). Y axis = destination PDP $/session post-fix window. Dot size = L30 spend. Color = session-margin multiple tier. Only ads with parseable d: token and PDP match shown (12 of 36 active ads).
SCALE — 4×+ multiple
HOLD — 2–4× multiple
KILL — <2× multiple
Dot size = L30 spend
Note: ads pointing to collection pages or without parseable d: token (e.g. catalog/DPA, Multi, collection-level) are excluded from this chart. See Methodology for coverage details.
Ranked Ads
Scale / Kill Rankings
All active ads ranked by session-margin multiple. Ads without a parseable PDP destination appear at the bottom as Unscored. Catalog/DPA spend shown separately.
Catalog/DPA Spend — Not individually scorable
These ads use dynamic creative targeting collection pages or best-sellers. Session cost metrics exist but PDP-level session multiples can't be computed per-ad without destination-level click data from Meta.
| Ad | L30 Spend | CPC | Clicks | Est. Sessions | Cost/Sess |
|---|
Pattern Analysis
Creative Intelligence
Spend-weighted cost-per-session by creative dimension — parsed from ad naming convention. Lower cost/session = more efficient traffic buying. Bars show avg cost per session (lower = better). Photographers without PDP matches show cost efficiency only.
What the data tells us (derived from L30 actuals)
- Video beats Static on cost efficiency: Video ads (avg $1.91/sess) buy sessions 48% cheaper than Statics (avg $3.68/sess) across all parsed convention ads — but both are sending traffic to low-PDP-yield destinations.
- Lifestyle PrintLed is the most efficient creative system: Lifestyle + PrintLed concept (Maxime Delestre content) drives the lowest cost/session at ~$1.44/sess with $12.9K L30 spend — the engine. The issue is the destinations (collection pages vs. specific high-yield PDPs).
- Western and Vehicles are expensive for what they buy: Western ads avg $4.81/sess, Vehicles avg $3.64/sess — 2–3× more expensive than Lifestyle, sending to PDPs with near-zero historical $/session data. Consider pausing or redirecting to proven-yield destinations.
Visual Style (a:)
Format (e:)
Funnel Stage (b:)
Creative Concept (c:)
Photographer (f:)
Revenue Maturity Model
Maturity Curve — v1.1 Preview
How does a PDP's revenue accumulate over time after a session? Most attribution windows capture 7 days — but 30–65% of eventual 90-day revenue comes later. This curve (when fitted to real cohort data) lets us judge young ads before the full window closes.
Day 7 (attribution window)
~35%
of eventual 90d revenue
Day 30
~68%
of eventual 90d revenue
Day 60
~87%
of eventual 90d revenue
Day 90 (benchmark)
100%
full attribution window
What v1.1 will enable
Early ad scoring
If day-7 attribution shows 35% of 90d total, we can project: a new ad with 35 attributed conversions at day 7 is on track for 100 at day 90. Judge young ads with the curve, not by raw 7d numbers.
Requires
Cohort-level session-to-purchase linkage in Supabase. Tag each session with ad source, track purchase events at 7/30/60/90d. Fit the S-curve to real data per-print or per-category. Plan: v1.1 implementation using existing GA4 + Shopify linkage.
Honesty & Caveats
Methodology & Footnotes
Everything you need to know about how these numbers were calculated, what they mean, and what they don't.
Data Sources
| Meta Insights | Graph API v24.0 (auto-upgraded from v19), act_16731102, L30 as of Jul 27 2026 |
| PDP Data | Supabase traffic_audit_daily, Jun 24 – Jul 26 2026 (33 days post-fix window) |
| Session Rate | Estimated: clicks × 0.85 landing rate (GA4-verified approximation — see footnote 1) |
Convention Parsing Coverage
19
Convention-parsed
10
Catalog/DPA
6
Unparsed / legacy
83%
Overall coverage
Of the 19 convention-parsed ads, 11 point to collection/multi pages — not scorable. 12 have PDP-matchable d: tokens.
Footnotes
- Session approximation: Cost-per-session is calculated as ad spend ÷ (inline_link_clicks × 0.85). The 0.85 landing rate is a standard approximation — actual click-to-session rate varies by ad format, audience, and page load performance. GA4 verification is recommended before making large budget decisions. This approximation is clearly labeled throughout and will be replaced with GA4-verified click-to-session ratios in v1.1.
- Post-fix window (not "L60"): PDP $/session data covers Jun 24 – Jul 26 2026 — exactly 33 days. This is the "post-fix" window, beginning when the analytics fix that corrected session tracking was deployed. It is labeled accordingly throughout this document and is NOT a true L60 window. Treat it as a 33-day baseline, not a long-term average.
- Portfolio-vs-causal caveat: PDP $/session figures include ALL sessions to that product page — organic search, direct, email, social, and paid. It is a portfolio metric, not a causal attribution. An ad buying sessions to Porsche Surf doesn't guarantee those sessions earn the same $0.87/session that organic Porsche Surf sessions earn. The assumption is that paid sessions to the same PDP behave similarly over time — plausible but unverified without cohort-level tagging.
- Naming convention coverage: 83% of active ads (30/36) were classified as either convention-parsed or Catalog/DPA. 6 ads use legacy, Instagram, or custom naming and could not be parsed. These are shown as "Unparsed" in the methodology breakdown. Of the 19 convention-parsed ads, 8 point to "Multi" or collection-level destinations and therefore cannot be mapped to a single PDP for scoring.
- Session multiple thresholds: SCALE (≥4×), HOLD (2–4×), KILL (<2×) are judgment thresholds, not scientifically derived. They are designed to account for the organic attribution noise in PDP $/session — at 4×, even if 75% of PDP yield is organic, the ad still breaks even. At <2×, the causal signal is too weak to justify current spend rates.
- Meta API version: The request was made at v19.0 but auto-upgraded to v24.0 by Facebook's API. Data accuracy is consistent — this is a deprecation auto-upgrade, not a data change.