Chapter 20: Phase 0 - Nexus MVP

Goal

Validate the AdPriority concept using Nexus Clothing as a real-world test case. Phase 0 is a manual implementation using Google Sheets as the supplemental feed transport, with no application code. The purpose is to prove that priority-based custom labels in Google Merchant Center produce measurable ROAS improvement in Performance Max campaigns before investing in SaaS development.

Status: IN PROGRESS - Supplemental feed validated (10/10 matched)


Steps Completed

Step 1: Analyze Nexus Catalog

Pulled live data from the Shopify Admin API for nexus-clothes.myshopify.com.

MetricValue
Total products5,582
Active products2,425
Archived products3,121
Draft products36
Unique product types90
Unique vendors175
Unique tags2,522
Estimated active variants~15,000-20,000

The catalog follows a hierarchical product type naming convention: {Gender}-{Department}-{SubCategory}-{Detail}. Examples include Men-Tops-T-Shirts, Men-Bottoms-Pants-Jeans, and Headwear-Baseball-Fitted. The 90 product types were consolidated into 20 category groups for manageable priority assignment (see Appendix C).

Step 2: Verify GMC ID Format

Exported the full Google Merchant Center product catalog (124,060 variants) and confirmed the product ID format.

CONFIRMED FORMAT
================

  shopify_US_{productId}_{variantId}

  Examples:
    shopify_US_8779355160808_46050142748904
    shopify_US_9128994570472_47260097118440
    shopify_US_9057367064808_47004004712680

All products in GMC use variant-level IDs. The Item Group ID field contains just the Shopify product ID (e.g., 8779355160808). Country code is US for all Nexus products.

Step 3: Confirm Custom Labels Available

Audited all five custom label slots in the GMC product export.

LabelCurrent StateProducts UsingDecision
custom_label_0“Argonaut Nations - Converting”7 (0.006%)Safe to overwrite
custom_label_1EMPTY0Available
custom_label_2EMPTY0Available
custom_label_3EMPTY0Available
custom_label_4EMPTY0Available

All five labels are effectively available. The 7 products with existing custom_label_0 values represent a negligible fraction of the catalog and are safe to overwrite.

Step 4: Create Sample Feed

Built a Google Sheet with 10 test products spanning multiple categories, priority levels, and seasons.

Feed Structure:

Columns:
  id                 - GMC product ID (shopify_US_{pid}_{vid})
  custom_label_0     - Priority score (priority-0 through priority-5)
  custom_label_1     - Season (winter)
  custom_label_2     - Category group (e.g., headwear-caps, outerwear-heavy)
  custom_label_3     - Product status (in-stock, low-inventory, dead-stock)
  custom_label_4     - Brand tier (name-brand, off-brand)

Sample Products Tested:

ProductTypePriorityStatusBrand
New Era Colts Knit 2015Headwear-Knit Beanies4low-inventoryname-brand
New Era Yankees 59FIFTYHeadwear-Baseball-Fitted4in-stockname-brand
G3 Patriots HoodieMen-Tops-Hoodies & Sweatshirts0dead-stockoff-brand
Primitive Velour PantsMen-Bottoms-Joggers0dead-stockoff-brand
Mitchell & Ness Warriors HoodMen-Tops-T-Shirts3low-inventoryoff-brand
Levi’s Torn Up 501 JeansMen-Bottoms-Pants-Jeans0dead-stockoff-brand
Gray Earth Denim ShortsMen-Bottoms-Shorts-Denim1low-inventoryoff-brand
Cookies SF V3 GlowtrayAccessories3low-inventoryname-brand
Rebel Minds Puffer JacketMen-Tops-Outerwear-Jackets-Puffer Jackets5low-inventoryoff-brand
Ethika Men Go Pac GoMen-Underwear0dead-stockname-brand

Step 5: Upload to GMC

Connected the Google Sheet as a supplemental feed in Google Merchant Center.

Process:

  1. Shared the Google Sheet publicly (Viewer access)
  2. In GMC: Products > Feeds > Add supplemental feed > Google Sheets
  3. Linked the feed to all three primary data sources:
    • Content API - US, English
    • Content API - Local, US
    • Local Feed Partnership
  4. Triggered a manual update

Results:

MetricResult
Products in feed10
Products matched10 (100%)
Attribute names recognizedAll 6 columns
Issues foundNone
Processing time< 1 hour
Feed statusAccepted, no errors
VALIDATION RESULT
=================

  Feed Upload        -->  10 rows submitted
  ID Matching        -->  10/10 matched (100%)
  Label Application  -->  All 5 custom labels applied
  Errors             -->  0
  Warnings           -->  0
  Status             -->  VALIDATED

Remaining Steps

Step 6: Expand to Full Active Catalog

Scale the supplemental feed from 10 test products to the full active catalog.

Scope:

MetricEstimate
Active products~2,425
Active variants (rows needed)~15,000-20,000
Google Sheets cells used~120,000 (1.2% of 10M limit)

Process:

  1. Export all active products from Shopify API (paginated, 250/page, ~10 pages)
  2. For each product, enumerate all variants
  3. Apply category mapping rules (20 groups from category-mapping.md)
  4. Apply seasonal priorities (Winter season as of February 2026)
  5. Apply tag modifiers (NAME BRAND +1, in-stock +1, Sale -1, DEAD50 override to 0, archived override to 0, warning_inv_1 -1)
  6. Apply new arrival boost (products created within 14 days get priority 5)
  7. Generate GMC ID for each variant: shopify_US_{productId}_{variantId}
  8. Write all rows to Google Sheet via Sheets API or manual paste
  9. Verify GMC processes the full feed without errors

Expected Distribution (Winter, estimated):

PROJECTED PRIORITY DISTRIBUTION
================================

  Priority 5 (Push Hard):     ~300  (12%)  Puffer jackets, hoodies, new arrivals
  Priority 4 (Strong):        ~500  (21%)  Jeans, name brand items, joggers
  Priority 3 (Normal):        ~800  (33%)  Caps, basic t-shirts, year-round items
  Priority 2 (Low):           ~400  (16%)  Underwear, socks, off-season light items
  Priority 1 (Minimal):       ~200   (8%)  End-of-season, slow movers
  Priority 0 (Exclude):       ~225  (10%)  Dead stock, archived, out of stock
                              -----
  Total Active:              2,425

Step 7: Set Up PMAX Campaigns by Priority Tier

Restructure existing Google Ads Performance Max campaigns to segment products by the custom_label_0 priority score.

Proposed Campaign Structure:

PMAX CAMPAIGN STRUCTURE
=======================

  Campaign 1: "PMAX - High Priority (5)"
    Listing group filter: custom_label_0 = "priority-5"
    Daily budget: $50
    Target ROAS: 3.0x
    Products: ~300

  Campaign 2: "PMAX - Strong (4)"
    Listing group filter: custom_label_0 = "priority-4"
    Daily budget: $35
    Target ROAS: 4.0x
    Products: ~500

  Campaign 3: "PMAX - Normal (3)"
    Listing group filter: custom_label_0 = "priority-3"
    Daily budget: $20
    Target ROAS: 5.0x
    Products: ~800

  Campaign 4: "PMAX - Low (1-2)"
    Listing group filter: custom_label_0 IN ("priority-1", "priority-2")
    Daily budget: $10
    Target ROAS: 6.0x
    Products: ~600

  Priority 0 products: Excluded (not in any campaign)

Budget Allocation (daily):

CampaignPriorityBudget% of Total
High Priority5$5043%
Strong4$3530%
Normal3$2017%
Low1-2$109%
Exclude0$00%
Total$115100%

Step 8: Monitor ROAS for 30 Days

Track campaign performance daily for 30 days to establish whether the priority-segmented structure outperforms the previous flat structure.

Baseline Metrics (to capture before restructuring):

MetricCapture BeforeTrack After
Overall ROASCurrent PMAX ROASDaily ROAS by campaign
Cost per conversionCurrent CPACPA by priority tier
RevenueMonthly revenue from adsRevenue by priority tier
ImpressionsTotal impressionsImpressions by priority tier
Click-through rateOverall CTRCTR by priority tier
Wasted spendSpend on priority-0 productsShould be $0 after restructure

Success Criteria:

CriterionTarget
Overall ROAS improvement>= 20% increase vs. baseline
Priority 5 ROAS>= 4.0x
Wasted spend eliminated$0 on priority-0 products
Feed sync reliabilityZero missed daily syncs
No negative impactNo decrease in total revenue

Tracking Spreadsheet:

DATE        | CAMPAIGN     | SPEND  | REVENUE | ROAS  | CONV | CPA
------------|------------- |--------|---------|-------|------|------
2026-02-15  | High (5)     | $48.20 | $241.00 | 5.0x  |  24  | $2.01
2026-02-15  | Strong (4)   | $33.10 | $132.40 | 4.0x  |  17  | $1.95
2026-02-15  | Normal (3)   | $19.50 |  $58.50 | 3.0x  |  10  | $1.95
2026-02-15  | Low (1-2)    |  $9.80 |  $24.50 | 2.5x  |   5  | $1.96
...

Step 9: Document Results

Produce a comprehensive results document covering:

  1. Methodology: How products were scored, how campaigns were structured
  2. Baseline vs. Result: Before/after comparison with statistical significance
  3. Category Analysis: Which category groups benefited most from prioritization
  4. Seasonal Validation: Whether Winter priorities matched actual demand
  5. Lessons Learned: What to adjust in the SaaS version
  6. Process Documentation: Step-by-step replication guide for Phase 1

Tools and Resources

ToolPurposeStatus
Google SheetsSupplemental feed transportActive
Google Merchant CenterCustom label applicationConnected
Shopify Admin APIProduct data exportTested
Google AdsCampaign managementExisting campaigns
Sheets APIProgrammatic Sheet updates (for full catalog)Available

Success Metric

The single success metric for Phase 0 is:

Measurable ROAS improvement versus the flat (unsegmented) campaign structure, sustained over a 30-day monitoring period.

If ROAS improves by 20% or more with the priority-segmented approach, the concept is validated and Phase 1 (SaaS development) proceeds. If ROAS does not improve, the category mappings and seasonal priorities are revised before retesting.


Timeline

PHASE 0 TIMELINE
================

  Week 1 (Feb 3-9):
    [DONE] Analyze catalog (5,582 products, 90 types)
    [DONE] Verify GMC ID format
    [DONE] Confirm custom labels available
    [DONE] Create sample feed (10 products)
    [DONE] Upload and validate sample feed (10/10 matched)

  Week 2 (Feb 10-16):
    [TODO] Expand feed to full active catalog (~2,425 products)
    [TODO] Capture baseline PMAX metrics
    [TODO] Restructure PMAX campaigns by priority tier

  Week 3-6 (Feb 17 - Mar 16):
    [TODO] Monitor ROAS daily for 30 days
    [TODO] Weekly progress checks
    [TODO] Adjust priorities if data warrants

  Week 7 (Mar 17-23):
    [TODO] Compile results document
    [TODO] Go/no-go decision for Phase 1