Fix gtag Config Tidak Jalan: dataLayer.push(arguments)
gtag config tidak jalan padahal gtag.js ke-load? Helper yang push array, bukan arguments, bikin hit nggak terkirim. Gue tes 4 varian, plus fix dan unit test.

Kalau gtag.js udah ke-load tapi gtag('config') nggak pernah ngirim hit, cek dulu apa yang di-push sama helper gtag buatan lo ke dataLayer. Yang harus di-push itu objek arguments milik fungsinya. Kalau lo push array biasa dengan isi yang persis sama, gtag.js tetap ke-load dengan status 200, tapi command config-nya diabaikan dan nggak ada hit yang keluar dari browser.
Gue ketemu bug ini pas mindahin instalasi Google Analytics manual dari HTML head ke kode aplikasi. Di bawah ini ada fix satu barisnya, empat varian helper yang gue tes di Chrome, dan unit test biar bug ini nggak balik lagi.
Fix Cepat: Push Objek arguments
Pakai helper bawaan Google persis seperti yang dipublikasikan, jangan di-”modernisasi”.
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "G-XXXXXXXXXX");Ada dua aturan. Helper-nya harus fungsi biasa, bukan arrow function, dan yang di-push harus arguments itu sendiri, bukan salinannya. Salinan lewat Array.prototype.slice.call(arguments) atau parameter rest ...args itu array, dan bentuk itulah yang gagal.
Yang Gue Tes
Gue bikin satu halaman HTML yang me-load gtag.js asli dari googletagmanager.com dengan measurement ID palsu, G-TESTFAKE01, jadi nggak ada hit yang nyasar ke property asli. Yang berubah antar-run cuma helper-nya. Gue pakai Chrome 154 di macOS, lalu baca window.dataLayer dan panel Network.
| Varian helper | Tipe tiap entri gtag() | Request gtag.js | Request ke g/collect |
|---|---|---|---|
dataLayer.push(arguments) | [object Arguments] | 200 | POST, 204 |
dataLayer.push(Array.prototype.slice.call(arguments)) | [object Array] | 200 | nggak ada setelah 3 detik |
function gtag(...args) { dataLayer.push(args); } | [object Array] | 200 | nggak ada setelah 8 detik |
arrow function yang pakai arguments | nggak ada yang ter-queue | 200 | nggak relevan |
Kolom tipe diambil dari Object.prototype.toString.call(entry) untuk setiap item di dataLayer. Di run yang jalan, gtag.js juga nambahin dua entri objek biasa sendiri setelah ke-load, dan itu normal.
Gagalnya diam-diam. Push array ke dataLayer itu JavaScript yang valid, jadi nggak ada yang throw, dan tag script-nya sendiri kelihatan sehat di panel Network. Lo baru sadar kalau hit-nya nggak muncul.
Kenapa Array Diabaikan
Dokumentasi Google cuma pernah nunjukin dataLayer.push(arguments). API template Tag Manager createArgumentsQueue didokumentasikan sebagai fungsi yang nge-push objek arguments ke array. Google nggak mendokumentasikan apa yang terjadi kalau yang di-push array, jadi bagian ini cuma bacaan gue atas hasil tes, bukan kutipan.
Isi dataLayer ada dua jenis. Objek biasa kayak { event: "purchase" } itu buat trigger Tag Manager. Entri command dari gtag() dimaksudkan sebagai objek Arguments. Dugaan gue, pembaca antriannya pakai bentuk entri buat membedakan keduanya, jadi array nggak cocok ke yang mana pun dan di-skip. Hasil pengamatannya solid. Penjelasannya cuma dugaan.
Jebakan Arrow Function
Arrow function nggak punya arguments sendiri. Nulis ulang snippet Google jadi const gtag = () => { dataLayer.push(arguments); } itu cara gampang buat ngerusaknya pas “beres-beres” kode.
Di level atas classic script gue, versi itu throw ReferenceError: arguments is not defined, dan dataLayer cuma berisi dua objek biasa dari gtag.js. Kalau ada di dalam fungsi lain, arrow bakal ngambil arguments milik fungsi luar itu tanpa error apa pun, ini murni aturan scope JavaScript dan lebih susah dilihat. Jalur aman di TypeScript: fungsi biasa plus komentar lint.
Cara Verifikasi di DevTools
Lo bisa konfirmasi fix-nya dalam semenit.
- Buka panel Network, centang Preserve log, lalu filter
collect. Kalau flow lo redirect user pergi tepat setelah analytics di-load, halamannya keburu hilang sebelum sempat lo lihat, dan Preserve log nahan request-nya tetap kelihatan. - Jalanin ini di console setelah halaman ke-load.
dataLayer.map((entry) => Object.prototype.toString.call(entry));- Setiap entri dari
gtag()harus kebaca[object Arguments]. Kalau ada[object Array]di daftar itu, itu bug-nya.
Kalau lo pakai measurement ID asli, laporan Realtime GA4 dan DebugView bisa mengonfirmasi hit-nya dari sisi Google. Cek Network lebih cepat dan nggak butuh property asli.
Unit Test yang Nangkep Bug Ini
Bug ini nggak kelihatan saat runtime, jadi test adalah penjaga paling murah. Test ini ngecek tipe setiap entri di antrian, dan juga membuktikan pengecekannya memang gagal buat versi array. Gue jalanin di Bun 1.3.1.
import { afterEach, describe, expect, test } from "bun:test";
import { installGtag, type GtagWindow } from "./analytics";
const tagOf = (value: unknown) => Object.prototype.toString.call(value);
describe("gtag dataLayer queue", () => {
let win: GtagWindow;
afterEach(() => {
win = { dataLayer: [] };
});
test("every gtag() call is queued as an Arguments object", () => {
win = { dataLayer: [] };
installGtag(win);
win.gtag!("js", new Date());
win.gtag!("config", "G-TESTFAKE01");
expect(win.dataLayer).toHaveLength(2);
for (const entry of win.dataLayer) {
expect(tagOf(entry)).toBe("[object Arguments]");
}
});
test("catches the array regression", () => {
win = { dataLayer: [] };
win.gtag = (...args: unknown[]) => {
win.dataLayer.push(args);
};
win.gtag("config", "G-TESTFAKE01");
expect(tagOf(win.dataLayer[0])).toBe("[object Array]");
expect(tagOf(win.dataLayer[0])).not.toBe("[object Arguments]");
});
});Helper yang dites itu function declaration yang sama dengan fix cepat di atas, dibungkus installGtag(win) biar test bisa kasih window palsu. Outputnya 2 pass, 0 fail, 5 expect() calls.
Satu pelajaran lagi dari project yang sama. Kalau test lo nanem tag script gtag.js di DOM, hapus tag itu dan reset dataLayer di afterEach. Tag script yang bocor bikin satu test gue lolos kalau dijalanin sendiri tapi gagal di bun test --randomize, dan munculnya di seed 1 dan 3. Kalau lo mau gambaran singkat soal test runner-nya, gue udah bandingin sama Node dan Deno di Bun vs Node.js vs Deno: Perbandingan Runtime 2026.
Penyebab Lain gtag Config Tidak Jalan
Kalau helper lo udah push arguments, cek daftar ini satu-satu.
- Ada objek situs bernama
dataLayeryang menggantikan array-nya. Thread Adobe Experience League melacakdataLayer.push is not a functionke penyebab persis itu. Ganti nama objek kustomnya. - Ada kode yang me-reassign
window.dataLayersetelah snippet jalan. Simo Ahava menjelaskan bahwa mendefinisikan ulang setelah GTM ke-load merusak hook GTM dipush(). Selalu pakaiwindow.dataLayer = window.dataLayer || []. - Urutan command salah. Bantuan diagnostik Google punya peringatan “Config command out of order” kalau sebuah event jalan sebelum config command-nya.
- CSP atau ad blocker menghentikan script-nya. Yang ini muncul sebagai error di console atau network, dan sisi CSP-nya sudah gue bahas di Patch RCE Next.js 2026: Update Dulu, Baru Kunci CSP.
- Snippet container Tag Manager dan baris config standalone ada di satu halaman. ppc.land melaporkan release note Google Tag Manager awal Oktober 2026 yang bilang container gtm.js sekarang diinisialisasi tanpa peduli ada atau nggaknya command
gtag('config'), dan command config muncul di dataLayer sebagai eventgtag.config. Itu masalah yang beda dari yang dibahas di sini, karena di kasus ini command config-nya sama sekali nggak dikenali. Sumber-sumbernya beda soal tanggal pastinya, jadi baca release note asli Google sebelum lo ubah apa pun.
Kalau lo cuma mau bawa satu hal dari post ini, salin helper Google apa adanya dan taruh test tipe di sebelahnya. Baru ubah helper-nya kalau ada test yang ngawasin antriannya.
![shadcn ScrollArea Gak Bisa Scroll di Dialog: Cara Fix [2026]](https://cdn.asepalazhari.com/images/articles/web-development/shadcn-scrollarea-not-scrolling-dialog-fix.jpeg)

