Aku mau cerita soal file yang kebanyakan developer generate otomatis, lalu ga pernah buka lagi.

Sitemap XML.

File kecil. Biasanya di-generate oleh plugin, SSG, atau CMS. Disubmit ke Google Search Console. Selesai. Ga pernah dicek lagi.

Sampai suatu hari kamu buka Coverage report di GSC dan nemu puluhan halaman yang "Discovered but not indexed." Atau lebih parah: halaman penting kamu ga muncul sama sekali di search result karena sitemap kamu mengarahkan crawler ke URL yang salah.

Aku tau ini karena aku pernah ngalamin sendiri. Waktu masih pakai Eleventy untuk hibranwar.com, sitemap yang di-generate secara otomatis mengandung beberapa error yang baru aku sadari setelah berminggu-minggu. Error kecil. Tapi dampaknya menyebar ke semua halaman yang terindeks.

Sekarang aku maintain sitemap.php sendiri. Bukan karena aku suka bikin susah. Tapi karena setelah debugging sitemap yang rusak beberapa kali, aku paham bahwa ini bukan file yang boleh di-autopilot.


Apa itu sitemap XML, dan kenapa kamu harus peduli

Sitemap XML adalah dokumen yang memberitahu search engine crawler tentang halaman-halaman di website kamu. Bukan untuk manusia. Untuk mesin. Formatnya XML standar, dengan namespace dari sitemaps.org.

Crawler seperti Googlebot, Bingbot, GPTBot, dan PerplexityBot menggunakan sitemap sebagai salah satu sumber untuk menentukan halaman mana yang perlu di-crawl. Bukan satu-satunya sumber. Internal link juga penting. Tapi sitemap adalah sinyal eksplisit: "Ini halaman-halaman yang aku anggap penting."

Sitemap XML bukan sekadar daftar URL. Ini adalah dokumen kontrak antara kamu dan search engine. Setiap URL yang kamu cantumkan di sitemap adalah deklarasi: "Halaman ini ada, halaman ini penting, dan halaman ini layak di-index." Kalo URL itu ternyata 404, redirect, atau noindex, kamu mengirim sinyal yang kontradiktif. Dan crawler ga suka sinyal yang kontradiktif.

Kalo kamu sudah baca tulisan aku soal kenapa website statis lebih baik untuk visibilitas AI, kamu paham bahwa AI crawler mengandalkan sinyal-sinyal teknis yang bersih. Sitemap adalah salah satu sinyal itu.

Struktur sitemap XML yang benar

Sebelum bahas error, kita lihat dulu seperti apa sitemap XML yang benar. Ini bukan teori. Ini format yang didefinisikan oleh protokol sitemaps.org dan dipakai oleh semua major search engine.

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/</loc>
    <lastmod>2026-06-15</lastmod>
  </url>
  <url>
    <loc>https://example.com/about/</loc>
    <lastmod>2026-05-20</lastmod>
  </url>
  <url>
    <loc>https://example.com/writing/</loc>
    <lastmod>2026-06-28</lastmod>
  </url>
</urlset>

Beberapa hal penting:

  • XML declaration wajib. Baris pertama harus <?xml version="1.0" encoding="UTF-8"?>
  • Namespace wajib. Tag <urlset> harus menyertakan xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  • Tag <loc> wajib. Ini URL lengkap, termasuk protokol (https://). Bukan path relatif
  • Tag <lastmod> opsional tapi direkomendasikan. Format ISO 8601: YYYY-MM-DD atau YYYY-MM-DDThh:mm:ss+00:00
  • Tag <changefreq> dan <priority> secara resmi masih ada di spesifikasi, tapi Google sudah mengkonfirmasi bahwa mereka mengabaikan keduanya [1]. Aku ga pakai keduanya. Buang saja.

Itu saja. Sederhana. Yang bikin ribet bukan formatnya, tapi apa yang orang masukkan ke dalamnya.

Cara implementasi sitemap di Eleventy

Eleventy ga punya sitemap generator bawaan. Kamu harus bikin sendiri. Kalo kamu baru mulai dengan Eleventy dan butuh panduan setup dari nol, aku sudah tulis detailnya di essay tentang Eleventy setup. Tapi untuk sitemap spesifik, ini sebenarnya keuntungan, karena kamu punya kontrol penuh atas apa yang masuk ke sitemap.

Cara paling umum: buat template Nunjucks yang iterate melalui collections.all dan output XML.

---
permalink: /sitemap.xml
eleventyExcludeFromCollections: true
---
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{%- for page in collections.all %}
{%- if not page.data.excludeFromSitemap %}
  <url>
    <loc>{{ metadata.url }}{{ page.url }}</loc>
    <lastmod>{{ page.date | dateToISO }}</lastmod>
  </url>
{%- endif %}
{%- endfor %}
</urlset>

Beberapa catatan implementasi:

  1. eleventyExcludeFromCollections: true supaya file sitemap sendiri ga masuk ke koleksi (dan ga masuk ke sitemap sendiri, rekursif)
  2. excludeFromSitemap adalah custom frontmatter flag. Tambahkan di halaman-halaman yang ga perlu diindex: 404 page, tag pages yang thin, layout files
  3. metadata.url harus didefinisikan di data file global kamu. Ini base URL situs. Harus HTTPS, tanpa trailing slash
  4. dateToISO adalah custom filter. Pastikan output-nya format ISO 8601 yang valid

Masalah paling umum di sini: page.date di Eleventy default-nya adalah file creation date, bukan tanggal yang kamu set di frontmatter. Kalo kamu ga eksplisit set date di frontmatter, sitemap kamu akan menampilkan tanggal yang ga akurat. Dan lastmod yang ga akurat lebih buruk dari ga ada lastmod sama sekali [2].

Sitemap index untuk situs besar

Satu file sitemap dibatasi 50.000 URL dan 50MB uncompressed [3]. Kalo situs kamu mendekati limit itu (e-commerce, media, course platform), kamu butuh sitemap index.

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://example.com/sitemap-pages.xml</loc>
    <lastmod>2026-06-28</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap-posts.xml</loc>
    <lastmod>2026-06-30</lastmod>
  </sitemap>
</sitemapindex>

Di Eleventy, kamu bisa split sitemap berdasarkan koleksi. Satu sitemap untuk pages, satu untuk posts, satu untuk tag pages. Masing-masing file di-generate sebagai template terpisah.

Untuk hibranwar.com, aku ga butuh sitemap index karena total halaman masih di bawah 500. Tapi arsitekturnya sudah aku siapkan dari awal. Karena aku tau: konten akan terus bertambah. Lebih baik desain dari awal daripada refactor nanti.

Error umum sitemap XML

Ini yang penting. Aku sudah kumpulkan dari pengalaman sendiri dan data dari berbagai sumber [2] [4].

Error Dampak Severity Solusi
URL di sitemap return 404 Crawler membuang crawl budget untuk URL yang ga ada. Terlalu banyak 404 bisa menurunkan trust pada sitemap secara keseluruhan Tinggi Audit sitemap setiap kali hapus halaman. Otomasi dengan build step
HTTP vs HTTPS mismatch Crawler menemukan dua versi URL. Sinyal kanonikalisasi jadi ambigu Tinggi Pastikan semua URL di sitemap pakai HTTPS. Cek base URL di config
URL non-canonical di sitemap Sitemap mengarahkan ke URL yang punya canonical tag menunjuk ke URL lain. Kontradiktif Tinggi Hanya masukkan canonical URL. Filter duplikat di build time
URL dengan noindex di sitemap Kamu bilang "index ini" di sitemap tapi "jangan index" di meta tag. Crawler bingung Tinggi Kalo halaman noindex, keluarkan dari sitemap. Titik
URL redirect (301/302) di sitemap Crawler harus follow redirect, membuang satu hop. Terlalu banyak redirect di sitemap menandakan sitemap ga dirawat Sedang Selalu point ke final destination URL, bukan URL yang redirect
Lastmod ga akurat Google menggunakan lastmod untuk prioritas crawling. Kalo semua lastmod sama (atau tanggal hari ini), sinyal ini jadi noise [2] Sedang Gunakan actual modification date. Di Eleventy, set date eksplisit di frontmatter
Namespace XML salah atau hilang Parser XML gagal membaca file. Sitemap dianggap invalid Tinggi Selalu sertakan xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
Format tanggal salah Lastmod dengan format MM/DD/YYYY atau format non-ISO akan diabaikan atau menyebabkan parsing error Sedang Gunakan ISO 8601: YYYY-MM-DD atau YYYY-MM-DDThh:mm:ss+00:00
Sitemap ga disubmit atau ga direferensikan di robots.txt Crawler mungkin ga menemukan sitemap kamu sama sekali Sedang Submit via GSC DAN tambahkan Sitemap: directive di robots.txt
Memasukkan halaman thin content Crawler mengindex halaman bernilai rendah. Menurunkan average quality signal situs Rendah Filter tag pages, pagination pages, utility pages dari sitemap

Kalo aku harus pilih satu error yang paling sering aku temui: URL yang return 404 atau redirect. Ini terjadi karena orang menghapus atau memindahkan halaman tapi lupa update sitemap. Di static site generator kayak Eleventy, ini bisa terjadi kalo kamu rename file atau ubah slug tanpa rebuild sitemap.

Hubungan sitemap dengan robots.txt

Dua file ini saling terkait tapi punya fungsi berbeda. robots.txt bilang ke crawler: "Jangan crawl halaman ini." Sitemap bilang ke crawler: "Tolong crawl halaman ini."

Yang sering bikin masalah: halaman yang di-disallow di robots.txt tapi ada di sitemap. Atau sebaliknya, halaman penting yang ga ada di sitemap dan ga punya internal link yang cukup kuat.

Best practice yang aku pakai:

  1. Tambahkan directive Sitemap: https://example.com/sitemap.xml di robots.txt
  2. Pastikan ga ada URL di sitemap yang di-block oleh robots.txt
  3. Kalo halaman ga boleh dicrawl, keluarkan dari sitemap. Jangan mengandalkan robots.txt saja

Ini prinsip yang sama kayak yang aku bahas di GEO vs. SEO: sinyal teknis harus konsisten. Satu sinyal yang kontradiktif bisa merusak puluhan sinyal lain yang sudah benar.

Validasi sitemap: jangan cuma generate, cek

Setelah sitemap kamu jadi, validasi. Jangan percaya bahwa output dari SSG atau plugin pasti benar. Aku sudah beberapa kali menemukan sitemap yang lolos build tapi gagal di validator.

Tools yang aku rekomendasikan:

  • Google Search Console. Submit sitemap dan lihat Coverage report. GSC akan menunjukkan URL mana yang error, redirect, atau excluded
  • XML Sitemap Validator (xmlsitemapvalidator.com). Cek syntax XML dan format URL
  • Screaming Frog. Crawl sitemap kamu dan bandingkan dengan actual site structure. Ini cara paling reliable untuk menemukan mismatch
  • curl + xmllint. Untuk yang suka command line: curl -s https://site.com/sitemap.xml | xmllint --noout -. Kalo ga ada output, berarti XML valid

Validasi bukan hal yang kamu lakukan sekali. Setiap kali ada perubahan signifikan di struktur situs (tambah halaman baru, hapus halaman, ubah URL pattern), validasi ulang. Di hibranwar.com, reindexer aku otomatis memperbarui sitemap setiap kali dijalankan. Ga ada celah untuk sitemap yang stale.

Kenapa aku pindah dari auto-generate ke sitemap.php

Ini bagian yang personal.

Waktu hibranwar.com masih pakai Eleventy, sitemap di-generate otomatis dari template Nunjucks. Secara teori, sempurna. Setiap build, sitemap diperbarui. Ga ada manual intervention.

Tapi dalam praktiknya, ada beberapa masalah yang bikin aku frustrasi:

  1. Page date vs file date. Eleventy kadang pakai file modification date, bukan frontmatter date. Ini bikin lastmod di sitemap ga konsisten
  2. Draft posts. Post dengan draft: true kadang lolos ke sitemap kalo filter ga diterapkan dengan benar di template
  3. URL trailing slash. Eleventy generate URL tanpa trailing slash di beberapa kasus, tapi server redirect ke versi dengan trailing slash. Sitemap mengandung URL yang semuanya redirect
  4. Collections yang ga terkontrol. collections.all mencakup semua file, termasuk layout, partial, dan utility pages yang harusnya ga masuk sitemap

Setelah migrasi ke PHP includes, aku bikin sitemap.php yang query langsung ke SQLite database (content.db). Sitemap hanya berisi halaman yang sudah published (date filter), bukan draft atau halaman yang dijadwalkan untuk masa depan. Setiap URL di sitemap pasti return 200. Ga ada 404. Ga ada redirect. Ga ada draft yang lolos.

Apakah ini overkill untuk situs dengan beberapa ratus halaman? Mungkin. Tapi aku lebih suka spend 2 jam sekali membangun sistem yang benar daripada debugging sitemap error setiap bulan.

Sitemap untuk AI crawler

Satu hal yang jarang dibahas: AI crawler (GPTBot, ClaudeBot, PerplexityBot) juga membaca sitemap. Mereka ga punya crawl budget seketat Googlebot, tapi mereka tetap menggunakan sitemap sebagai starting point untuk memahami struktur situs.

Kalo sitemap kamu bersih, AI crawler bisa menemukan semua konten penting kamu dengan cepat. Kalo sitemap kamu penuh error, beberapa halaman mungkin ga pernah ditemukan oleh AI. Dan di era di mana jawaban AI menentukan apakah nama kamu disebut atau ga, itu risiko yang ga perlu.

Prinsipnya sama: apa yang bagus untuk Googlebot, bagus untuk AI crawler. Clean HTML, clean schema, clean sitemap. Tiga hal yang kelihatannya basic tapi dilewatkan oleh sebagian besar website.


Checklist sitemap XML

Sebelum kamu submit sitemap ke GSC, jalankan checklist ini:

  1. Semua URL pakai HTTPS (bukan HTTP)
  2. Semua URL return status 200 (bukan 301, 302, 404, atau 410)
  3. Ga ada URL dengan meta noindex di sitemap
  4. Ga ada URL yang di-disallow di robots.txt
  5. Semua URL adalah canonical version (bukan duplikat)
  6. Format lastmod pakai ISO 8601 (YYYY-MM-DD)
  7. Namespace XML benar (http://www.sitemaps.org/schemas/sitemap/0.9)
  8. XML declaration ada di baris pertama
  9. Sitemap direferensikan di robots.txt
  10. Sitemap sudah disubmit di Google Search Console dan Bing Webmaster Tools

Sepuluh item. Ga ada yang rumit. Tapi kalo kamu skip satu saja, dampaknya bisa menyebar ke semua halaman yang terindeks. Ya kan?


Frequently Asked Questions

Apakah sitemap XML wajib untuk website kecil?

Secara teknis, ga wajib. Google bisa menemukan halaman kamu lewat internal link tanpa sitemap. Tapi "bisa" dan "akan" itu beda. Sitemap memberikan sinyal eksplisit tentang halaman mana yang kamu anggap penting. Untuk website kecil (di bawah 50 halaman), sitemap memastikan semua halaman ditemukan dengan cepat, terutama halaman baru yang belum punya banyak internal link. Effort bikin sitemap: 15 menit. Risiko ga punya sitemap: halaman penting ga terindex selama berminggu-minggu. Worth it.

Apakah Google benar-benar mengabaikan tag priority dan changefreq?

Ya. Google secara resmi mengkonfirmasi bahwa mereka mengabaikan kedua tag ini [1]. Alasannya logis: webmaster cenderung set priority semua halaman ke 1.0 dan changefreq ke "daily", yang membuat data ini jadi noise. Google lebih percaya pada data crawl aktual (kapan terakhir halaman berubah, seberapa sering) daripada deklarasi dari webmaster. Jadi buang kedua tag ini dari sitemap kamu. Bikin file lebih kecil, lebih bersih, ga ada yang hilang.

Bagaimana cara menangani halaman yang dihapus dari sitemap?

Hapus URL dari sitemap, lalu biarkan Google re-crawl. Kalo halaman itu memang sudah dihapus dari server (return 404 atau 410), Google akan de-index secara otomatis dalam beberapa hari sampai minggu. Kalo kamu mau lebih cepat, gunakan URL Removal tool di GSC. Yang penting: jangan biarkan URL yang sudah dihapus tetap ada di sitemap. Itu sinyal kontradiktif yang bikin crawler bingung.

Berapa sering sitemap harus diperbarui?

Setiap kali ada perubahan di struktur situs: halaman baru, halaman dihapus, URL berubah. Untuk blog atau situs yang publish rutin, sitemap idealnya diperbarui setiap kali ada post baru. Di static site generator, ini otomatis terjadi saat build. Di PHP atau CMS, kamu bisa generate sitemap secara dinamis dari database. Di hibranwar.com, sitemap.php query langsung ke content.db setiap kali diakses. Selalu fresh.

Apa bedanya sitemap XML dan sitemap HTML?

Sitemap XML untuk mesin. Sitemap HTML untuk manusia. Sitemap XML pakai format XML standar yang bisa diparsing oleh crawler. Sitemap HTML adalah halaman web biasa yang menampilkan daftar link untuk navigasi pengunjung. Keduanya berguna, tapi ketika orang bilang "sitemap" dalam konteks SEO dan crawling, yang dimaksud adalah sitemap XML. Jangan submit sitemap HTML ke GSC, itu ga akan diproses dengan benar [4].

References

  1. Mueller, John. "Google does not use the priority or changefreq values in sitemaps." Google Search Central, 2023. Link
  2. ViSitemap. "Common Sitemap Errors: How to Fix Issues Hurting Your SEO." ViSitemap Blog, 2025. Link
  3. Google. "Build and submit a sitemap." Google Search Central Documentation, 2024. Link
  4. SearchXPro. "10 XML Sitemap Errors and Fixes." SearchX SEO Agency, 2025. Link
  5. Zahid, Danial. "Add a Sitemap (sitemap.xml) for Your Eleventy Website." W3Things, 2023. Link