Headless WordPress CMS + Next.js Frontend
Fondasi headless yang selesai dalam 21 hari
Penawaran untuk membangun website pertama Anda di atas WordPress headless dan Next.js: CMS yang terstruktur, halaman yang siap dibaca mesin pencari, dan update yang langsung tayang tanpa build ulang. Sisa brief saya petakan lengkap dengan harganya.
Ringkasan
Apa yang Anda dapat dengan Rp 5 juta
Brief Anda mencakup dua website, sepuluh jenis konten, multilingual, structured data, keamanan, Core Web Vitals, dan integrasi CRM. Cakupan sebesar itu realistisnya butuh beberapa bulan kerja.
Jadi yang saya tawarkan di sini adalah bagian yang bisa saya selesaikan tuntas dalam 21 hari: website pertama Anda, live di produksi, dengan seluruh fondasi teknisnya sudah terpasang. Sisanya saya pecah jadi modul dengan harga masing-masing di bagian 08, supaya Anda bisa mengambilnya kapan anggarannya siap.
Yang saya bawa ke proyek ini
Sebelum menulis penawaran, saya membangun implementasi referensi untuk arsitektur yang Anda minta. Isinya dua aplikasi Next.js, sepuluh jenis konten, plugin WordPress headless, ISR dengan webhook revalidation, sitemap terpecah dengan hreflang, dan JSON-LD yang diambil langsung dari CMS. Anda bisa menjalankannya sendiri dengan tiga perintah.
Di dalamnya ada skrip verifikasi yang menyalakan kedua server, mengambil halaman tanpa menjalankan JavaScript sama sekali, lalu memeriksa 181 hal: H1, isi tabel spesifikasi, canonical, hreflang, JSON-LD, sitemap, robots, redirect, dan security header. Jadi klaim "HTML siap di-crawl" di penawaran ini bisa Anda buktikan sendiri.
Skrip itu juga menemukan tiga bug di kode saya sendiri saat demo dibangun, salah satunya middleware yang diam-diam mematikan webhook publish. Saya sebutkan karena begitulah cara saya bekerja: verifikasi otomatis masuk ke dalam scope, bukan jadi tambahan.
Karena fondasi itu sudah ada dan sudah teruji, waktu 21 hari bisa langsung dipakai untuk model konten dan halaman Anda.
Catatan
Satu hal yang perlu saya sampaikan di awal
Transparansi portofolio
Saya belum punya proyek headless WordPress + Next.js yang sudah live untuk klien dan boleh saya bagikan URL publiknya. Brief Anda menyebut hal ini secara khusus, jadi saya sampaikan sekarang, bukan nanti.
Sebagai gantinya saya membangun implementasi referensi tadi, dan membuatnya bisa Anda periksa sendiri tanpa perlu percaya pada kata-kata saya.
Kalau pengalaman produksi headless WordPress memang syarat mutlak buat Anda, saya paham sepenuhnya. Kalau yang Anda nilai adalah cara berpikir, keputusan arsitektur, dan kualitas implementasi, bahan penilaiannya sudah bisa dibuka hari ini juga.
Scope
Yang masuk 21 hari, dan yang menyusul
Batasnya saya tulis di penawaran supaya jelas sejak awal. Kalau ada baris di kolom kanan yang menurut Anda wajib ada di rilis pertama, sampaikan saja. Kita bisa tukar dengan sesuatu di kolom kiri.
| Termasuk (Rp 5.000.000 / 21 hari) | Menyusul di fase berikutnya |
|---|---|
| Satu website (commercial site), live di produksi | Website kedua dan relasi konten antar keduanya |
| Empat jenis konten: Products, Applications, Articles, Technical Resources. CPT dan ACF didaftarkan lewat kode. | Certifications, Industries, Case Studies, Authors, FAQ |
Struktur multilingual terpasang: URL /en/…, hreflang, translation group, sitemap yang sadar bahasa. Satu bahasa terisi. |
Bahasa kedua dan ketiga, setup Polylang atau WPML, alur penerjemahan |
| Fondasi SEO: metadata dinamis, canonical, robots, sitemap terpecah, JSON-LD Organization, WebSite, Product, Article, BreadcrumbList | Audit technical SEO menyeluruh, peta redirect migrasi, optimasi Core Web Vitals |
| Publish langsung tayang lewat webhook, plus preview draft dari tombol Preview WordPress | Sudah lengkap di fase ini |
| Satu form inquiry dengan validasi server, honeypot, rate limit, dan Turnstile | Empat form sisanya, integrasi CRM, event tracking lengkap |
| Komponen inti: hero, teks, tabel spesifikasi, kartu produk, kartu dokumen, FAQ, CTA, related content | Comparison table, process diagram, timeline, statistik, case study, blok video |
| Keamanan dasar: security header, CMS di subdomain terpisah, REST write terkunci, jenis upload dibatasi | WAF, MFA, pembatasan IP admin, uji pemulihan backup, logging |
| Deploy produksi dan staging, GA4 dan GTM terpasang, dokumentasi dan handover | Search Console, Bing Webmaster, monitoring dan laporan bulanan |
Yang saya butuhkan supaya 21 hari ini realistis
Desain visual final, atau izin memakai design system dari demo. Konten untuk minimal 5 produk dan 3 artikel. Akses ke hosting CMS. Dan keputusan dari pihak Anda dalam 1 hari kerja. Kalau ada yang belum siap saat mulai, saya akan usulkan menggeser tanggal mulai daripada memotong waktu QA, dan itu saya sampaikan di weekly report pertama.
01
Portofolio
Implementasi referensi untuk brief ini
Monorepo berisi dua aplikasi Next.js 15 (App Router, React 19, TypeScript) di atas WordPress headless, dengan dua brand demo: Verdano Materials untuk sisi komersial dan Fiberline Review untuk knowledge center. Konten demonya sengaja dipilih yang sulit: tabel properti berikut metode ujinya, data sertifikat dengan nomor yang bisa diverifikasi, dokumen teknis dengan revisi dan reviewer, serta relasi konten yang menyeberang antar domain.
| Bagian | Yang dibuktikan |
|---|---|
| apps/website-a | Materials, applications, industries, certifications, case studies, dan 5 form inquiry |
| apps/website-b | Knowledge center, technical resources, halaman penulis, FAQ |
| packages/cms | Model konten bertipe, driver WordPress REST, driver fixture, resolusi URL, penanda cache |
| packages/seo | Metadata, canonical, hreflang, sitemap terpecah, robots, security header |
| packages/schema | JSON-LD Product, Article, Person, FAQPage, DigitalDocument, Certification, BreadcrumbList |
| wordpress/ | Plugin must-use: CPT, ACF lewat kode, payload REST yang sudah dirapikan, preview bertanda tangan, webhook HMAC, hardening |
git clone https://github.com/nugrohosetiaji91-png/headless-wp-nextjs-b2b.git cd headless-wp-nextjs-b2b npm install npm run build npm run verify:ssr === Website A === === Website B === === Sitemap, robots, redirect === 181/181 checks passed.
Proyek lain
Bukan headless WordPress, tapi menunjukkan cara kerja yang sama: model data yang dipikirkan matang, tes yang benar-benar dijalankan, dan produk yang sampai selesai.
- OmniStok. Aplikasi sales dan inventory dengan satu codebase Flutter untuk web, Android, dan desktop. Repo terbuka dan ada demo yang bisa diklik. Dibangun sebagai bukti kerja untuk klien, lalu diperbaiki mengikuti klarifikasi scope dari klien tersebut.
- LINI ERP. ERP manufaktur dengan React 19, TypeScript, dan Vite. 53 rute dan 18 laporan. Logika bisnisnya ditulis terpisah dari UI supaya bisa dipindah ke backend tanpa menyentuh tampilan. Saldo stok dihitung dari akumulasi mutasi, bukan angka yang disimpan begitu saja.
- Bot absensi multi-tenant. Bot Telegram dengan penjadwal, throttling pengiriman massal, dan penanganan rate limit. 63 tes hijau.
02
Arsitektur teknis
- 1WordPress di subdomain sendiri (
cms.domain.com), tanpa theme dan tanpa halaman publik. Request selain API diarahkan keluar. - 2REST API. Setiap response membawa satu objek
platformyang sudah dirapikan: bahasa, website pemilik, translation group, SEO, relasi, dan daftar blok. - 3packages/cms. Satu-satunya lapisan yang tahu bentuk WordPress. Halaman tidak pernah menyentuh payload mentah ACF.
- 4Next.js. Server Components dan ISR, dengan penanda cache per dokumen, per jenis konten, per kelompok bahasa, dan per sitemap.
- 5CDN. HTML statis dari edge. Halaman yang belum pernah dirender dibuat saat request pertama, lalu ikut tersimpan di cache.
Saya memilih REST, bukan WPGraphQL, karena brief Anda menyebut REST dan karena WPGraphQL adalah plugin komunitas yang duduk di jalur kritis. Kalau nanti Anda ingin pindah, drivernya hanya satu file di balik interface.
Monorepo dipakai supaya dua website berbagi satu definisi canonical, satu pembangun hreflang, dan satu daftar event analytics. Kalau logika URL tersebar di dua tempat, canonical dan sitemap gampang berselisih.
- Next.js 15
- React 19
- TypeScript
- npm workspaces
- WordPress 6.5+
- ACF Pro
- Polylang / WPML
- Zod
- Vercel
- Cloudflare
03
Pendekatan CMS
Semua jenis konten dan field group didaftarkan lewat kode, bukan diklik lewat admin. Alasannya praktis: field group yang dibuat di UI hanya tersimpan di database, sehingga sulit direview, mudah berbeda antar environment, dan bisa tertimpa saat restore staging.
| Jenis | Pemilik | Field inti |
|---|---|---|
| product | Site A | SKU, material family, key properties (properti, nilai, satuan, metode uji), relasi |
| application | Site A | relasi ke produk, industri, artikel |
| industry | Site A | relasi ke produk dan case study |
| certification | Site A | nama, penerbit, nomor sertifikat, ruang lingkup, tanggal terbit dan kedaluwarsa, URL verifikasi, dokumen |
| case_study | Site A | klien, negara, hasil terukur |
| post (article) | Site B | hero, penulis, technical reviewer, lama baca, tautan ke produk |
| technical_resource | Site B | judul dokumen, jenis, produk dan aplikasi terkait, revisi, tanggal, reviewer, PDF, bahasa, gated |
| person | Site B | jabatan, kredensial, foto, LinkedIn |
| faq | Site B | pertanyaan, jawaban |
| page | keduanya | palet blok, dengan pilihan website pemilik |
Editor tidak perlu menyusun layout. Mereka memilih dari palet blok yang sudah tersedia: hero, teks, tabel spesifikasi, tabel perbandingan, diagram proses, timeline, statistik, FAQ, CTA, related content, dan media. Masing-masing blok sudah tahu cara tampil responsif dan cara mengisi structured data-nya.
Dua hal kecil yang saya pasang di level field
Nilai properti wajib disertai metode ujinya, supaya angka yang tampil di halaman dan di structured data selalu punya rujukan standar.
Pilihan menggerbang dokumen di balik form diberi keterangan di editor, karena setiap dokumen yang digerbang menukar trafik organik dengan data prospek. Keputusannya tetap di tangan Anda, hanya konsekuensinya terlihat saat memilih.
Relasi antar konten inilah yang menyatukan dua website. Editor cukup memilih konten terkait di WordPress, lalu sistem yang menentukan apakah tautannya relatif atau lintas domain, memberi label, dan mengirim event analytics. Tidak ada URL lintas domain yang perlu diketik manual.
04
Pendekatan SEO
Semua canonical, hreflang, entri sitemap, breadcrumb, dan tautan antar website dihasilkan oleh satu modul yang sama. Ini yang menjaga sitemap dan canonical tetap sepakat saat jumlah bahasa dan halaman bertambah.
| Aspek | Keputusan |
|---|---|
| Rendering | Static dan ISR untuk semua halaman konten. Slug baru dirender saat request pertama lalu ikut tersimpan, tanpa perlu deploy. |
| Bahasa | Selalu ada di awal URL, termasuk bahasa default (/en/…). Tidak ada versi duplikat di root, jadi canonical-nya lurus. |
| hreflang | Dibangun dari translation group, jadi hanya bahasa yang benar-benar ada yang dicantumkan. x-default selalu ikut. |
| Canonical | Menunjuk ke dirinya sendiri secara default. Bisa diarahkan ke URL lain kalau editor memang menghendaki. |
| Sitemap | Dipecah per jenis konten dan dilayani sebagai route, bukan file hasil build. Tiap sitemap membawa xhtml:link alternates. Halaman noindex otomatis tidak ikut masuk. |
| robots.txt | Menyesuaikan environment. Satu variabel mengunci tiga lapis sekaligus: robots.txt, meta robots, dan header X-Robots-Tag, supaya staging tidak terindeks. |
| Structured data | Diambil dari dokumen yang sama dengan yang dirender halaman, jadi isinya selalu cocok dengan yang dilihat pengunjung. |
| Redirect | Peta redirect migrasi disimpan sebagai konfigurasi dengan status 308. Konten yang memang dihapus permanen dibalas 410. |
| Trailing slash dan www | Satu bentuk URL saja, ditegakkan oleh framework dan edge. |
| Halaman yatim | Halaman penulis menampilkan artikel yang ditulis dan direview. Setiap halaman indeks punya H1 sendiri dan masuk sitemap. |
Performa
Target Anda (LCP di bawah 2,5 detik, INP di bawah 200 ms, CLS di bawah 0,1) dikejar lewat keputusan arsitektur sejak awal. Semua blok adalah Server Component, jadi JavaScript yang dikirim ke browser sangat sedikit. Setiap gambar punya dimensi tetap untuk menjaga CLS, diformat AVIF atau WebP lewat next/image, dan embed video baru dimuat saat pengunjung mengkliknya.
GTM dimuat setelah interaksi pertama atau 1,2 detik setelah halaman selesai, mana yang lebih dulu. Ini menjaga LCP dan INP tetap aman tanpa kehilangan data analytics.
05
Alur publikasi
Editor tetap memakai alur yang sudah mereka kenal, dan tidak perlu tahu bahwa frontend-nya aplikasi terpisah.
- 1Editor menulis di WordPress dan menekan Preview. Tombolnya mengarah ke link bertanda tangan menuju frontend.
- 2Frontend membuka draft mode dan membaca draft tanpa menyimpannya ke cache, jadi draft tidak pernah bocor ke pengunjung.
- 3Reviewer teknis menyetujui. Ada status menunggu review antara draft dan publish, khusus untuk konten yang memuat data teknis.
- 4Editor menekan Publish. WordPress mengirim webhook bertanda tangan HMAC-SHA256.
- 5Frontend membatalkan empat penanda cache saja: dokumen itu, jenis kontennya, kelompok bahasanya, dan sitemap.
- 6Request berikutnya merender ulang halaman itu saja. Tanpa deploy, tanpa build ulang.
Webhook dikirim lewat cron satu detik, bukan langsung, supaya frontend yang sedang lambat tidak membuat tombol Publish menggantung. Kalau pengirimannya gagal, notifikasi muncul di admin WordPress supaya ketahuan hari itu juga.
06
Rekomendasi deployment
| Lapisan | Pilihan | Alasan |
|---|---|---|
| Frontend | Vercel | ISR dan revalidasi per penanda berjalan tanpa infrastruktur tambahan. Di VPS hal yang sama butuh shared cache handler dan sticky routing yang harus dirawat terus. |
| CDN dan WAF | Cloudflare | Di depan keduanya, untuk rate limiting /wp-json dan halaman login, pembatasan IP ke /wp-admin, serta Turnstile di form. |
| CMS | VPS di cms.domain.com |
WordPress butuh PHP, cron, dan filesystem yang persisten. Terpisah dari trafik publik dan tidak pernah jadi frontend. |
| Media | Object storage dan CDN | PDF dan gambar tidak dilayani dari server WordPress. |
| CI/CD | GitHub Actions dan preview Vercel | Setiap pull request dapat URL preview. Typecheck, build, dan skrip verifikasi SEO jalan otomatis sebelum digabung. |
| Staging | Environment terpisah, noindex | Dengan HTTP auth di edge, supaya tidak pernah terbaca mesin pencari. |
| Rollback | Instant rollback Vercel | Kembali ke deployment sebelumnya dalam hitungan detik. Konten tidak terpengaruh karena tersimpan di CMS. |
Kalau kebijakan Anda mengharuskan semuanya berada di infrastruktur sendiri, saya bisa mengerjakannya di VPS dengan Node dan shared cache handler. Silakan sampaikan, nanti saya sesuaikan estimasinya.
Yang terpasang di fase fondasi
Vercel (paket gratis sudah cukup untuk memulai), WordPress di subdomain terpisah, staging ber-noindex, CI yang menjalankan typecheck dan verifikasi SEO, serta security header di semua response. Cloudflare WAF, pembatasan IP admin, MFA, dan object storage masuk modul hardening di bagian 08. Arsitekturnya sudah siap menerima semua itu tanpa perlu dibongkar.
07
Timeline 21 hari
| Hari | Pekerjaan | Yang bisa Anda lihat |
|---|---|---|
| 1–3 | Review kebutuhan, finalisasi model konten, setup repo dan WordPress di subdomain CMS | Dokumen model konten untuk disetujui sebelum kode ditulis |
| 4–9 | CPT dan ACF lewat kode, REST layer, integrasi Next.js, preview dan revalidate | Editor sudah bisa menulis di WordPress dan melihat hasilnya di staging |
| 10–15 | Template halaman, komponen konten, form inquiry, tampilan responsif | Seluruh alur halaman berjalan di staging dengan konten asli |
| 16–18 | Metadata, canonical, sitemap, robots, JSON-LD, struktur multilingual, performa | Hasil verify:ssr di website Anda sendiri |
| 19–21 | QA, uji browser dan perangkat, deploy produksi, dokumentasi, handover | Website live, tim Anda sudah bisa publish sendiri |
| 21 | Selesai | Plus 30 hari bug fixing |
Hari 1 sampai 3 menghasilkan dokumen yang perlu Anda setujui lebih dulu. Checkpoint ini yang paling menentukan, karena perubahan model konten jauh lebih murah di hari kedua daripada di minggu ketiga.
08
Proposal komersial
| Cakupan | Biaya |
|---|---|
| Pengembangan fase fondasi | Rp 4.400.000 |
| Deployment dan setup: Vercel, DNS, SSL, security header, staging, CI, GA4, GTM | Rp 600.000 |
| Bug fixing 30 hari setelah launch | Termasuk |
| Dokumentasi dan handover | Termasuk |
| Total penawaran | Rp 5.000.000 |
Angka ini saya letakkan di tengah rentang anggaran Anda, bukan di batas atasnya. Alasannya sederhana: ini proyek pertama saya di platform ini, jadi saya belum punya rekam jejak yang bisa Anda cek di sini. Harga di tengah terasa lebih pantas untuk posisi itu.
Yang membuatnya tetap masuk akal dari sisi saya, fondasi arsitekturnya sudah dibangun dan diuji sebelum penawaran ini ditulis, jadi 21 hari penuh bisa dipakai untuk website Anda.
Peta biaya untuk sisa brief
Bagian ini bukan sesuatu yang perlu Anda putuskan sekarang. Tujuannya supaya Anda punya angka nyata saat menyusun anggaran tahap berikutnya. Tiap modul berdiri sendiri dan bisa diambil dalam urutan apa pun.
| Modul | Estimasi | Durasi |
|---|---|---|
| Website kedua dan relasi konten antar website | Rp 5.500.000 | 18 hari |
| Jenis konten sisanya dan komponen lengkap | Rp 4.500.000 | 14 hari |
| Multilingual penuh: 2 bahasa, Polylang atau WPML, alur kerja dan QA | Rp 4.500.000 | 14 hari |
| Optimasi Core Web Vitals, audit technical SEO, peta redirect migrasi | Rp 3.800.000 | 12 hari |
| Lead generation lengkap: 5 form, integrasi CRM, event tracking | Rp 3.500.000 | 10 hari |
| Hardening keamanan: WAF, MFA, pembatasan IP admin, uji backup, logging | Rp 3.000.000 | 8 hari |
| Seluruh brief, bertahap | Rp 29.800.000 | ± 4 bulan |
| Paket | Cakupan | Per bulan |
|---|---|---|
| Esensial | Monitoring uptime, patch keamanan WordPress dan dependency, cek backup, bug fix sampai 3 jam | Rp 1.200.000 |
| Aktif | Semua yang ada di Esensial, plus 6 jam pengembangan fitur kecil dan laporan Core Web Vitals | Rp 2.800.000 |
Permintaan di luar cakupan yang tertulis di bagian Scope dihitung Rp 200.000 per jam, selalu diestimasi dan disetujui lebih dulu.
Belum termasuk
Lisensi dan langganan pihak ketiga: ACF Pro sekitar USD 49 per tahun, hosting WordPress, Vercel (paket gratis cukup untuk memulai), dan domain. Semuanya dibayar langsung atas nama Anda supaya kepemilikannya jelas. Copywriting, fotografi, penerjemahan, dan desain visual dari nol juga belum termasuk. Untuk desain, saya bisa memakai design system dari demo tanpa biaya tambahan kalau Anda setuju dengan arahnya.
Kalau Anda butuh seluruh brief sekaligus
Silakan sampaikan, dan saya akan menyusun ulang timeline serta biayanya secara terbuka. Yang saya sarankan adalah urutan bertahap seperti di atas, supaya website pertama sudah bisa dipakai jualan di hari ke-21, sementara modul berikutnya menyusul.
Tes
Jawaban skenario technical test
"Sebuah artikel baru diterbitkan melalui WordPress Headless CMS. Bagaimana Anda memastikan halaman tersebut tersedia dalam bentuk SEO-friendly HTML di Next.js, sitemap diperbarui, metadata dan structured data tersedia, serta frontend dapat diperbarui tanpa melakukan full rebuild seluruh website?"
Inilah yang sudah berjalan di implementasi referensi, jadi jawabannya bisa saya tunjukkan, bukan hanya diceritakan.
Saat editor menekan Publish, hook transition_post_status
menyala di plugin. WordPress tahu persis apa yang berubah: jenis konten, slug, bahasa, dan
translation group.
Plugin mengirim webhook ke frontend, ditandatangani HMAC-SHA256 atas isi request. Pengirimannya lewat cron satu detik supaya tidak menahan editor.
Frontend memverifikasi tanda tangannya, lalu membatalkan empat penanda cache: dokumen itu sendiri, jenis kontennya (karena halaman daftar ikut berubah), kelompok bahasanya (supaya hreflang tetap benar), dan sitemap. Ribuan halaman lain tidak tersentuh.
Request berikutnya merender ulang halaman itu saja. Slug yang belum ada saat build terakhir pun tetap dirender pada request pertama, lalu ikut tersimpan di cache. Tidak ada deploy, tidak ada build ulang.
Sitemap adalah route, bukan file hasil build, jadi ia ikut diperbarui oleh penanda yang sama dan URL barunya bisa ditemukan crawler dalam hitungan detik. Sitemap untuk jenis konten lain tidak ikut diregenerasi.
Metadata dan JSON-LD dibangun dari dokumen yang sama dengan yang dirender
halaman. Judul, deskripsi, canonical, hreflang, Article,
BreadcrumbList, dan FAQPage semuanya berasal dari satu sumber,
jadi isinya tidak bisa berbeda dari yang tampil di layar.
Waktu dari Publish sampai HTML siap diindeks: hitungan detik, dengan biaya satu render halaman.
Lanjut
Langkah berikutnya
Saya bisa mengirim akses ke implementasi referensi supaya tim teknis Anda menjalankannya sendiri. Tiga perintah, tanpa perlu WordPress dan tanpa kredensial.
Kalau kita lanjut, ada empat hal yang saya butuhkan sebelum hari pertama:
- Konfirmasi website mana yang dibangun lebih dulu. Saya menyarankan commercial site, karena itu yang menghasilkan inquiry.
- Daftar bahasa yang direncanakan. Strukturnya saya siapkan untuk semuanya sejak awal walau baru satu yang terisi, karena memasangnya di awal jauh lebih murah daripada mengubah struktur URL nanti.
- Akses ke website lama kalau ada. Peta redirect masuk fase lanjutan, tapi saya perlu tahu sejak awal supaya struktur URL-nya tidak menyulitkan migrasi.
- Konten untuk minimal 5 produk dan 3 artikel, atau konfirmasi bahwa boleh memakai konten sementara di rilis pertama.
Terima kasih sudah menulis brief sedetail ini. Dokumen sejelas itu membuat estimasi jadi jauh lebih jujur, dan itu jarang.