# Alam Kita — SEO + AEO implementatieplan (LLM-executable)

- **Status:** bijgewerkt 7 september 2026, 19:08 WIB
- **Doel-site:** https://alam-kita.com
- **Dit bestand:** https://alam-kita.com/seo-plan.md (noindex, team only)
- **HTML-hub agents:** https://alam-kita.com/ai/
- **Canon feiten:** https://alam-kita.com/ai-knowledge-pack.md  *(pack is nog EN-first; bilingual-URL’s staan hieronder, nog niet in het pack)*
- **Voor wie:** implementatie-LLM of redacteur met WP-rechten. **Niet voor gasten.**
- **Gouden regel:** verzin geen prijzen, data, reviews of medische claims. Canon = knowledge pack + live HTML.
- **Laatst opgepakt:** JSON-LD / Yoast Schema API (7 sep 2026, 19:05 WIB). **Niet gebouwd.** Wacht op go.
- **Oppakken volgende sessie:** §3 S1a → S1b. Daarna S2, S3a. Zie §10.

### Handoff — schema (niet vergeten)

- Yoast 28.3, `enable_schema=true`. Live graph = alleen `WebPage` + `WebSite` + dunne `BreadcrumbList`. **Geen Organization** omdat Site representation `company_name` en `company_logo` leeg zijn (`company_or_person=company`).
- **Niet** een tweede `ld+json` in `wp_head`. Stitch in Yoast `@graph` via `wpseo_schema_organization` / `wpseo_schema_graph` / `wpseo_schema_webpage` in snippet **4845**. Docs: https://developer.yoast.com/features/schema/api/
- Event vereist `startDate` (Yoast + Google). Alleen young-adults (2–8 nov 2026) en Festival van Liefde (5–14 okt 2026) zijn nu Event-waardig.
- Geen `aggregateRating`. Ratings via `sameAs` Booking.
- S1a = Yoast UI naam+logo. S1b = filter LodgingBusiness/Hotel + NAP. Pas daarna Person/Event.

- **Werkwijze met eigenaar:** één punt voorstellen → toestemming → uitvoeren → live checken. Pagina voor pagina. Geen batches van ongerelateerde pagina’s.

---

## 0. Canon (niet overschrijven)

Deze keuzes zijn **live** en winnen van oudere audit-copy.

| Onderwerp | Canon |
| --- | --- |
| Positionering | Hosted **retreats** (soms met yoga). Yoga is **optioneel**, niet de core. |
| Titles | Geen “boutique” in titles. Meta home mag “boutique beach bungalows” (bewust). |
| Taal | EN primair op root-URL’s. Parallelle **`/nl/`-boom is live**. Geen NL/EN-mix in één H1. |
| Host | `https://alam-kita.com` (www 301t). `html lang="en-US"` op EN; `nl-NL` op NL via snippet 4845. |
| Hreflang | `en` + `nl` + `x-default=en` op twins. NL-only pagina’s: `nl` + `x-default=en` (geen valse EN-twin). |
| Adres | **Desa Alang-Alang (near Sunset Beach), 59455 Karimunjawa, Jepara, Central Java, Indonesia.** Niet Jl. I.J. Kasimo tot eigenaar dat bevestigt. |
| WhatsApp | **+31 6 8453 9310** (`https://wa.me/31684539310`). **Niet** +31 6 2398 9986. Zwevende Avada-knop = dit nummer. |
| Tel ID | +62 812 1067 4383 |
| E-mail | margo@alam-kita.com |
| Reviews | Booking.com ~9.5 Exceptional. Geen eigen `aggregateRating` in schema. |
| Booking | Human completes. Agents nooit auto-book. Engine: bookandlink. |
| URL-beleid | **Geen 301** van pagina’s die nog 200 zijn. EN-slugs blijven. NL = nieuwe URL’s onder `/nl/…`. Oude retraites: noindex + uit sitemap, URL blijft live. **Niet vertalen.** |
| YMYL | Grief / young-adults / healing / detox = wellness + coaching. Geen therapie, geen medische kuur, geen verslavingszorg. |

---

## 1. Wat live staat

### 1.1 Fase 0 — on-page (klaar)

- Home title/meta/H1: retreats + bungalows/rooms + yoga optional + Karimunjawa. Copy-typos gefixt.
- Contact: NAP + WhatsApp 8453 9310.
- Core-page titles/meta + About E-E-A-T (Booking 9.5 + Margo).
- Footer NAP sitewide (WPCode Headers & Footers).
- GSC HTML-tag in `<head>`: `google-site-verification=LBSgrhMCHUTxbOn667Hd647vfvDiOdLmM_gSRNYJN_g` — **eigenaar moet Verify klikken** (HTML-tag, geen DNS).

### 1.2 Sitemap / indexatie (zonder URL’s te breken)

- Avada-taxonomieën **uit** `sitemap_index.xml`: `fusion_tb_category`, `element_category`, `slide-page`.
- Oude retraites **noindex, follow** + uit page-sitemap, URL blijft 200:
  `/nlp-yoga-retreat/`, `/yinyoga-teacher-training/`, `/ganesha-retreat/`, `/chakra-yoga-retreat/`, `/yinyang-retreat-indonesia/`, `/mixed-couples-retreat/`, `/new-beginning-retreat/`, `/group-challenge-retreat/`, `/reconnect-and-rise/`
- **Niet** noindex (hub/menu): grief, digital-detox, mother-daughter, love-escape, individual, liefde-na-verlies, festival-van-liefde, friends, `/newsletter/`.
- Newsletter-duplicaten noindex: `/nieuwsbrief-newsletter/`, `/sign-up-for-the-newsletter/`. Canonical blijft `/newsletter/`.
- `/free-spirit-retreat/` — **niet** 301, **niet** NL-twin (oud programma). Hub-kaart op `/nl/retraites/` staat Fusion-**draft**.

### 1.3 Bestandregister (machine files)

Canon live = Desa Alang-Alang + WhatsApp **+31 6 8453 9310**. Oude pack-copy met Kasimo / +31 6 2398 9986 **niet** publiceren.

#### Live op de root (200)

| URL | Rol |
| --- | --- |
| https://alam-kita.com/llms.txt | Gecureerde index (niet Yoast-auto) |
| https://alam-kita.com/llms-full.txt | Concat pijlertekst |
| https://alam-kita.com/ai-knowledge-pack.md | Canon feiten (nog EN-first) |
| https://alam-kita.com/ai-knowledge-pack.nl.md | NL feiten (root, naast `/nl/`-HTML) |
| https://alam-kita.com/ai.txt | Search/train policy |
| https://alam-kita.com/llm-policy.json | Zelfde policy als JSON |
| https://alam-kita.com/llms-agent.txt | Extra agent-index |
| https://alam-kita.com/sitemap-ai.xml | Agent-urlset — **nog zonder `/nl/`-URL’s** |
| https://alam-kita.com/.well-known/api-catalog | RFC 9727 linkset |
| https://alam-kita.com/robots.txt | Yoast allow-all + AI crawlers + sitemap-ai |
| https://alam-kita.com/seo-plan.md | Dit plan (noindex, Disallow in robots) |

#### Live HTML (theme-chrome)

| URL | Rol |
| --- | --- |
| https://alam-kita.com/ai/ | Mensleesbare hub + link naar dit plan |
| https://alam-kita.com/ai-knowledge-pack/ | Knowledge pack HTML |
| https://alam-kita.com/ai-knowledge-pack-nl/ | Kennispakket NL HTML |
| https://alam-kita.com/ai-policy/ | Policy HTML |
| https://alam-kita.com/ai-tools/ | Intent → URL (no auto-book) |
| https://alam-kita.com/llms-full/ | Full-text HTML |

#### Pack-files **niet** live (404) — stale NAP

`index.md`, `stay.md`, `retreats.md`, `karimunjawa.md`, `about.md`, `faq.md`, `contact.md`, `ai-tools.md`, `nl/llms.txt`, `nl/llms-full.txt`, `nl/ai-knowledge-pack.md`, `.well-known/agent-skills/index.json`. HTML-canonicals bestaan al. **Niet plaatsen** tot Kasimo + WA 2398 eruit zijn. NL-index = `ai-knowledge-pack.nl.md` (root) + live `/nl/`-HTML.

Uploads-snapshots in `/wp-content/uploads/2026/09/` zijn bron voor snippet 4845, niet de canon-URL. Yoast **llms.txt generator = UIT**.

### 1.4 Tweetalig — live (Fase 2 deels naar voren gehaald, 7 sep 2026)

**Architectuur (geen WPML/Polylang):**

- Parent-pagina ID **4852**, slug `nl`, URL `https://alam-kita.com/nl/`.
- Twins = Duplicate Post-kloon van Avada/Fusion, daarna copy-replace, `parent=4852` (of 4860 voor retraites), template `100-width.php` waar het origineel dat heeft.
- **EN-URL’s nooit gewijzigd, nooit 301.**
- Detectie: `alam_is_nl()` in WPCode snippet **ID 4845** (`REQUEST_URI` prefix `/nl` **plus** NL-only slugs).
- Filters in 4845: `language_attributes` → `nl-NL`; `wpseo_title` / `wpseo_metadesc` / `wpseo_locale`; `wp_get_nav_menu_items` (NL-labels + NL-URL’s); `wp_head` hreflang-map.
- Footer-switcher EN · NL (al eerder). Login blijft `/allislove/` (niet `/wp-login.php` — die 404t expres).

**NL-only (geen EN-twin, vermelding “alleen Nederlandstalige deelnemers” op de pagina):**

| ID | Live URL | Opmerking |
| --- | --- | --- |
| 4763 | https://alam-kita.com/liefde-na-verlies/ | `alam_is_nl()` true, `lang=nl-NL` |
| 4273 | https://alam-kita.com/festival-van-liefde/ | idem, 5–14 okt 2026 |
| 91 | https://alam-kita.com/privacyverklaring/ | juridisch NL |

**Twins (hreflang en ↔ nl):**

| ID NL | NL URL | EN URL |
| --- | --- | --- |
| 4852 | `/nl/` | `/` |
| 4856 | `/nl/verblijf/` | `/beach-bungalow-karimunjawa/` |
| 4860 | `/nl/retraites/` | `/yoga-retreats-indonesia/` |
| 4863 | `/nl/karimunjawa/` | `/karimunjawa-island/` |
| 4866 | `/nl/over-ons/` | `/about-us-alam-kita/` |
| 4869 | `/nl/contact/` | `/contact-us-in-karimunjawa/` |
| 4872 | `/nl/activiteiten/` | `/tour-travel-karimunjawa/` |
| 4875 | `/nl/margo/` | `/story-behind-alam-kita/` |
| 4877 | `/nl/team/` | `/alam-kita-local-team/` |
| 4880 | `/nl/reviews/` | `/guest-reviews/` |
| 4882 | `/nl/retraites/verlies-rouw/` | `/space-for-loss-grief-retreat/` |
| 4885 | `/nl/retraites/digital-detox/` | `/digital-detox/` |
| 4888 | `/nl/retraites/moeder-dochter/` | `/mother-daughter-retreat/` |
| 4890 | `/nl/retraites/young-adults/` | `/young-adults-no-more-xtc-needed-after-this-retreat/` |
| 4893 | `/nl/retraites/love-escape/` | `/love-escape-retreat-indonesia/` |
| 4897 | `/nl/retraites/individueel/` | `/individual-retreat-indonesia/` |
| 4899 | `/nl/retraites/spirituele-reis/` | `/spiritual-and-healing-journey/` |
| 4902 | `/nl/partners/` | `/partners/` |

**NL-hub `/nl/retraites/`:** live kaarten linken naar NL-twins + NL-only programma’s. Oude/noindex-kaarten blijven Fusion-**draft** (Reconnect, Free Spirit, Challenge, Back to Self-Love, intergenerationeel). 404-URL’s (`/back-to-self-love/`, `/intergenerationeel-trauma/`, `/challenge-group-retreat/`) niet opnieuw aanmaken.

**Niet gedaan in deze ronde (bewust):**

- Geen NL-twins van noindex/oude retraites.
- Knowledge pack + `llms.txt` + `sitemap-ai.xml` nog zonder `/nl/`-lijst (volgende punt).
- Rest-Engels kan nog in sommige Fusion-prijslijsten/korte zinnen zitten — polish, geen nieuwe pagina’s.
- Geen schema (Fase 1) — wacht op GSC Verify + “go”.

### 1.5 Schema-audit (live crawl 7 sep 19:00 WIB)

Yoast output **wel** JSON-LD, maar alleen een dun `@graph`: `WebPage` + `WebSite` + `BreadcrumbList` (home: 1 item, geen `item`-URL) + soms `ImageObject`. **Niet aanwezig:** `Organization`, `LodgingBusiness`, `Hotel`, `Person`, `Event`, `FAQPage`, NAP, geo, `sameAs`. Daardoor vullen Booking/Expedia Knowledge Graph en AI-antwoorden.

`AggregateRating` ontbreekt — **zo houden**. Niet zelf hosten.

---

## 2. Hoe de site technisch werkt (volgende LLM)

- CMS: WordPress + **Avada/Fusion** + **Yoast SEO Premium** + **WPCode Lite** + Wordfence + Insert Headers and Footers + Duplicate Post.
- Login-pad: `/allislove/` (geen `wp-admin` in de publieke login-URL). `/wp-login.php` → 404. Geen wachtwoorden in dit bestand.
- **Root-files + taal-infra** = WPCode snippet **ID 4845** (init + filters). Bronnen:
  - heredoc: `seo-plan.md`, `llms.txt`, `robots.txt`
  - copy uit `/wp-content/uploads/2026/09/` voor overige machine-files
  - hygiene-filters (sitemap-exclude + noindex) + `alam_is_nl()` + hreflang/Yoast/menu
- Wordfence blokkeert vaak `options.php` en **nieuwe** snippets met `file_put_contents` + `ABSPATH`. **Wijzig 4845**, maak geen tweede writer.
- Headers: WPCode → Headers & Footers. Header = Facebook SDK + GSC-tag. Footer = NAP. GSC-tag niet verwijderen.
- Avada Off Canvas / Fusion: title/H1 soms in Avada, niet alleen Yoast. Live HTML checken na elke edit. `&` in Fusion-HTML staat vaak als `&` + `amp;` — slice-replace i.p.v. literal `&` in XML-tools.
- REST `/wp-json/wp/v2/pages/{id}` voor copy. Fusion-pagina’s: content vervangen, **niet** layout/shortcodes strippen. Template `100-width.php` behouden waar van toepassing.
- Publieke site laadt (check 7 sep 18:50 WIB): home/`/nl/`/pijlers HTTP 200, Fusion-CSS 200, TTFB ~1,6–1,8s. Wit scherm bij de eigenaar was **niet** een fatal; `/wp-login.php` 404t expres.

---

## 3. Fase 1A — JSON-LD plan (nog niet gebouwd; wacht op go per punt)

Doel: Google + AI-antwoorden citeren **alam-kita.com** i.p.v. alleen OTA’s. Canon wint: NAP Desa Alang-Alang, WA +31 6 8453 9310, yoga optional, geen medische types, geen verzonnen data.

**Techniek (Yoast Schema API — dit is de juiste WP-weg):**

Bronnen: [Yoast Schema API](https://developer.yoast.com/features/schema/api/), [integration guidelines](https://developer.yoast.com/features/schema/integration-guidelines/), [Event piece](https://developer.yoast.com/features/schema/pieces/event/), [Organization](https://developer.yoast.com/features/schema/pieces/organization/), [Google LocalBusiness](https://developers.google.com/search/docs/appearance/structured-data/local-business).

1. Yoast Schema Framework **aan laten** (staat al `enable_schema: true`). Nooit uitzetten.
2. **Geen tweede** `<script type="application/ld+json">`. Yoast eist één verbonden `@graph`. Extra script = losse graph, duplicaat-types, Google pakt willekeurig één.
3. **Eerst Site representation vullen** (nu leeg): `company_or_person=company` maar `company_name=""` en `company_logo=""`. Daardoor ontbreekt `Organization` in de live graph (alleen WebPage/WebSite/Breadcrumb). Zonder Organization kan WebSite geen `publisher` krijgen.
4. Daarna **in snippet 4845** (geen extra plugin, geen class-file — Wordfence):
   - `wpseo_schema_organization` — address, telephone, email, sameAs Booking, extra `@type` `LodgingBusiness`+`Hotel`, founder → `#margo`. Zelfde `@id` als Yoast (`https://alam-kita.com/#organization`). **Niet** een tweede Organization.
   - `wpseo_schema_graph` — Event/Person-nodes **appenden** aan de bestaande array (Yoast-voorbeeld: loop `$data as $key => $value`). WPCode-vriendelijk; class `Abstract_Schema_Piece` is overkill hier.
   - `wpseo_schema_webpage` — FAQPage alleen als zichtbare Q&A: `@type` = `["WebPage","FAQPage"]` + `mainEntity` Questions. Officiële Gutenberg-FAQ-block van Yoast gaat niet in Fusion; filter is de Avada-weg.
5. `@id`-stijl op deze site (Yoast 28.3): `https://alam-kita.com/#website`, `#breadcrumb`, straks `#organization`. Events volgens Yoast-spec: `https://alam-kita.com/#/schema/Event/{slug}`.
6. Validatie na elk punt: view-source (één `yoast-schema-graph` script), `json.loads`, Rich Results Test. Fail = rollback.

**Google Event én Yoast Event vereisen `startDate`.** Retraites zonder datum op de pagina krijgen **geen** Event (was S3c — geschrapt). Die worden `makesOffer` op de lodging, of niets.

### Punt S1 — Organization + LodgingBusiness/Hotel (Yoast-graph)

**S1a (UI, eerst):** Yoast → Settings → Site representation: Organization name `Alam Kita` + logo (bestaande home-afbeelding mag). Dit laat Yoast `Organization` uitspugen.

**S1b (filter, daarna):** `wpseo_schema_organization` verrijkt diezelfde node. Op elke publieke URL (EN + NL). Eén `@id`. WebPage blijft Yoast.

Velden (niet verzinnen):

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://alam-kita.com/#organization",
      "name": "Alam Kita",
      "url": "https://alam-kita.com/",
      "email": "margo@alam-kita.com",
      "telephone": ["+31684539310", "+6281210674383"],
      "sameAs": ["https://www.booking.com/hotel/id/alam-kita.html"],
      "founder": {"@id": "https://alam-kita.com/#margo"}
    },
    {
      "@type": ["LodgingBusiness", "Hotel"],
      "@id": "https://alam-kita.com/#lodging",
      "name": "Alam Kita",
      "url": "https://alam-kita.com/",
      "description": "Small beachfront stay on Karimunjawa. Hosted retreats — yoga optional — beach bungalows. Not a clinic, not Bali.",
      "telephone": "+6281210674383",
      "email": "margo@alam-kita.com",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "Desa Alang-Alang (near Sunset Beach)",
        "addressLocality": "Karimunjawa",
        "addressRegion": "Central Java",
        "postalCode": "59455",
        "addressCountry": "ID"
      },
      "starRating": null,
      "parentOrganization": {"@id": "https://alam-kita.com/#organization"}
    }
  ]
}
```

**Niet in S1:** `geo` (geen bevestigde lat/long), `aggregateRating`, `starRating` (null weglaten i.p.v. 0), `priceRange` tot eigenaar een band bevestigt (stay-table is €40–€145/nacht — alleen zetten ná go). `sameAs` Google Business alleen als eigenaar de GBP-URL geeft.

NL-pagina’s: dezelfde entity-`@id` (één lodging), `inLanguage` niet op Hotel zetten per URL — de pagina is NL, het bedrijf is één ding.

### Punt S2 — Person Margo

Alleen op `/about-us-alam-kita/`, `/story-behind-alam-kita/`, `/nl/over-ons/`, `/nl/margo/`.

```json
{
  "@type": "Person",
  "@id": "https://alam-kita.com/#margo",
  "name": "Margo Niestadt",
  "jobTitle": "Founder and host",
  "worksFor": {"@id": "https://alam-kita.com/#lodging"},
  "url": "https://alam-kita.com/story-behind-alam-kita/"
}
```

Geen `MedicalSpecialty`, geen therapist-type.

### Punt S3 — Event per **live** retraite (geen noindex)

`schema.org` heeft geen type `Retreat`. Gebruik **`Event`** + `location` = `#lodging` + `organizer` = `#organization`. `eventAttendanceMode`: `OfflineEventAttendanceMode`. `eventStatus`: `EventScheduled` alleen met bevestigde data.

**Regel (Yoast Event + Google Event):** `startDate` is **verplicht**. Alleen live pagina’s met zichtbare datums. Geen Event zonder datum. Geen verzonnen datums. Prijs zonder datum → `Offer` op `#organization`/`Hotel`, geen Event.

Live kandidaten (prijs uit live HTML 7 sep; datums alleen waar gezien):

| Pagina | Event-naam | Prijs (shared, live) | Datum in schema? |
| --- | --- | --- | --- |
| `/young-adults-no-more-xtc-needed-after-this-retreat/` | Young adults retreat (18–25) | €995 | **ja** 2026-11-02 → 2026-11-08 |
| `/festival-van-liefde/` | Festival van Liefde | €1259 | **ja** 2026-10-05 → 2026-10-14 (NL-only) |
| `/space-for-loss-grief-retreat/` | — | €1540 | **geen Event** tot datum live op de pagina |
| `/digital-detox/` | — | €1650 | geen Event tot datum live |
| `/mother-daughter-retreat/` | — | €1497 p.p. | geen Event tot datum live |
| `/love-escape-retreat-indonesia/` | — | €2479 / €2150 | geen Event tot datum live |
| `/spiritual-and-healing-journey/` | — | €1650 | geen Event tot datum live |
| `/individual-retreat-indonesia/` | — | op aanvraag | geen Event; optioneel Offer |
| `/liefde-na-verlies/` | — | €1740 | geen Event tot datum live |

**Niet:** noindex-reeks (nlp, ganesha, chakra, yinyang, mixed-couples, new-beginning, group-challenge, reconnect-and-rise), `/free-spirit-retreat/` (oud).

YMYL-tekst in `description`: wellness/coaching, **niet** therapy/treatment/addiction care. Young adults: geen “XTC needed”-claim in schema-naam; naam = `Young adults retreat, Karimunjawa (18-25)`.

NL-twin: zelfde Event `@id` **of** aparte `{nl-url}#event` met `sameAs` naar EN-event. Voorkeur: één Event, `url` = EN-canonical, NL-pagina linkt via `about`. Simpeler voor Google.

Offers:

```json
"offers": {
  "@type": "Offer",
  "priceCurrency": "EUR",
  "price": "995",
  "availability": "https://schema.org/InStock",
  "url": "https://alam-kita.com/contact-us-in-karimunjawa/"
}
```

`url` van de offer = contact (human completes), **niet** een fake book-URL. Geen `InStock` als de pagina “waitlist/on request” zegt — dan `PreOrder` of offer weglaten.

**Volgorde Events (één per go):** S3a young-adults → S3b festival-van-liefde. Rest: wachten tot datums op de pagina staan. Geen S3c-zonder-datum.

### Punt S4 — FAQPage

Alleen als de **zichtbare** pagina al Q&A heeft (zelfde vragen in HTML). Niet verzinnen om schema te vullen.

Kandidaten ná copy-check: `/karimunjawa-island/` (veer/vliegtuig), `/beach-bungalow-karimunjawa/` (breakfast, max 20), `/contact-us-in-karimunjawa/`. Als er geen `<h2>/<h3>`-vragen zijn: eerst copy (Fase 1 punt 6–8), dán FAQPage.

Max 4–6 vragen, kort, geen medische antwoorden.

### Punt S5 — BreadcrumbList

Yoast heeft al `BreadcrumbList`. **Niet** een tweede uitspugen.

Wel: Yoast-crumbs verbeteren via `wpseo_breadcrumb_links` zodat child-pages `Home > Retreats > {naam}` met werkende `item`-URL’s krijgen (nu is home-crumb zonder `item`). NL: `Home > Retraites > {naam}` met `/nl/`-URL’s.

### Punt S6 — Stay offers (optioneel, ná S1)

`makesOffer` op `#lodging` met 2–3 representatieve kamerprijzen uit de stay-tabel (€40 room, €70 bungalow, €98 bridal) — alleen ná go. Niet alle 10 rijen (spam). `priceSpecification.priceCurrency=EUR`.

### Niet in schema

- `aggregateRating`, `review` met sterren, gekopieerde Booking-reviews als `Review`
- `MedicalBusiness`, `PsychologicalTreatment`, `Hospital`
- `geo` zonder bevestigde coördinaten
- Event op noindex/oude URL’s
- Tweede BreadcrumbList
- Auto-book `potentialAction.ReserveAction` die een betaalde nacht claimt; hooguit `CommunicateAction` naar contact/WhatsApp

### Validatie-checklist per punt

1. View-source: extra `ld+json` parseable (`json.loads`)
2. Rich Results Test: Hotel of Event of FAQ, 0 errors
3. EN-URL ongewijzigd, `/nl/` nog `lang=nl-NL`
4. Geen `aggregateRating` in de output
5. Knowledge pack niet tegenspreken

### Schema vs OTA (waarom dit werkt)

Booking/Expedia hebben complete Hotel-nodes + ratings. Wij leveren de **canonical entity** (NAP, founder, “not Bali”, yoga optional) + **first-party Events**. Ratings blijven bij Booking via `sameAs`, niet nagebootst.

---

## 4. Fase 2 — rest (long-tail). `/nl/`-HTML = klaar

Klaar: parallel `/nl/` + hreflang + menu + `lang`. Zie §1.4.

Nog open:

- Knowledge pack + `llms.txt` + `sitemap-ai.xml` bijwerken met NL-URL’s (geen stale “`/nl/` bestaat nog niet”).
- Rest-Engels in Fusion-prijslijsten op live NL-pagina’s (pagina voor pagina).
- Long-tail briefs 400–800w: how-to-get-here, Karimunjawa vs Bali, digital detox, grief (YMYL-disclaimer), mother-daughter, private beach bungalow.
- Service-URL’s uit tours: massage, Access Bars, private yoga.
- Markdown-mirrors van pijlers (optioneel).
- 1 journal-stuk / maand, geen “retraites 2019”.

NL money-terms: yoga retraite Karimunjawa; yoga retraite Indonesië (niet Bali); digitale detox retraite; retraite verlies; bungalow Karimunjawa.

---

## 5. Fase 3 — week 9–12 (authority)

- Google Business Profile: NAP = site = schema.
- Interne `/book/` landingspagina + bookandlink + UTM `source=site`.
- GSC: 12 weken baseline na Verify. Sitemap_index + sitemap-ai (inclusief `/nl/` ná pack-update).
- Core Web Vitals: Fusion “Loading…” weg above-the-fold. TTFB nu ~1,6–1,8s.
- AEO-test §7. Fails = knowledge pack aanscherpen.

---

## 6. Niet doen

- Niet migreren van CMS in week 1–4.
- Niet vechten om “yoga retreat Bali”.
- Geen `aggregateRating` in Organization/Hotel-schema.
- Geen medische claims (grief / young-adults / healing = wellness, not therapy).
- Geen auto-book in LLM-files.
- Geen 301 van live hub/menu-URL’s (EN of NL).
- Geen Yoast llms-generator aanzetten.
- Geen Kasimo-straat of WhatsApp 2398 9986 terugzetten.
- Theme-taxonomieën niet opnieuw indexeren.
- Geen WPML/Polylang erbij — snippet 4845 is de taal-laag.
- Geen NL-twins van noindex/oude retraites.
- Knowledge pack eerst updaten bij nieuwe prijs/retraite, daarna HTML.

---

## 7. AEO-testset (na Verify + crawl-tijd)

Draai in ChatGPT, Perplexity, Gemini, Claude:

1. yoga retreat Karimunjawa
2. beach bungalow Karimunjawa private beach
3. how to get to Karimunjawa from Semarang
4. digital detox retreat Indonesia not Bali
5. grief retreat Indonesia November 2026
6. Alam Kita Karimunjawa prices
7. yoga retraite Karimunjawa
8. mother daughter retreat Java Indonesia
9. who runs Alam Kita Karimunjawa
10. Access Bars Karimunjawa

Slaag: bronlink alam-kita.com; prijsband = knowledge pack; niet Bali; geen medische claim; geen auto-book. NL-prompts mogen `/nl/` citeren.

---

## 8. KPI’s

| Metric | Was (audit 7 sep) | Nu (18:55 WIB) | Doel 90 dagen |
| --- | --- | --- | --- |
| llms.txt | 404 | 200 gecureerd | geciteerd in AI-antwoorden |
| NAP | ontbrak | contact + footer + 8453 9310 | GBP + schema gelijk |
| Dode retraites in sitemap | ~10 | 0 (noindex i.p.v. 301) | 0 |
| Theme-sitemaps | 3 Avada | 0 | 0 |
| NL-hub | 0 | `/nl/` + twins + hreflang live | pack/sitemap-ai ook NL |
| Schema | 0 | 0 | LodgingBusiness + 1 Event + FAQ |
| AEO 10-prompt | 0/10 | nog niet getest | ≥8/10 citeert alam-kita.com |
| Branded SERP | Booking #1 | ongewijzigd | alam-kita.com #1 |

---

## 9. Acceptatiechecklist

- [x] Eén duidelijke home-H1 + title met Karimunjawa + retreats/bungalows
- [x] html lang + canonical non-www
- [x] Contact toont adres, telefoons, e-mail
- [x] Theme-sitemaps uit; oude retraites noindex (URL live)
- [x] `/llms.txt` + `/ai-knowledge-pack.md` 200
- [x] `/ai` HTML-catalogus live
- [x] Footer NAP sitewide
- [x] Dit plan op `/seo-plan.md`
- [x] `/nl/`-boom live, EN-URL’s ongewijzigd
- [x] `lang=nl-NL` + hreflang op twins
- [x] NL-only retraites niet naar EN geforceerd
- [ ] GSC Verify (eigenaar)
- [ ] Knowledge pack + sitemap-ai met `/nl/`-URL’s
- [ ] LodgingBusiness + Event + FAQPage valideren
- [ ] 10 AEO-prompts gedocumenteerd
- [ ] Geen nieuwe medische claims, geen verzonnen reviews

---

## 10. Eerste actie volgende sessie

Schema staat in **§3** als S1–S6. Niet bouwen tot “go”.

1. Check GSC Verify (HTML-tag). Mag parallel; schema hangt er niet van af.
2. **Wacht op go voor S1a+S1b:** eerst Yoast Site representation (naam+logo), daarna `wpseo_schema_organization` in snippet 4845. Geen tweede ld+json-script.
3. Knowledge pack + `sitemap-ai.xml` NL-URL’s: apart “go”.
4. Events: S3a young-adults (verplicht startDate), niet grief zonder datum.

Hotel-voorbeeld voor S1 staat in §3. `aggregateRating` blijft weglaten.


Einde plan.
