Skip to content

SEO & Page Architecture — Session Notes

Created 2026-02-24
Updated 2026-02-27
Tags seoarchitectureprogramsredirectseventshub-pages

February 24, 2026


DateSectionChange
2026-02-27Schema StrategyClarification added: JSON-LD schema breadcrumbs and visual HTML breadcrumbs are two independent systems; notes on SEOPress “Custom breadcrumbs” field. Added by Asia’s Claude Code session.

/montreal-study-program/ (Page ID 33521) ranks from last year. This is the primary SEO asset for the Study Group program. All decisions should protect this equity.

  • All pages are completely flatpost_parent = 0 across the board. No hierarchy exists.
  • Multiple duplicate Montreal program pages exist at different URLs, splitting link equity.
  • Event posts and Pages both exist for the same programs — duplication confuses Google about which is canonical.
  • /programs/ (ID 28338) exists but is underdeveloped — it does no useful SEO work.
  • “Study Lab Landing” (ID 36638) exists as a draft but was never finished.
  • Existing Study Lab event pages (Berlin, London, New York) have no parent hub and are islands.

/programs/ ← Top-level programs hub
Update existing page (ID 28338)
Links to all format hubs
/programs/montreal-study-group/ ← Montreal Study Group hub
Rename + reparent existing ranking page (ID 33521)
Evergreen — always shows current/next cohort
Links to all past and upcoming cohort events
/programs/study-lab/ ← Study Lab hub
Finish draft page (ID 36638)
Links to all city lab pages
/lab-berlin/ ← (city-level, flat or nested)
/lab-london/
/lab-new-york/
/event/montreal-study-group-spring-2026/ ← Indexed, upcoming template (with booking)
/event/montreal-study-group-winter-2026/ ← Indexed, archive template (no booking)
/event/study-lab-berlin-2026/ ← Indexed
/[campaign-slug]/ ← NOINDEXED
Canonical tag → corresponding event post
Meta ads point here
EN and FR versions as needed

DecisionRationale
Programs hub pages = Pages CPTEvergreen, long-term SEO targets, program descriptions
Cohort/event pages = Event CPTEvent schema, date-specific search traffic, events archive
Campaign pages = Pages CPT, noindexedAd-specific, not canonical, French compliance copies live here
URL hierarchy via Schema + internal linksURL nesting alone is not sufficient or required
Events archive stays liveGoogle event discovery aggregates from here; do not redirect it

Why Two Separate Content Types (Event Posts vs. Program Hub Pages)

Section titled “Why Two Separate Content Types (Event Posts vs. Program Hub Pages)”

They serve different search intents:

  • Programs hub ranks for: “Baseworks Study Group Montreal”, “movement study program Montreal” — generic, evergreen queries
  • Event posts rank for: “movement study group Montreal spring 2026”, “upcoming movement events Montreal” — date-specific and event-discovery queries

Do not try to make one serve both purposes.


Quebec law requires French versions of promotional materials for adult continuing education programs. The solution:

  • Create EN + FR campaign landing pages per cohort
  • Both noindexed (they are ad destinations, not SEO targets)
  • Both carry a canonical tag pointing to the corresponding event post
  • No need to add French as a full WPML language layer — these are standalone pages

This is why separate landing pages exist alongside event posts — they are not duplicates; they serve different purposes (conversion vs. discoverability).


Page typeSchemaNotes
Programs hub (/programs/montreal-study-group/)Course or EducationEventSignals educational program
Event post (upcoming)EventDates, location, price, registration URL
Event post (archive)EventPast dates still provide topical authority signals
Event post (all)Custom breadcrumbHome → Programs → [Hub] → [Cohort name]
Campaign landing pageNone neededNoindexed

Breadcrumb Schema on event posts is how Google understands the hierarchy between /event/... (Event CPT) and /programs/montreal-study-group/ (Page CPT). SEOPress PRO supports custom breadcrumb paths per post — set this on all Montreal Study Group event posts.

Section titled “Breadcrumb Schema vs. Visual Breadcrumbs — Two Independent Systems”

These are completely separate and do not need to match:

  • JSON-LD breadcrumb schema (in <head>, invisible to visitors) — read by Google. Defines the logical hierarchy for search results and structured data. This is the SEO-relevant layer.
  • Visual HTML breadcrumbs (on-page, visible to visitors) — a UX element only. Appears only if something outputs it: theme natively, SEOPress shortcode [seopress_breadcrumbs], an Elementor widget, or a Gutenberg block. Google does not read or validate this.

You can have the schema show Home → Programs → Montreal Study Group → Spring 2026 while the visible breadcrumb shows only Montreal Study Group → Spring 2026, omits Home, or doesn’t exist on the page at all. All of these are fine.

About the SEOPress “Custom breadcrumbs” field (visible in the per-post SEO meta box via the front-end admin overlay): this field overrides only the label of the current page — the last item’s display text in the breadcrumb trail. It does not let you define the full path. To set a custom full hierarchy (so the breadcrumb correctly traverses Programs → Hub → Event even though the event post isn’t nested there in WordPress), use the SEOPress PRO breadcrumb parent/path settings in the post’s SEO meta box.

Asia’s note: we need to think about different breadcrumb hierarchies for different types of events that don’t all have hub pages.


Core rule: slug change + parent assignment in ONE save

Section titled “Core rule: slug change + parent assignment in ONE save”

If done in two separate saves, WordPress creates a redirect chain:

/montreal-study-program/ →301→ /montreal-study-group/ →301→ /programs/montreal-study-group/

A chain loses equity at each hop. Do both changes simultaneously in a single save.

/montreal-study-program/ →301→ /programs/montreal-study-group/

Verify immediately in SEOPress → Redirections that it is a single direct 301, not a chain.

Duplicate pages to clean up (all redirect directly to new canonical)

Section titled “Duplicate pages to clean up (all redirect directly to new canonical)”
Old URLRedirect to
/smart-movement-mtl-2025//programs/montreal-study-group/
/smart-movement-study-program-mtl-2025//programs/montreal-study-group/
/smart-movement-study-program-2026//programs/montreal-study-group/
/smsg-2026//programs/montreal-study-group/

Each redirect must go directly to the final destination — not to /montreal-study-program/ (which is itself being redirected).


Two templates in use for event posts:

  • Upcoming template — includes booking interface
  • Archive template — no booking interface

When a cohort ends: switch event post to archive template. Keep the event post indexed — past dated events with schema contribute to topical authority for the program hub.


Existing Duplicate Event Posts (Event CPT + Page CPT for same program)

Section titled “Existing Duplicate Event Posts (Event CPT + Page CPT for same program)”

Some programs currently have both a Page and an Event post. Fix:

  • Set a canonical tag on the event post pointing to the corresponding Page
  • OR 301 the event post to the Page (if the event post has no independent ranking)

Do not leave both live without a canonical — Google sees duplicate content.


Immediate — before Spring 2026 campaign launches

Section titled “Immediate — before Spring 2026 campaign launches”

See also: Content Architecture — Spring 2026 Launch for Practice Sessions architecture decisions and the full launch sequence.

  • Rename /practice-sessions//montreal-practice-sessions/, then verify 301 in SEOPress is a single-hop (not a chain). Publish the page.
  • Update content of /montreal-study-program/ to function as a hub page:
    • Prominent section for current/upcoming cohort (Spring 2026, April 4–May 16)
    • Brief program overview (evergreen)
    • Links to past cohort event posts
  • Finalize Spring 2026 pricing and enrollment cap (currently TBD in Obsidian) — required before any public pages go live
  • Create Spring 2026 event post at /event/montreal-study-group-spring-2026/:
    • Event schema: dates April 4–May 16, 2026; location Proto Studio Montreal; price (once set)
    • Upcoming Elementor template (with booking)
    • Internal link back to programs hub
  • Create Spring 2026 campaign landing page(s):
    • EN version — noindexed, canonical → event post
    • FR version — noindexed, canonical → event post (Quebec compliance)
    • Meta ads point to these pages

Short-term — after campaign launches, before URL restructuring

Section titled “Short-term — after campaign launches, before URL restructuring”
  • Finish and publish “Study Lab Landing” draft page (ID 36636):
    • Link all existing Study Lab event posts to it (Berlin, London, New York)
    • Add internal link from /programs/ page
  • Update /programs/ page to properly link down to:
    • Montreal Study Group hub
    • Study Lab hub
    • (Other program types as they develop)

Medium-term — URL restructuring (allow 5–6 weeks before major campaign for reindexing)

Section titled “Medium-term — URL restructuring (allow 5–6 weeks before major campaign for reindexing)”
  • Change slug + parent in ONE save:
    • Slug: montreal-study-programmontreal-study-group
    • Parent: set to “Educational Programs” (ID 28338, slug programs)
    • Result: /programs/montreal-study-group/
  • Immediately verify in SEOPress → Redirections:
    • Confirm: /montreal-study-program/ →301→ /programs/montreal-study-group/ (single hop)
    • If not auto-generated, create manually
  • Clean up duplicate Montreal pages (create 301s, all going directly to /programs/montreal-study-group/):
    • /smart-movement-mtl-2025/
    • /smart-movement-study-program-mtl-2025/
    • /smart-movement-study-program-2026/
    • /smsg-2026/
  • Submit updated sitemap in Google Search Console
  • Monitor Search Console for crawl errors over the following 1–2 weeks
  • Add breadcrumb Schema to all Montreal Study Group event posts via SEOPress:
    • Path: Home → Programs → Montreal Study Group → [cohort name]
  • Fix event post/page duplication — set canonical tags or 301s where both exist for same program
  • Update all internal links on site pointing to old Montreal program URL to point to new URL

Ongoing — for each new cohort going forward

Section titled “Ongoing — for each new cohort going forward”
  • Create event post (indexed) — Event schema, upcoming Elementor template
  • Create campaign landing page(s) (noindexed, canonical → event post, EN + FR if Quebec)
  • Link from programs hub → new event post
  • When cohort ends: switch event post to archive Elementor template
  • When campaign is over: 301 campaign landing page → event post

Deferred — when Study Lab city pages are ready

Section titled “Deferred — when Study Lab city pages are ready”
  • Create city-level hub pages for Berlin, London, New York
  • Add breadcrumb Schema to all Study Lab event posts pointing through the Study Lab hub
  • Evaluate whether to nest city pages under /programs/study-lab/ or keep flat with schema hierarchy