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
- Frontmatter (cycle slug, status, owner, campaign IDs, ad set IDs)
- Quick Reference table — accounts, pages, pixel, GTM, naming convention
- Technical References table — full version of the above
- Targeting Spec — geographic, age/gender, detailed interests, placements, ad set roster
- Conversion Setup — Meta + Google pixel/tag config + tag stack on landing page
- Bid Strategy & Budget Pacing per campaign — bid strategy, daily budget, schedule, ad groups
- Ad Matrix — every ad with name, copy reference, creative asset(s), ad set placement
- UTM Convention
- QA Checklist (pre-launch)
- Build Sequence
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
- Account ID, pixel, page ID, GTM container, tag stack
- Ad matrix, ad set roster, targeting spec, bid strategy
- Conversion mapping, custom events, attribution windows
- UTM conventions, build sequence, QA checklist updates
Rubric — what the skill does with your update
| Actor / fragment type | Behavior |
| Digital writes | Silent — applies the edit + appends Change Log entry |
| AM / PM writes | Confirm — shows a diff preview, asks before writing; logged as cross-role |
| Other / unknown role | Always warns; still writes if approved |
| Creative brief / asset spec | Redirects 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.