Illustrative case study

A fictional business. The figures are a modelled scenario, not a client result.

Lindegaard FolkehøjskoleFolk high school course catalogue · Copenhagen

Commerce SEO for a course catalogue · Copenhagen, Denmark

Treating 180 short courses like products put a folk high school in front of every searcher

Result card · 9 months

+174% organic course bookings

Courses with rich results: 0 → 180
Organic sessions: +139%

Pull a drawer. Each category is now a page, and each course a typed card — stamped with the day it reached its ranking.

Course catalogue180 cards · 10 drawers

Drawer Ce · Ceramics

22 course pages · 152 long-tail terms

  • Query cardNo. 01

    “ceramics week course denmark”

    was not indexed
    now #2

    Ranked
    12 JUN
  • Query cardNo. 02

    “raku firing workshop zealand”

    was not indexed
    now #1

    Ranked
    03 JUL
  • Query cardNo. 03

    “wheel throwing summer course”

    was #64
    now #4

    Ranked
    21 AUG

01The challenge

A catalogue nobody could open.

Courses lived in a booking system with no indexable pages, so specific searches like 'ceramics week course Denmark' found nothing.

The school runs 180 short courses a year — five-day ceramics, weekend choirs, kayak weeks on the Sound. Searchers were asking for exactly those things, in exactly those words. But the courses only existed once someone was already inside the booking flow, so every specific search landed on an aggregator, a rival school, or nothing at all.

Before No card on file

ceramics week course denmark

  • coursehub-aggregator.example

    Pottery holidays in Denmark – 14 options

    Compare dates and prices…

  • another-school.example › kurser

    Keramik sommerkursus | Another Højskole

    Uge 28 · 5 dage

  • lindegaard.example › courses

    Courses – Lindegaard Folkehøjskole

    Page 4 · no description available

After · month 9 Position 2

ceramics week course denmark

  • coursehub-aggregator.example

    Pottery holidays in Denmark – 14 options

    Compare dates and prices…

  • lindegaard.example › courses › ceramics

    Ceramics Week: wheel & glaze, 5 days

    Course · 14–19 Jun · DKK 4,900 · 6 places left

  • another-school.example › kurser

    Keramik sommerkursus | Another Højskole

    Uge 28 · 5 dage

02Diagnosis

Six findings, filed by drawer.

  • Indexing

    Finding 01

    180 courses, 0 URLs

    Every course lived inside a booking widget rendered client-side from a third-party API. Google saw one page — “Courses” — with an empty container where the catalogue should be.

  • Indexing

    Finding 02

    Session IDs in every link

    The few crawlable booking links carried ?sid= parameters, producing 3,900 duplicate URLs in the crawl and no canonical to collapse them.

  • Schema

    Finding 03

    No Course or Event markup

    Dates, duration, price and language existed only in the booking system, so no course was eligible for course or event rich results.

  • Architecture

    Finding 04

    No category layer

    Ceramics, choir and kayak weeks sat in one undifferentiated list. Nothing could rank for “ceramics course denmark”, because no page was about ceramics.

  • Content

    Finding 05

    Season text, not course text

    The site described the school’s long winter terms. Short summer courses — 70% of bookings — had a 40-word blurb each inside the widget.

  • Linking

    Finding 06

    Orphaned archive

    Past course pages from an old CMS were 404s with backlinks from Danish craft guilds, wasting 212 referring domains.

03 · The strategy

Treat every course like a product with its own shelf mark.

Built on our Commerce SEO plan (ecommerce seo): the same playbook we use for product catalogues — feeds, structured data, category hubs and link architecture — applied to a school whose products are weeks of learning.

  1. Tactic 01

    Course feeds

    The booking system becomes the source, not the shop window.

    A nightly feed exports all 180 courses — title, tutor, dates, places left, price, language — into static, server-rendered pages at /courses/<category>/<course>. Sold-out dates stay live with a waitlist, so a page never disappears mid-season.

  2. Tactic 02

    Course schema

    Every card gets the same typed fields, like a catalogue standard.

    Course and CourseInstance markup for each date (startDate, courseMode, duration, offers with DKK price and availability), plus EducationalOrganization for the school. Validated in bulk against the feed so a new course is marked up the day it is published.

  3. Tactic 03

    Category pages

    Ten drawers, each a page with something to say.

    Ten category hubs written by the tutors: what a week of weaving actually involves, what to bring, who it suits. Each lists live dates and filters by month and language without spawning crawlable parameter URLs.

  4. Tactic 04

    Internal linking

    See-also cards, the way a librarian cross-references.

    Each course links to its drawer, to two related courses in other drawers (wheel throwing → natural dye) and to its tutor. The 212 lost guild backlinks were 301-redirected to the matching new course pages.

04Timeline

9 months on one date-due slip.

Each month gets a line and a stamp. The order matters: the feed had to exist before schema could describe it, and categories before links could point at them.

Date dueLindegaard
  1. M1FEBCrawl, log-file review and booking-API audit; URL scheme agreedAudit
  2. M2MARFeed built; 180 static course pages rendered from the booking systemFeed live
  3. M3APRCourse + CourseInstance schema shipped; first 24 rich resultsSchema
  4. M4MAYTen category hubs written with tutors and publishedDrawers
  5. M5JUNParameter URLs canonicalised; 3,900 duplicates removed from indexClean index
  6. M6JULAll 180 courses carry rich results; see-also links across drawers180 / 180
  7. M7AUGLegacy 404s redirected; guild backlinks reclaimedLinks back
  8. M8SEPSummer-season pages refreshed with live places-left countsSeason
  9. M9OCTReview, next-season feed tests and handover to the school’s teamFiled

05Results

+174% organic course bookings, card by card.

Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.

  • Metric 01

    0 → 180

    Courses with rich results

  • Metric 02

    +139%

    Organic sessions

  • Metric 03

    1,240

    Long-tail keywords ranking

Monthly index, baseline = 100Bookings +174%Organic sessions +139%
100150200250300FEBMARAPRMAYJUNJULAUGSEPOCT274239
Long-tail keywords ranking

Top-100 positions, end of month

Courses with rich results: 0 → 180Eligible by month: 0 · 0 · 24 · 72 · 128 · 180 · 180 · 180 · 180

Shelf list: twelve query cards

QueryDrawerBeforeMonth 9Stamped
choir summer school copenhagenChoir & musicnot indexed#118 MAY
spoon carving course copenhagenWoodworknot indexed#129 MAY
weaving course denmark one weekTextiles & weavingnot indexed#116 JUN
raku firing workshop zealandCeramicsnot indexed#103 JUL
nordic foraging courseFood & foragingnot indexed#106 JUL
hiking holiday folk high schoolOutdoor & hikingnot indexed#124 JUL
ceramics week course denmarkCeramicsnot indexed#212 JUN
watercolour course for adults denmarkDrawing & paintingnot indexed#227 JUN
kayak course week denmarkOutdoor & hikingnot indexed#208 JUN
philosophy short course denmarkHistory & philosophynot indexed#211 JUL
creative writing week course denmarkWritingnot indexed#215 JUL
yoga week course folk high schoolYoga & wellbeingnot indexed#220 JUL

New card · your catalogue

Get a plan like this

If your products are courses, rooms, tours or classes trapped inside a booking tool, the Commerce SEO plan gives each one a page, a schema card and a shelf to sit on.

← Back to all case studies