Threads vs X: Di Mana Developer Indonesia Benar-Benar Membaca

Foto oleh Ed Poor at English Wikipedia via Wikimedia Commons (CC BY-SA 3.0)
Tidak ada yang bisa menjawabnya untuk akun Anda dari data publik, karena reach bukan sesuatu yang dilaporkan tiap platform per penulis. Threads adalah satu-satunya dari keduanya yang mengumumkan angka audiens, dan ia mencantumkan bahasa Indonesia di antara bahasa yang didukung. Metode yang jujur adalah memberi tag utm_source pada setiap link, memposting ke keduanya selama tiga puluh hari, lalu membandingkan sessions per post di analytics Anda sendiri.
Threads dilaporkan mencapai 400 juta monthly active users pada Agustus 2025. X tidak pernah mengumumkan angka akun aktif sejak perusahaannya menjadi privat, jadi angka yang sering dikutip untuknya, misalnya 600 juta monthly active users pada Mei 2024, adalah pernyataan pemilik, bukan hasil yang dilaporkan. Perlakukan yang satu sebagai fakta yang bisa dikutip dan satunya sebagai klaim yang tidak terverifikasi.
Klaim itu tidak bisa diverifikasi dari luar, karena X tidak mempublikasikan bagaimana ranking-nya memperlakukan link dan turunnya reach Anda punya banyak penjelasan yang lebih sederhana. Yang dipublikasikan justru harga: X menagih 0,015 dolar AS untuk membuat post lewat API dan 0,200 dolar AS untuk post yang memuat URL. Itu fakta penagihan tentang API, bukan bukti tentang timeline.
Tambahkan utm_source, utm_medium dan utm_campaign pada setiap link yang Anda bagikan, lewat sebuah helper function agar nilainya tidak pernah diketik manual. Jaga utm_medium tetap sama di semua platform dan isi utm_campaign dengan slug tulisannya. Lalu baca sessions berdasarkan utm_source di analytics pada jendela waktu tetap, dan bagi dengan jumlah post yang Anda terbitkan di tiap platform.
Keduanya menyediakan write API, tetapi batasannya berbeda jenis. Threads API gratis saat dipakai dan dibatasi 250 post, 1.000 reply serta 100 penghapusan per profil per 24 jam berjalan, lengkap dengan endpoint yang melaporkan sisa kuota Anda. X API tidak mendokumentasikan free tier dan menagih per request, jadi batasnya berupa anggaran, bukan rate limit.

Foto oleh Ed Poor at English Wikipedia via Wikimedia Commons (CC BY-SA 3.0)
Ringkasan Utama
Threads melaporkan 400 juta monthly active users dan mencantumkan bahasa Indonesia di antara bahasa yang didukung, sementara X sama sekali tidak mengumumkan angka akun aktif. Tidak ada satu pun angka itu yang memberi tahu di mana tulisan teknis Anda dibaca. Beri tag utm_source pada setiap link, terbitkan ke kedua platform selama periode tetap, lalu biarkan analytics Anda sendiri yang memutuskan.
Semua tulisan di sini saya terbitkan dalam dua bahasa, dan selama beberapa waktu setiap tulisan saya bagikan ke Threads dan ke X dalam rentang lima menit yang sama, dengan link yang sama pula. Lalu seseorang bertanya platform mana yang sebenarnya sepadan dengan usahanya, dan saya sadar saya sendiri sudah membuat pertanyaan itu mustahil dijawab. Kedua link itu identik, jadi analytics saya hanya punya satu baris padahal butuh dua.
Tulisan ini membandingkan Threads dan X sebagai distribution channel untuk tulisan teknis yang menyasar pembaca Indonesia. Semua yang saya sebut sebagai fakta platform berasal dari dokumentasi resmi platform tersebut dan dicantumkan sumbernya di bagian bawah halaman. Semua yang menyangkut reach — reach saya maupun Anda — adalah pengukuran yang cara menjalankannya saya jelaskan, karena tidak satu pun platform memberikan data yang bisa menyelesaikannya kepada orang luar.
Mulailah dari satu-satunya angka yang tampak sebanding, lalu perhatikan bahwa angka itu sebenarnya tidak sebanding. Threads dilaporkan mencapai 400 juta monthly active users pada Agustus 2025 dan mencantumkan bahasa Indonesia sebagai salah satu dari 31 bahasa yang didukung. X tidak pernah mengumumkan angka akun aktif sejak perusahaannya menjadi privat; angka yang beredar, misalnya 600 juta monthly active users pada Mei 2024, adalah pernyataan pemilik, bukan hasil yang dilaporkan, dan literatur rujukannya menyebut terang-terangan bahwa estimasi bervariasi karena perusahaan itu tidak mempublikasikan statistik akun aktif.
Ketimpangan itu lebih penting daripada selisih angkanya. Angka yang tidak bisa Anda audit bukanlah bukti dalam sebuah keputusan, melainkan bahan obrolan. Dan angka yang bisa diaudit pun bentuknya salah untuk pertanyaan ini: 400 juta monthly active users di seluruh dunia tidak mengatakan apa pun tentang berapa banyak developer Indonesia yang membaca tulisan soal NestJS interceptor pada Selasa pagi.
Karena itu saya berhenti menganggap ukuran audiens sebagai sumbu yang menarik. Fakta publik yang berguna justru yang bersifat mekanis — berapa panjang sebuah post, berapa banyak link yang boleh dimuat, berapa biaya satu API call, dan metrik apa yang bisa ditarik kembali. Semuanya terdokumentasi, bertanggal, bisa diperiksa, dan semuanya mengubah apa yang bisa Anda bangun di atas tiap platform.
Berikut yang benar-benar dipublikasikan tentang masing-masing platform, dibatasi pada sumbu yang mengubah perilaku sebuah tulisan teknis. Setiap sel merujuk ke sumber di bagian bawah tulisan ini, dan bila sebuah platform tidak mempublikasikan apa pun, selnya menyatakan hal itu alih-alih menambal celah dengan estimasi.
| Yang berbeda | Threads | X |
|---|---|---|
| Ukuran audiens yang diumumkan | 400 juta monthly active users, dilaporkan Agustus 2025 | Tidak ada laporan sejak perusahaan menjadi privat; 600 juta monthly active users pada Mei 2024 adalah pernyataan pemilik |
| Ketersediaan bahasa Indonesia | Bahasa Indonesia salah satu dari 31 bahasa yang didukung; rincian per negara tidak dipublikasikan | Tidak ada publikasi soal komposisi bahasa maupun negara |
| Panjang post | 500 karakter per post untuk semua orang; argumen panjang harus dirantai | 280 karakter sebagai standar; sampai 4.000 karakter untuk subscriber berbayar sejak 2023 |
| Link di dalam post | Maksimal 5 link; link pertama menjadi link attachment | Link diizinkan, dan memposting link lewat API dihitung terpisah dari post tanpa link |
| Akses write API | 250 post, 1.000 reply dan 100 penghapusan per profil per 24 jam berjalan | Kredit pay-per-usage tanpa free tier yang terdokumentasi: $0.015 per post, $0.200 per post yang memuat URL |
| Membaca kembali angka Anda sendiri | Insights API mengembalikan views, likes, replies, reposts, quotes, shares dan profile clicks, tanpa riwayat sebelum 13 April 2024 | Pembacaan post ditagih $0.005 per resource, dibatasi 3 juta per siklus tagihan bulanan |
Baca dua baris terakhir itu bersamaan dan perbedaan praktisnya bukan soal reach, melainkan soal biaya instrumentasi. Di Threads, menerbitkan post lalu menanyakan hasilnya adalah dua permukaan API yang gratis. Di X, loop yang sama datang dengan daftar harga, dan baris yang paling terasa adalah yang menagih tiga belas kali lipat untuk post yang memuat link — yaitu setiap post yang mengarah ke sebuah artikel.
Setiap diskusi soal tulisan teknis di X berakhir pada klaim yang sama: link ditekan jangkauannya. Saya tidak bisa memverifikasi itu dan Anda pun tidak, karena perilaku ranking tidak dipublikasikan dan turunnya reach Anda punya belasan penjelasan lain sebelum perlu menyalahkan algoritma. Yang bisa saya tunjuk adalah angka publik yang berdiri di sebelahnya dan sering tertukar dengannya. Daftar harga X sendiri menagih $0.015 untuk membuat sebuah post dan $0.200 untuk membuat post yang memuat URL.
Itu fakta tentang penagihan, bukan tentang timeline. Angka itu memberi tahu berapa biaya memposting link secara otomatis; ia tidak mengatakan apa pun tentang efek link terhadap distribusi. Threads mendokumentasikan sisinya dengan cara berbeda: satu text post boleh memuat sampai lima link, dan link pertama di dalam post itu menjadi link attachment. Itu aturan format, bukan aturan ranking, dan konsekuensi praktisnya satu — taruh canonical URL paling depan, karena apa pun yang Anda cantumkan sesudahnya tidak akan mendapat preview card.
Jangan mengubah harga API $0.200 menjadi klaim tentang reach. Itu adalah tagihan X untuk satu post otomatis yang memuat URL, tidak lebih. Menyajikan baris tagihan sebagai bukti penekanan algoritmik persis merupakan langkah yang membuat perbandingan platform tidak layak dipercaya, dan itu langkah yang nyaris saya ambil di draf pertama tulisan ini.
Argumen teknis jarang muat di dalam preview. Pertanyaannya adalah apa yang dipaksakan tiap platform untuk mengatasi itu, dan dua jawabannya benar-benar berbeda, bukan sekadar berbeda tampilan.
Pada praktiknya saya berhenti menulis rantai. Rantai adalah taruhan bahwa pembaca akan terus mengetuk, dan ketika muatan sebenarnya berupa artikel 2.000 kata, rantai itu justru bersaing dengan artikelnya sendiri untuk perhatian yang sama. Satu paragraf yang menyatakan temuannya, ditambah satu link, ternyata lebih mudah ditulis, lebih mudah diterjemahkan, dan jauh lebih mudah diukur — dan bagian itulah inti tulisan ini.

Ini sumbu yang paling ingin saya punya datanya dan paling sedikit saya miliki. Kedua platform memutuskan lebih awal: sebuah post mengumpulkan sebagian besar impression dalam jendela pendek setelah terbit, dan apa yang terjadi di dalam jendela itu — ada tidaknya reply, ada tidaknya repost — menentukan apakah post itu keluar dari follower graph Anda sendiri. Bentuk peluruhannya, dan ukuran sebenarnya jendela itu, tidak dipublikasikan oleh keduanya.
Jadi saya memperlakukannya sebagai variabel yang saya kendalikan, bukan konstanta yang saya cari. Waktu posting sepenuhnya milik saya, dan post yang sama pada pukul 08:00 WIB dan pada pukul 21:00 menjangkau orang yang berbeda, terlepas dari ada atau tidaknya ranking model. Reply sebagian juga bisa saya undang. Dari pengalaman saya sendiri, post yang ditutup dengan pertanyaan sungguhan jauh lebih sering mendapat reply pertama dibanding post yang ditutup dengan link — itu kesan, bukan pengukuran, dan sekarang ia masuk daftar hal yang alat ukurnya sudah saya siapkan.
Menerbitkan dalam dua bahasa berarti menulis empat social post per artikel, jadi otomatisasi cepat sekali berhenti menjadi pilihan. Di titik ini kedua platform menyimpang tajam, dan penyimpangannya terdokumentasi, bukan disimpulkan sendiri.
// Cross-posting one blog link to both platforms. The shapes differ more than
// the code does: Threads is two calls and a documented daily ceiling, X is one
// call and a documented per-request price.
const THREADS_BASE = "https://graph.threads.net/v1.0/";
// 1. Create the container. Text posts cap at 500 characters, and the API
// accepts up to 5 links — the FIRST one becomes the link attachment, so
// put the canonical URL first and the reading list afterwards.
const create = await fetch(
THREADS_BASE + threadsUserId + "/threads?" +
new URLSearchParams({
media_type: "TEXT",
text: summary + "\n\n" + taggedUrl,
access_token: threadsToken,
}),
{ method: "POST" },
).then((r) => r.json());
// 2. Publish it. Counted against 250 posts / 1,000 replies per profile
// per rolling 24 hours — check GET /threads_publishing_limit before a batch.
await fetch(
THREADS_BASE + threadsUserId + "/threads_publish?" +
new URLSearchParams({ creation_id: create.id, access_token: threadsToken }),
{ method: "POST" },
);
// X is one call, but the published price list bills the two cases separately:
// Post creation ......... $0.015
// Post with URL ......... $0.200 <- the same post, with a link, is 13x
// Budget for the link, not for the post.
await fetch("https://api.x.com/2/tweets", {
method: "POST",
headers: {
Authorization: "Bearer " + xToken,
"Content-Type": "application/json",
},
body: JSON.stringify({ text: summary + " " + taggedUrl }),
});Sisi Threads dibatasi rate limit tetapi gratis saat dipakai, dan ia menyediakan endpoint publishing limit sehingga batch job bisa mengecek sisa kuotanya sebelum mulai, bukan menemukan plafonnya di tengah jalan. Sisi X tidak mendokumentasikan free tier: yang ada adalah kredit pay-per-usage, dibatasi tiga juta pembacaan post per siklus tagihan bulanan, dan harga write-nya memisahkan post biasa dari post yang memuat URL. Untuk blog pribadi nominalnya kecil. Intinya, otomatisasi di satu platform adalah persoalan rate limit dan di platform lain adalah pos anggaran, dan perbedaan itulah yang menentukan bagaimana Anda membangun job-nya.

Semua di atas adalah konteks. Bagian inilah yang menjawab judulnya, dan ia hanya menjawab untuk satu orang pada satu waktu. Beri tag pada link, terbitkan ke kedua platform selama periode tetap, lalu baca analytics Anda sendiri. Pemberian tag itulah kuncinya, karena data referrer yang datang dari in-app browser di ponsel tidak bisa diandalkan, dan kedua platform membuka link di dalamnya.
// Never type utm_source by hand. One capital letter — "X" instead of "x" —
// splits the channel into two rows in GA4, and you lose an evening looking
// for the half of the traffic that was never missing.
const CHANNELS = ["threads", "x"] as const;
type Channel = (typeof CHANNELS)[number];
const SITE = "https://www.matthewswong.com";
export function shareUrl(slug: string, locale: "en" | "id", ch: Channel) {
const url = new URL("/" + locale + "/blog/" + slug, SITE);
url.searchParams.set("utm_source", ch); // threads | x
url.searchParams.set("utm_medium", "social"); // constant, so the two rows sort together
url.searchParams.set("utm_campaign", slug); // the post, so it compares with itself
url.searchParams.set("utm_content", locale); // which language pulled the click
return url.toString();
}
shareUrl("threads-vs-x-developer-audience-indonesia", "id", "threads");
// https://www.matthewswong.com/id/blog/threads-vs-x-developer-audience-indonesia
// ?utm_source=threads&utm_medium=social
// &utm_campaign=threads-vs-x-developer-audience-indonesia&utm_content=idLalu jalankan sebagai eksperimen, bukan sebagai kebiasaan:
# One line per published post, appended the moment you press post.
# Without this file the analytics rows have no denominator: 40 sessions from
# Threads means nothing until you know it came from 12 posts, not 2.
# posts.csv
date,slug,locale,channel,posted_at_wib,shape,first_line_chars
2026-09-19,threads-vs-x-developer-audience-indonesia,id,threads,08:05,single,118
2026-09-19,threads-vs-x-developer-audience-indonesia,id,x,08:05,thread,131
2026-09-21,duckdb-in-process-analytics,en,threads,21:40,single,96
2026-09-21,duckdb-in-process-analytics,en,x,21:40,single,96
# Then read sessions by utm_source in GA4 over the same window, and divide.
# Anything under about twenty posts per platform is an anecdote, not a result.Dua catatan jujur. Dua puluh post per platform adalah sampel kecil dan satu artikel yang populer akan mendominasinya, jadi bacalah post median, bukan totalnya. Dan jawabannya punya masa berlaku: ia menggambarkan tiga puluh hari itu, di akun itu, dengan post-post itu, bukan platformnya secara umum. Saya menjalankannya ulang alih-alih mengutip hasil lama saya sendiri, dan itu juga alasan tulisan ini memberi Anda metodenya, bukan angka saya.
Set utm_medium ke nilai yang sama di kedua platform dan utm_campaign ke slug tulisannya. Satu view di analytics kemudian menjawab dua pertanyaan yang benar-benar Anda punya — platform mana yang mengirim lebih banyak pembaca, dan tulisan mana yang menyebar — tanpa perlu membuat laporan kedua.
Tidak ada pemenang di sini, dan tulisan yang menyebut satu pemenang sebenarnya sedang menjual tebakannya sendiri. Yang dipublikasikan memang berbeda: Threads memberi Anda angka audiens yang dilaporkan, plafon 500 karakter, lima link per post, dan endpoint insights yang gratis, sementara X memberi post yang lebih panjang lewat langganan, sama sekali tanpa angka audiens, dan daftar harga yang membuat link lebih mahal daripada post yang memuatnya. Selebihnya, termasuk pertanyaan di judul, adalah eksperimen tiga puluh hari dengan utm_source di ujung setiap link.
Sumber