Project Folder Convention v2

digital.md

The Media Specialist's bible for the current cycle. Account IDs, pixel, ad matrix, targeting spec, bid strategy, budget pacing, UTM convention, QA checklist, build sequence. Where Digital lives.

What it is

Everything you need to actually build the campaigns in Ads Manager / Google Ads. Intentionally deep — depth is the point.

Owner

Media Specialist. Snapshots to Reference/History/Productions/{cycle-slug}/digital.md on cycle rollover.

Structure

This is the file the Digital team lives in. Skim production.md to know what we're building. Read digital.md to actually build it.

Real Elmwood example

Quick Reference table:

What Where
Meta account act_31334812 (Marcon - Sales)
Google account 9376895237 (Marcon Corporate/Sales)
FB Page / IG 143586382336889 / 17841400906683113
Pixel 1299089964458388 "Marcon NEW Sales Pixel"
GTM container GTM-NXGTHLD
Landing page https://elmwood.marcon.ca/register
Naming convention ELM_630_* — see ../naming-conventions.md

Bid Strategy & Budget Pacing (Meta excerpt):

Setting Value
Bid strategy Lowest Cost (no cap) — LOWEST_COST_WITHOUT_CAP
Budget level Campaign Budget Optimization (CBO) — matches Hue setup
Daily budget $222.22/day ($6,000 / 27 days)
Pacing Standard
Schedule May 5 → May 31, 2026 (27 days)
Ad sets active 4 (BROAD-Feed, BROAD-Story&Reel, PROSP-Feed, PROSP-Story&Reel) — RETRG×2 deferred to June

Ad Matrix excerpt (Meta V2):

# Ad Name Copy Ref Creative Asset(s) Ad Set
V2-1a CAR_NSELL_Feed-Broad-V2 copy-meta.md Ad 5 5-card mixed: v2/elmwood_v2_carousel_1x1_card{1-5}.{jpg/mp4} LGWEB_BROAD_EN Feed
V2-2a IMG_NSELL_Feed-Broad-V2 copy-meta.md Ad 6 v2/elmwood_v2_static_1x1.jpg (BURQUITLAM-corrected 2026-05-12) LGWEB_BROAD_EN Feed
V2-3a CAR_NSELL_Story-Broad-V2 copy-meta.md Ad 7 4-card mixed story carousel LGWEB_BROAD_EN_Story&Reel
V2-4a VID_NSELL_Reel-Broad-V2 copy-meta.md Ad 8 v2/elmwood_v2_reel_9x16.mp4 LGWEB_BROAD_EN_Story&Reel

Conversion Setup (Google excerpt):

Setting Value Conversion Action ID
Primary (Search + DG optimize toward) ELM_REG_COMP_RESI (form submit, ONE_PER_CLICK, SUBMIT_LEAD_FORM) 894809669
Micro: form started ELM_REG_STR_RESI 6869671564
Micro: appointment started ELM_APPT_STR 980646398
Macro: appointment completed ELM_APPT_COMP 6478626868
Phone click in-ad ELM_CLK_PHN_INAD 6753608308

The pattern: zero guesswork. Every ID, every setting, every dollar. If a new Media Specialist had to take over Elmwood tomorrow, they read this file and they're ready.

How this file gets updated

The only sanctioned write-path is the /update-context skill (in the clients plugin). It routes natural-language updates to the right file, applies a rubric, and appends every change to a ## Change Log at the bottom. The file is its own audit trail.

Default owner: Digital (Media Specialist / Digital Lead).

Invocation

/update-context marcon --project elmwood
# then describe the change in plain English, e.g.:
# "Move CTA button to Learn More across V1 + V2"

What routes to digital.md

Rubric — what the skill does with your update

Actor / fragment typeBehavior
Digital writesSilent — applies the edit + appends Change Log entry
AM / PM writesConfirm — shows a diff preview, asks before writing; logged as cross-role
Other / unknown roleAlways warns; still writes if approved
Creative brief / asset specRedirects to production.md

Change Log entry format

Every accepted write appends one entry to the ## Change Log section at the bottom of the file (newest on top):

- 2026-05-17 14:32 PT — Alex (AM) — Claudia departed; Jason now primary — fields: Team table, Client Contacts table
- 2026-05-17 11:08 PT — Helena (Digital, cross-role write) — Q3 Meta ad set roster updated — fields: Ad set roster

Cross-role writes include the override in the summary line. Entries are append-only — the skill never deletes log lines, even when correcting a prior write.

View the full real digital.md from Marcon — Elmwood
Source: Marcon/Elmwood/digital.md · Snapshot date: 2026-05-13 · Live file may have evolved since.
---
client: marcon
project: elmwood
type: digital-build-spec
status: ready-to-build
cycle: 2026-05-now-selling-launch
launch_date: 2026-05-05
owner: Media Specialist (Alex Wan, interim)
updated: 2026-05-12
campaign_id: 52544107272041
adset_ids:
  LGWEB_BROAD_EN: 52544107272241
  LGWEB_BROAD_EN_Story&Reel: 52544108776441
  LGWEB_PROSP_EN_RealEstate: 52544108566241
  LGWEB_PROSP_EN_RealEstate_Story&Reel: 52544108683841
audit_source: Hue ad set settings (act_31334812) + Marcon Sales Google conversion actions (9376895237) — Markifact 2026-05-04
convention_version: 2026-05-12
---

# Elmwood — Digital Build Spec

> Media Specialist's reference for building Elmwood paid media. Project-level identity + accounts live in [`CLAUDE.md`](./CLAUDE.md). Project strategy + budget + audiences (high-level) in [`campaign.md`](./campaign.md). PM-owned launch brief + creative assets + status log in [`production.md`](./production.md). Copy in [`copy-meta.md`](./copy-meta.md) + [`copy-google.md`](./copy-google.md).
>
> **Cycle scope:** May 2026 launch. When June scope locks, snapshot this file to `Reference/History/Productions/2026-05-now-selling-launch/digital.md` and rewrite for June.

## Quick Reference

| What | Where |
|---|---|
| Meta account | `act_31334812` (Marcon - Sales) — see [`../CLAUDE.md`](../CLAUDE.md) |
| Google account | `9376895237` (Marcon Corporate/Sales) — see [`../CLAUDE.md`](../CLAUDE.md) |
| FB Page / IG | `143586382336889` / `17841400906683113` — see [`../CLAUDE.md`](../CLAUDE.md) |
| Pixel | `1299089964458388` "Marcon NEW Sales Pixel" |
| GTM container | `GTM-NXGTHLD` |
| Landing page | https://elmwood.marcon.ca/register |
| Naming convention | `ELM_630_*` — see [`../naming-conventions.md`](../naming-conventions.md) |

---

## Technical References

| Item | Value |
|---|---|
| Meta Account | `act_31334812` (Marcon - Sales) |
| Google Account | `9376895237` (Marcon Corporate/Sales — reactivated 2026-05-05 for Elmwood) |
| Google MCC | `3773778063` (Periphery Digital) |
| Pixel ID | `1299089964458388` "Marcon NEW Sales Pixel" |
| Lead Form ID | NA — Lead campaign out of scope |
| Facebook Page | Marcon — `143586382336889` |
| Instagram User | `@MarconHomes` — `17841400906683113` |
| Special Ad Category | Housing (Canada) — HSAC applies to all Meta copy |
| Naming Convention | Marcon taxonomy `ELM_630_*` (see `../naming-conventions.md`) |
| GTM container | `GTM-NXGTHLD` |
| Google Ads tag | `AW-471869587` |
| GA4 property | `G-XPWFSX0R9Q` (Marcon Sales) |
| Floodlight | `DC-14734274` |
| Other Meta pixels on `/register` | `730854324621874`, `2037469969980248` (purpose unknown — flagged for Marcon to identify) |

## Targeting Spec (HSAC-compliant — replicated from Hue's verified live config)

> **Source:** Audited Hue's `LGWEB_BROAD_EN`, `LGWEB_PROSP_EN_RealEstate`, `LGWEB_RETRG_EN_Site-visitors` ad sets on `act_31334812` 2026-05-04 via Markifact. All Marcon Sales Meta campaigns run under HSAC (Housing Special Ad Category, Canada).

### Geographic
| Setting | Value | Notes |
|---|---|---|
| City | Coquitlam, British Columbia, CA | Key `1006226` (verify in Meta when building — Hue uses `295589` Port Coquitlam) |
| Radius | 15 miles | HSAC legal minimum — cannot go tighter |
| Location types | `home`, `recent` | Both — same as Hue |

### Age / Gender
| Setting | Value |
|---|---|
| Age min | 18 |
| Age max | 65 |
| Gender | Not set (HSAC restriction) |

### Detailed targeting (interest stack — PROSP ad set only)
| ID | Interest | Used by Hue |
|---|---|---|
| `6002986908368` | House | ✓ |
| `6003103732434` | Apartment | ✓ |
| `6003143191640` | Property finder | ✓ |
| `6003332796032` | Real estate development | ✓ |
| `6003388314512` | Investment | ✓ |
| `6003435139283` | Condominium | ✓ |
| `6003446239080` | Real estate investing | ✓ |
| `6003578086487` | Real estate | ✓ |
| `6003587074473` | Investor | ✓ |

### Targeting expansion
- **Detailed targeting expansion:** ON (Hue uses `targeting_optimization_types: detailed_targeting=1`)
- **Advantage+ audience:** ON (`targeting_automation_advantage_audience: 1.0`)
- **Lookalike:** Not used by Hue — skip for Elmwood May launch

### Placements (manual split into 2 ad sets per audience bucket)
| Ad Set type | Publisher Platforms | FB Positions | IG Positions | Other |
|---|---|---|---|---|
| Feed | facebook, instagram, threads | feed, biz_disco_feed, profile_feed, right_hand_column, marketplace | stream, explore_home, profile_feed | threads_stream |
| Story&Reel | facebook, instagram | story, instream_video, facebook_reels | story, reels, explore | — |

Devices: mobile + desktop (both).

### Ad Set Roster (May launch — LIVE on `act_31334812` as of 2026-05-04)
| Bucket | Ad Set Name | Ad Set ID | Status | Notes |
|---|---|---|---|---|
| BROAD (geo + Advantage+) | `LGWEB_BROAD_EN` | `52544107272241` | ACTIVE | Feed — no interests, relies on Advantage+ + geo |
| BROAD (geo + Advantage+) | `LGWEB_BROAD_EN_Story&Reel` | `52544108776441` | ACTIVE | Story + Reels |
| PROSP (interest stack) | `LGWEB_PROSP_EN_RealEstate` | `52544108566241` | ACTIVE | Feed — 9 interests OR'd, Advantage+ on |
| PROSP (interest stack) | `LGWEB_PROSP_EN_RealEstate_Story&Reel` | `52544108683841` | ACTIVE | Story + Reels |
| RETRG (custom audiences) | `LGWEB_RETRG_EN_Site-visitors`<br>`LGWEB_RETRG_EN_Site-visitors_Story&Reel` | — | DEFERRED to June | Needs Elmwood-specific Website Visitors 60D + Video Viewers 75% (build after 30 days of pixel data) |

Excluded custom audiences (once built): `ELM | Website Registrants - 180D` to suppress already-converted users.

---

## Conversion Setup

> **Status (verified 2026-05-04):** Front-end tags FIRING via GTM container `GTM-NXGTHLD`. Confirmed via Tag Assistant + Meta Pixel Helper on `elmwood.marcon.ca/register`. Custom events `ELM_REG_COMP_RESI` (338 events) + `ELM_REG_STR_RESI` (136 events) verified on Meta pixel.

### Meta
| Setting | Value |
|---|---|
| Pixel ID | `1299089964458388` ("Marcon NEW Sales Pixel" — same pixel Hue uses; unified Sales pixel across Hue + Elmwood + future Sales projects) |
| Custom event | `ELM_REG_COMP_RESI` (event_type: `OTHER`, custom_str) — VERIFIED firing |
| Optimization goal | `OFFSITE_CONVERSIONS` |
| Attribution window | 7-day click + 1-day view (matches Hue) |
| Special ad category | `HOUSING` (Canada) |
| CAPI | Likely active server-side (Hue records conversions but no client-side `fbq()` event in /register DOM — fires on thank-you page or via Conversions API) |

### Google
| Setting | Value | Conversion Action ID |
|---|---|---|
| **Primary** (Search + DG optimize toward) | `ELM_REG_COMP_RESI` (form submit, ONE_PER_CLICK, SUBMIT_LEAD_FORM) | `894809669` |
| Micro: form started | `ELM_REG_STR_RESI` (DEFAULT, MANY_PER_CLICK) | `6869671564` |
| Micro: appointment started | `ELM_APPT_STR` (BOOK_APPOINTMENT) | `980646398` |
| Macro: appointment completed | `ELM_APPT_COMP` (BOOK_APPOINTMENT) | `6478626868` |
| Phone click in-ad | `ELM_CLK_PHN_INAD` (CLICK_TO_CALL) | `6753608308` |
| Phone click on-page | `ELM_CLK_PHN` (CONTACT) | `6869843901` |
| Email click on-page | `ELM_CLK_EML` (CONTACT) | `6869843898` |
| GA4 mirror | `Global Marcon - Sales - GA4 (web) ELM_REG_COMP_RESI` | `6910164136` |

All 7 conversion actions ENABLED. GA4 mirror confirms GA4 stream linkage.

### Tag stack on landing page (verified 2026-05-04)
| Tag | ID | Role |
|---|---|---|
| GTM container | `GTM-NXGTHLD` | Master — loads all below |
| Google Ads | `AW-471869587` | Marcon Sales conversion tag |
| GA4 | `G-XPWFSX0R9Q` | Marcon Sales property |
| Floodlight | `DC-14734274` | DV360/CM360 — not used in May scope |
| Meta Pixel #1 | `1299089964458388` | ✓ "Marcon NEW Sales Pixel" — what we optimize toward |
| Meta Pixel #2 | `730854324621874` | "Elmwood Pixel" (legacy project-specific, vestigial) |
| Meta Pixel #3 | `2037469969980248` | ⚠ Unknown — not on Marcon Sales account; possibly Lasso CRM or other business |

---

## Bid Strategy & Budget Pacing — May 2026

### Meta — `ELM_630_RESI_BOF_CONVER_STAND_EN`
| Setting | Value |
|---|---|
| Bid strategy | Lowest Cost (no cap) — `LOWEST_COST_WITHOUT_CAP` |
| Budget level | **Campaign Budget Optimization (CBO)** — matches Hue setup |
| Daily budget | **$222.22/day** ($6,000 / 27 days) |
| Pacing | Standard |
| Schedule | May 5 → May 31, 2026 (27 days) |
| Ad sets active | 4 (BROAD-Feed, BROAD-Story&Reel, PROSP-Feed, PROSP-Story&Reel) — RETRG×2 deferred to June |

### Google Search — `ELM_630_RESI_BOF_CONVER_SEAR_EN`
| Setting | Value |
|---|---|
| Bid strategy | Maximize Conversions (no Target CPA in first 30 days) |
| Budget level | Campaign |
| Daily budget | **$111.11/day** ($3,000 / 27 days) |
| Schedule | May 5 → May 31, 2026 (27 days) |
| Ad groups | 3: Branded, Generic Burquitlam, Competitor *(deploy only if Alex approves)* |
| Conversion goal | `ELM_REG_COMP_RESI` (894809669) — Primary |

### Google Demand Gen — `ELM_630_RESI_MOF_CONVER_DGEN_BROADER` (live, ID `21137370191`)
| Setting | Value |
|---|---|
| Bid strategy | Maximize Conversions |
| Budget level | Campaign |
| Daily budget | **$37.04/day** ($1,000 / 27 days) — above minimum-viable learning floor |
| Schedule | May 5 → May 31, 2026 (27 days) |
| Ad groups (live, 5 enabled) | `LGWEB_PROSP_EN_LAL`, `LGWEB_PROSP_EN_CUSTOM`, `LGWEB_PROSP_EN_INMARKET`, `LGWEB_PROSP_EN_LIFEEVENT`, `LGWEB_RETRG_EN` |
| Creative (May launch) | Single Image (1:1 + 1.91:1) + Carousel — same creative across all 5 ad groups |
| Creative (deferred) | DG Video — awaits 16:9 + 1:1 cuts; 4:5 ratio image — awaits |
| Stale ads to pause first | All 55 `*_SEP2024_*` ads in 7 ad groups (incl. 2 OLD-suffixed paused groups) |
| Conversion goal | `ELM_REG_COMP_RESI` (894809669) — Primary |
| Naming note | Live name retained per Alex 2026-05-05 (CONVER bidding, BROADER suffix) — not renamed to TRAFF/EN |

### Total May allocation
| Channel | Budget | % of Ad Spend | Daily (27d) |
|---|---:|---:|---:|
| Meta | $6,000 | 60% | $222.22 |
| Google Search | $3,000 | 30% | $111.11 |
| Google Demand Gen | $1,000 | 10% | $37.04 |
| **Total Ad Spend** | **$10,000** | **100%** | **$370.37** |
| Mgmt Fee (18%) | $1,800 | — | — |
| **Grand Total** | **$11,800** | — | — |

> Note: SoS line item shows $4K to "English Google Search Campaign" with $0 to DG — this is bookkeeping shorthand for the combined Google budget. Actual internal allocation per above (Search 75% / DG 25% of the $4K).

### June reassessment
After 30 days of data:
- If Search CPL ≤ $85 (target): hold split. If > $85: shift $500-1K from DG to Search.
- If DG completes learning + acquires audience pool: scale DG to $1.5K-2K from June Search budget.
- Build Elmwood RETRG audiences (Website Visitors 60D, Video Viewers 75%) — launch RETRG ad sets in June.

---

## Ad Matrix — V1 (launching May 5)

### Meta — Conversion campaign (`ELM_630_RESI_BOF_CONVER_STAND_EN`) — V1 (built + paused 2026-05-05)

| # | Ad Name | Copy Ref | Creative Asset(s) | Ad Set / Placement | Notes |
|---|---|---|---|---|---|
| 1 | `ELM_630_carousel_now-selling_v1` | [`copy-meta.md`](./copy-meta.md) Ad 1 | Carousel Cards 1-6 | Feed (FB+IG) | 6-card carousel — canonical Claudia direction |
| 2 | `ELM_630_single_tagline-lead_v1` | [`copy-meta.md`](./copy-meta.md) Ad 2 | `elmwood_static_1x1.jpg` | Feed (FB+IG) | Tagline-lead variant |
| 3 | `ELM_630_single_offer-lead_v1` | [`copy-meta.md`](./copy-meta.md) Ad 3 | `elmwood_static_1x1.jpg` | Feed (FB+IG) | GST/offer-lead variant |
| 4 | `ELM_630_story_tagline_v1` | [`copy-meta.md`](./copy-meta.md) Ad 4 | `elmwood_static_9x16.jpg` *or* `elmwood_story_9x16_v1.jpg` | Story (FB+IG) + Reels | Tagline-lead static |
| 5 | `ELM_630_story_offer_v1` | [`copy-meta.md`](./copy-meta.md) Ad 5 | `elmwood_story_9x16_v2.jpg` | Story (FB+IG) + Reels | Offer-lead static |
| 6 | `ELM_630_reel_video_v1` | [`copy-meta.md`](./copy-meta.md) Ad 6 | `elmwood_reel_9x16.mp4` | Reels + Story | Video reel, 12.5s |
| 7-10 | `ELM_630_story_v3-v6` *(optional)* | Ad 4/5 reused | `elmwood_story_9x16_v3-v6.jpg` | Story (FB+IG) + Reels | 4 additional story creatives available; A/B test or rotate |

### Meta — V2 (Variant 2 — GST forefront, delivered 2026-05-11; typo fix 2026-05-12; naming aligned 2026-05-12)

Same campaign, same 4 ad sets. V2 is **additive** — layered on top of V1 in the rotation pool. Ad names follow Marcon taxonomy (`{Format}_{Phase}_{FreeForm}`) — aligned with V1 live naming (`CAR_NSELL_Feed-Broad`, etc.) plus `-V2` variant suffix.

| # | Ad Name | Copy Ref | Creative Asset(s) | Ad Set / Placement | Notes |
|---|---|---|---|---|---|
| V2-1a | `CAR_NSELL_Feed-Broad-V2` | [`copy-meta.md`](./copy-meta.md) Ad 5 | 5-card mixed: `v2/elmwood_v2_carousel_1x1_card{1-5}.{jpg/mp4}` (Card 2+3 are .mp4) | `LGWEB_BROAD_EN` Feed | Mixed image+video carousel; 5 cards; per-card descriptions |
| V2-1b | `CAR_NSELL_Feed-Prosp-V2` | (same as V2-1a) | (same assets) | `LGWEB_PROSP_EN_RealEstate` Feed | (same) |
| V2-2a | `IMG_NSELL_Feed-Broad-V2` | [`copy-meta.md`](./copy-meta.md) Ad 6 | `v2/elmwood_v2_static_1x1.jpg` *(BURQUITLAM-corrected 2026-05-12)* | `LGWEB_BROAD_EN` Feed | GST-forefront single image |
| V2-2b | `IMG_NSELL_Feed-Prosp-V2` | (same as V2-2a) | (same) | `LGWEB_PROSP_EN_RealEstate` Feed | (same) |
| V2-3a | `CAR_NSELL_Story-Broad-V2` | [`copy-meta.md`](./copy-meta.md) Ad 7 | 4-card mixed: `v2/elmwood_v2_story_carousel_9x16_card{1-4}.{jpg/mp4}` (Card 2+3 are .mp4; Card 1 BURQUITLAM-corrected) | `LGWEB_BROAD_EN_Story&Reel` | Story Carousel — 4 cards mixed media |
| V2-3b | `CAR_NSELL_Story-Prosp-V2` | (same as V2-3a) | (same) | `LGWEB_PROSP_EN_RealEstate_Story&Reel` | (same) |
| V2-4a | `VID_NSELL_Reel-Broad-V2` | [`copy-meta.md`](./copy-meta.md) Ad 8 | `v2/elmwood_v2_reel_9x16.mp4` | `LGWEB_BROAD_EN_Story&Reel` | V2 Reel video |
| V2-4b | `VID_NSELL_Reel-Prosp-V2` | (same as V2-4a) | (same) | `LGWEB_PROSP_EN_RealEstate_Story&Reel` | (same) |

**V2 ad-instance count by ad set (8 new instances):**
- `LGWEB_BROAD_EN` (Feed): `CAR_NSELL_Feed-Broad-V2` + `IMG_NSELL_Feed-Broad-V2` = 2
- `LGWEB_BROAD_EN_Story&Reel`: `CAR_NSELL_Story-Broad-V2` + `VID_NSELL_Reel-Broad-V2` = 2
- `LGWEB_PROSP_EN_RealEstate` (Feed): `CAR_NSELL_Feed-Prosp-V2` + `IMG_NSELL_Feed-Prosp-V2` = 2
- `LGWEB_PROSP_EN_RealEstate_Story&Reel`: `CAR_NSELL_Story-Prosp-V2` + `VID_NSELL_Reel-Prosp-V2` = 2

> **Naming history:** The 2026-05-11 V2 deploy used non-conforming names (`ELM_630_carousel_now-selling_v2__BROAD` etc. — mixed campaign-level taxonomy into ad names). Those 6 ads will be deleted by Alex and re-created with the Marcon-compliant names above.

**Reserved (not in initial V2 deploy):**
- `v2/elmwood_v2_static_9x16.jpg` — held as fallback if V2 Story Carousel underperforms
- `v2/elmwood_v2_static_dg_1.91x1.jpg` — for Google Demand Gen (see DG matrix below)

**V2 copy delta:**
- Primary text: "A final release of 1, 2 & 3 bedroom residences in Burquitlam. First time home buyers, save on GST." (GST forefront)
- Description: "Move in this fall" (V1 used "Move in This Year")
- CTA: `LEARN_MORE` across all 4 V2 ad formats (locked 2026-05-11 per Figma). V1 also migrated to `LEARN_MORE` per Claudia request — both variants now share the same CTA.
- Headline: unchanged ("Now Selling: Upper Residences at Elmwood")

**V2 Markifact bulk-upload brief (corrected):** [`Deliverables/2026-05-12-meta-bulk-upload-brief-v2.md`](./Deliverables/2026-05-12-meta-bulk-upload-brief-v2.md) — supersedes 2026-05-11 brief (naming + 4 corrected creative URLs)

### Google — Search RSA — **9 RSAs published 2026-05-04 (PAUSED, V1)**

> Reactivated existing campaign structure (Branded `15957094508` + Non-Branded `15952626718`) — much more sophisticated than build-from-scratch (Non-Branded has 9 ad groups intent-bucketed). Per-ad-group RSAs created via Markifact, each tailored to its ad group's intent. Stale 2024-era RSAs paused (10 ENABLED → PAUSED 2026-05-04, not deleted). Studio ad group fully paused (no inventory).

| # | Ad ID | Ad Group | Final URL | Tier | Status |
|---|---|---|---|---|---|
| 1 | `807721305969` | LGWEB_PROSP_BRANDED (Branded campaign) | `/register` | 1 | PAUSED |
| 2 | `807721305972` | LGWEB_PROSP_Near SkyTrain | `/register` | 1 | PAUSED |
| 3 | `807721305975` | LGWEB_PROSP_1br | `/register` | 1 | PAUSED |
| 4 | `807721305978` | LGWEB_PROSP_2 br | `/register` | 1 | PAUSED |
| 5 | `807721305981` | LGWEB_PROSP_3 br | `/register` | 1 | PAUSED |
| 6 | `807721305984` | LGWEB_PROSP_ApartmentsForSale | `/` | 2 | PAUSED |
| 7 | `807721305987` | LGWEB_PROSP_RealEstate | `/` | 2 | PAUSED |
| 8 | `807721305990` | LGWEB_PROSP_Competitors | `/` | 2 | PAUSED |
| 9 | `807721305993` | LGWEB_PROSP_Coquitlam | `/` | 2 | PAUSED |

Each RSA: 15 headlines + 4 descriptions, intent-tailored H1-H3, shared support headlines + descriptions for the rest.

**Search extensions (campaign-level):** 4 sitelinks · 6 callouts · structured snippet (Amenities) — all in [`copy-google.md`](./copy-google.md).

### Google — Demand Gen (`ELM_630_RESI_MOF_TRAFF_DGEN_EN`)

| # | Ad Name | Copy Ref | Creative Asset(s) | Ad Group | Notes |
|---|---|---|---|---|---|
| 1 | `ELM_630_DG_single_image_v1` | [`copy-google.md`](./copy-google.md) → DG Ad 1 | `elmwood_static_1x1.jpg` + `elmwood_static_9x16.jpg` + `elmwood_static_dg_1.91x1.jpg` | Burquitlam Buyers | Single Image — needs all 3 ratios |
| 2 | `ELM_630_DG_carousel_v1` | [`copy-google.md`](./copy-google.md) → DG Ad 2 | Reuses Meta Carousel Cards 1-6 | Burquitlam Buyers | Reuses Meta carousel asset set |
| 3 | `ELM_630_DG_video_v1` | [`copy-google.md`](./copy-google.md) → DG Ad 3 | `elmwood_reel_9x16.mp4` | Burquitlam Buyers | Single video (vertical only — flag if 16:9 needed for full DG coverage) |

> ⚠ **DG video ratio gap:** DG accepts a single 9:16 video but performs best with a 16:9 + 9:16 + 1:1 set. Marcon delivered 9:16 only. Ask Claudia for horizontal cut from same shoot.

> **V2 DG Single Image deployed 2026-05-12 (PAUSED):** Built `IMG_NSELL_MAY2026_v2` across all 5 ad groups via `gads_create_demand_gen_single_image_ad` (bulk). Each ad uses marketing image 1.91:1 (`v2/elmwood_v2_static_dg_1.91x1.jpg`) + square 1:1 (`v2/elmwood_v2_static_1x1.jpg`) + Marcon logo, business name "Elmwood by Marcon", 5 GST-forefront headlines (≤30c), 5 descriptions (≤90c), CTA "Learn More". Ad IDs: `808566224535` (LAL), `808566224538` (CUSTOM), `808566224541` (INMARKET), `808566224544` (LIFEEVENT), `808566224547` (RETRG). V2 DG carousel + video held — only DG-specific static deployed per Alex 2026-05-12.

---

## UTM Convention

### Meta
```
?utm_source=meta&utm_medium=paidsocial&utm_campaign=ELM_630&utm_term={{placement}}&utm_content={{ad.name}}
```
`{{placement}}` and `{{ad.name}}` are Meta dynamic macros. Verified pattern on Hue ad creative `1606834830534481`.

### Google
```
?utm_source=google&utm_medium=paidsearch&utm_campaign=ELM_630&utm_term={keyword}&utm_content={matchtype}    (Search)
?utm_source=google&utm_medium=paiddisplay&utm_campaign=ELM_630&utm_term={keyword}&utm_content={matchtype}   (DG)
```
Use Google Ads URL template at the campaign level. Auto-tagged GCLID also active.

---

## QA Checklist (pre-launch)

Before opening Ads Manager / Markifact to build:

- [ ] **Claudia GST sign-off** — confirm phrasing + asterisk requirement for full version "First time home buyers save on GST." Blocking for Google copy.
- [ ] **Google Sales account reactivation** — `9376895237` paused since Nov 2025; verify ad serving + billing re-enabled before scheduling May 5 launch.
- [ ] **Verify Elmwood city geo key in Meta** — Hue uses `295589` Port Coquitlam. Confirm `1006226` Coquitlam returns expected reach in Audience Insights, OR adjust to nearest match.
- [ ] **Verify all 7 ELM_* Google conversion actions still ENABLED** before campaign creation (re-run GAQL).
- [ ] **Test-submit form on `/register`** — confirm Meta `ELM_REG_COMP_RESI` event fires + Google `894809669` registers conversion.

## Build Sequence

1. **Meta** (4 ad sets × 6 base ads = 6-10 total ads in 1 campaign)
2. **Google Search** (1 campaign · 3 ad groups · 2-3 RSAs · keywords + negatives + 4 sitelinks + 6 callouts + structured snippets)
3. **Google Demand Gen** (1 campaign · 1 ad group · 3 ad formats)

Each campaign: name → set objective → set bid strategy → CBO/budget → schedule → ad sets → ads → preview → submit for review.

## Notes

- Campaign-level naming follows Marcon taxonomy (`ELM_630_RESI_BOF_CONVER_STAND_EN`), NOT Periphery standard. See [`../naming-conventions.md`](../naming-conventions.md).
- Ad-level naming convention: `{Format}_{Phase}_{FreeForm-Placement-Sequence}` (e.g., `IMG_NSELL_Tagline-Feed-1`). See ad naming examples in copy-meta.md.
- Hue currently runs the same Meta account with `HUE_623_*` prefix — Elmwood's `ELM_630_*` prefix isolates filtering in Ads Manager + reporting.
- Both projects optimize toward the same pixel (`1299089964458388`) but separate custom events (`HUE_REG_COMP_RESI` vs `ELM_REG_COMP_RESI`) — no conversion event collision.