Mengonfigurasi peristiwa pengguna

Halaman ini menjelaskan objek peristiwa pengguna, termasuk mencantumkan potensi jenis peristiwa pengguna, dan memberikan contoh data untuk semua jenis peristiwa pengguna.

Untuk mengonfigurasi peristiwa pengguna:

  1. Mengimpor peristiwa pengguna historis.

  2. Merekam peristiwa pengguna live.

  3. Beri tag pada peristiwa pengguna dengan entity.

  4. Tandai peristiwa pengguna dengan token atribusi.

Vertex AI Search untuk retail menggunakan peristiwa pengguna real-time untuk menghasilkan rekomendasi dan hasil penelusuran. Saat Anda mengupload data, rekomendasi dan penelusuran dapat menggunakan data tersebut, sehingga Anda tidak perlu mengupload peristiwa yang sama dua kali jika menggunakan kedua layanan tersebut.

Untuk mendapatkan bantuan dalam merekam peristiwa pengguna, lihat Merekam peristiwa pengguna real-time.

Jenis peristiwa pengguna

Ada beberapa jenis peristiwa pengguna yang dapat Anda catat saat pengguna menjelajahi situs retail Anda:

Nama peristiwa pengguna Tindakan pengguna
add-to-cart Menambahkan produk ke keranjang.
category-page-view Melihat halaman khusus, seperti halaman promo atau diskon.
detail-page-view Melihat halaman detail produk.
home-page-view Melihat halaman beranda.
purchase-complete Menyelesaikan checkout.
search Menelusuri katalog.
shopping-cart-page-view Melihat keranjang belanja.

Untuk informasi mendetail tentang objek UserEvent, lihat UserEvent.

Prioritas jenis peristiwa

Untuk hasil dengan kualitas terbaik, sebaiknya rekam peristiwa pengguna untuk semua jenis peristiwa. Tabel berikut menjelaskan prioritas berbagai jenis peristiwa pengguna. Anda harus mencatat peristiwa pengguna dengan prioritas tertinggi untuk mendapatkan model data yang berkualitas.

Prioritas Peristiwa Pengguna
Diperlukan untuk eksperimen live awal

add-to-cart

detail-page-view

purchase-complete

home-page-view (untuk rekomendasi)

search (untuk penelusuran)

Penting untuk meningkatkan kualitas model rekomendasi dari waktu ke waktu

category-page-view

search

shopping-cart-page-view

Persyaratan dan praktik terbaik peristiwa pengguna

Tabel berikut mencantumkan persyaratan dan praktik terbaik untuk jenis peristiwa pengguna yang digunakan rekomendasi dan penelusuran. Pastikan peristiwa pengguna Anda memenuhi persyaratan ini sehingga Vertex AI Search untuk retail dapat menghasilkan hasil berkualitas.

Bagian ini mencantumkan:

Jika Anda menggunakan model rekomendasi, lihat juga Persyaratan data jenis model, yang mencantumkan persyaratan tambahan bergantung pada jenis model rekomendasi dan tujuan pengoptimalan yang Anda rencanakan untuk digunakan.

Anda dapat melihat metrik kualitas data untuk penelusuran di halaman Kualitas data di konsol Penelusuran untuk Retail. Metrik ini menunjukkan persentase produk dan peristiwa pengguna yang memenuhi standar kualitas data yang direkomendasikan. Untuk mengetahui informasi tentang cara melihat kualitas data penelusuran, lihat Memanfaatkan tingkat performa penelusuran.

Persyaratan untuk peristiwa pengguna

Pastikan peristiwa pengguna Anda memenuhi persyaratan berikut agar Vertex AI Search untuk retail dapat menghasilkan hasil berkualitas. Hal ini berlaku untuk rekomendasi dan penelusuran.

Jenis peristiwa Persyaratan Dampak
Semua acara

Jangan sertakan data sintetis atau peristiwa duplikat.

Peristiwa sintetis atau duplikat berdampak negatif pada kualitas model dan sering kali mencegah pelatihan model yang berhasil. Peristiwa duplikat dapat menyebabkan nilai metrik yang salah.

Sertakan minimal 100 ID pengunjung unik untuk setiap jenis peristiwa yang ditransfer.

Hal ini memastikan Vertex AI Search untuk retail memiliki cukup data untuk menghasilkan hasil berkualitas.

ID pengunjung harus diformat sama persis di seluruh impor peristiwa atau perekaman peristiwa dan dalam permintaan API.

Menggunakan format yang konsisten untuk ID pengunjung membantu mengidentifikasi pola pengunjung dengan benar dan memberikan hasil berkualitas lebih baik berdasarkan perilaku pengguna.

Produk yang disertakan dalam acara harus ada di katalog produk Anda.

Rasio peristiwa yang tidak bergabung harus dijaga serendah mungkin. Rasio yang tinggi dapat berdampak negatif pada kualitas rekomendasi atau hasil penelusuran.

Data peristiwa yang tidak digabungkan tidak digunakan untuk melatih model. Namun, peristiwa yang tidak digabungkan dapat digabungkan nanti, setelah produk terkait telah diserap. Untuk mengetahui informasi selengkapnya, lihat Bergabung kembali ke peristiwa pengguna.

Beberapa peristiwa pengguna harus memiliki ID pengunjung yang sama.

Untuk membuat histori urutan perilaku yang valid, Vertex AI Search untuk retail harus dapat melihat beberapa peristiwa dengan ID pengunjung yang sama.

Misalnya, visitor123 telah melihat lima halaman detail produk, menambahkan tiga produk ke keranjangnya, lalu membeli dua dari lima produk asli. Jika semua peristiwa ini memberikan ID pengunjung yang sama dan diformat secara konsisten, Vertex AI Search untuk retail dapat mempertimbangkan urutan perilaku tersebut dalam modelnya.

detail-page-view

Sertakan tepat satu produk per peristiwa.

Peristiwa tidak dapat digunakan jika tidak ada produk. Jika beberapa produk disertakan, peristiwa akan salah format dan tidak dapat digunakan.

add-to-cart

Sertakan tepat satu produk per peristiwa.

Jika beberapa produk disertakan, peristiwa akan salah format dan tidak dapat digunakan.

purchase-complete

Sertakan purchase_transaction.revenue.

Peristiwa purchase-complete yang tidak memiliki kolom revenue tidak digunakan untuk melatih model.

Sertakan tepat satu purchase_transaction.currency_code di semua peristiwa pembelian.

Tidak ada kode mata uang default; kode harus diberikan.

Peristiwa pembelian tanpa kolom ini akan menghasilkan metrik pendapatan yang salah.

Pastikan beberapa peristiwa pembelian menyertakan beberapa produk.

Memiliki beberapa peristiwa pembelian dengan beberapa produk akan membantu model mempelajari pola pembelian bersama.

Persyaratan khusus rekomendasi

Jika Anda menggunakan rekomendasi, pastikan peristiwa pengguna Anda memenuhi persyaratan berikut.

Jika Anda menggunakan model rekomendasi, lihat juga Persyaratan data jenis model, yang mencantumkan persyaratan tambahan bergantung pada jenis model rekomendasi dan tujuan pengoptimalan yang Anda rencanakan untuk digunakan.

Jenis peristiwa Persyaratan Dampak
purchase-complete

Jangan gabungkan keranjang multi-item menjadi beberapa peristiwa pembelian. Peristiwa tersebut harus tetap sebagai satu peristiwa pembelian yang menyertakan beberapa produk.

Hal ini memastikan bahwa pola pembelian bersama yang valid dihasilkan.

Persyaratan penelusuran

Jika Anda menggunakan penelusuran, pastikan peristiwa pengguna Anda memenuhi persyaratan minimum berikut untuk mendapatkan hasil.

Jenis peristiwa Persyaratan Dampak
search

searchQuery harus ada untuk peristiwa penelusuran, dan pageCategories harus ada untuk peristiwa penjelajahan.

Tidak menyertakan kolom ini dapat berdampak negatif yang serius terhadap kualitas dan metrik hasil penelusuran.

ID pengunjung dalam permintaan penelusuran harus cocok dengan ID pengunjung yang dikirim dalam peristiwa yang terkait dengan permintaan penelusuran tersebut.

Jika tidak cocok, peristiwa akan salah format dan metrik dapat salah.

Daftar ID produk dalam peristiwa penelusuran harus cocok dengan daftar produk yang ditampilkan kepada pengguna secara keseluruhan.

Jika tidak cocok, dampak negatif terhadap kualitas hasil penelusuran dapat parah, dan metrik akan salah.

Jika penelusuran menggunakan filter, filter harus ada dan diuraikan dengan benar.

Jika kolom ini tidak ada, Vertex AI Search untuk retail tidak dapat menggunakan bagian filter data, yang dapat berdampak negatif pada kualitas hasil penelusuran.

Sertakan kolom attribution_token untuk menautkan peristiwa lain kembali ke peristiwa penelusuran.

Tidak menyertakan token atribusi akan memicu error di Penelusuran untuk Retail dan memiliki dampak negatif yang parah terhadap kualitas penelusuran dan akurasi metrik.

Persyaratan pengoptimalan penelusuran

Agar penelusuran dapat otomatis mengoptimalkan pengalaman penelusuran berdasarkan tren pengguna secara keseluruhan, upload data berikut.

Peristiwa harus diupload minimal setiap hari dengan jeda maksimum 24 jam.

Metrik peristiwa Volume/frekuensi peristiwa Deskripsi
Volume peristiwa search 250 ribu dalam 90 hari terakhir

Setidaknya 250.000 peristiwa dalam 90 hari terakhir diperlukan untuk mengoptimalkan pengalaman penelusuran berdasarkan peristiwa yang diserap.

Sebaiknya upload peristiwa minimal setiap hari untuk mempertahankan kualitas data yang baik. Selama impor peristiwa historis, pastikan distribusi data condong ke stempel waktu terbaru. Jumlah peristiwa pada hari stempel waktu terakhir harus sama dengan atau lebih besar dari jumlah peristiwa harian rata-rata.

Volume detail-page-view yang diatribusikan ke peristiwa search 500.000 dalam 30 hari terakhir Setidaknya 500.000 peristiwa diperlukan untuk mengoptimalkan hasil penelusuran menggunakan peristiwa pengguna.
Peristiwa detail-page-view rata-rata yang dapat diatribusikan ke peristiwa search per produk 10 dalam 30 hari terakhir Wajib untuk mengoptimalkan hasil penelusuran menggunakan peristiwa yang ditransfer kecuali jika peristiwa selama 21 hari terakhir diupload.
Proporsi peristiwa search dengan filter yang dapat diuraikan 0,1 dalam 30 hari terakhir Direkomendasikan untuk mengoptimalkan urutan aspek dinamis dalam respons penelusuran.
Proporsi produk yang ditelusuri dengan harga 0,95 dalam 30 hari terakhir Wajib untuk mengoptimalkan hasil penelusuran menggunakan peristiwa yang ditransfer.
Peristiwa add-to-cart rata-rata yang dapat diatribusikan ke peristiwa search per produk bertarif 0,5 dalam 30 hari terakhir Direkomendasikan untuk hasil penelusuran yang dioptimalkan untuk pendapatan.
Peristiwa purchase-complete rata-rata yang dapat diatribusikan ke peristiwa search per produk bertarif yang dapat ditelusuri 0,5 dalam 30 hari terakhir Direkomendasikan untuk hasil penelusuran yang dioptimalkan untuk pendapatan.

Persyaratan personalisasi penelusuran

Penelusuran memerlukan data berikut untuk mempersonalisasi penelusuran teks dan menjelajahi hasil penelusuran untuk pengguna Anda berdasarkan aktivitas mereka.

Setelah Anda mengupload data berikut, penelusuran dapat mempersonalisasi hasil secara otomatis.

Metrik peristiwa Volume/frekuensi peristiwa Deskripsi
Volume peristiwa search yang ditayangkan oleh penelusuran 100.000 dalam 30 hari terakhir

Setidaknya 100.000 peristiwa yang ditayangkan oleh penelusuran dalam 30 hari terakhir diperlukan untuk memberikan personalisasi.

hasil penelusuran tidak di-cache Kurang dari 1% dari 100.000 peristiwa pengguna terbaru

Jangan menyimpan hasil penelusuran dalam cache untuk penelusuran teks atau penelusuran jelajah jika Anda berencana menggunakan personalisasi. Menggunakan kembali hasil yang sama di seluruh pengunjung akan mencegah penelusuran memberikan hasil yang benar-benar dipersonalisasi kepada pengguna tertentu dan berisiko mengekspos data pribadi pengguna. Penelusuran akan otomatis menonaktifkan personalisasi jika penyimpanan dalam cache terdeteksi.

Jika Anda hanya meng-cache hasil penelusuran, penelusuran masih dapat mempersonalisasi hasil penjelajahan. Sebaliknya, jika Anda hanya meng-cache hasil penelusuran, penelusuran tetap dapat mempersonalisasi hasil penelusuran kueri teks.

Kecocokan ID pengunjung antara SearchRequests dan peristiwa pengguna Lebih dari 10% kecocokan untuk 100.000 peristiwa pengguna terbaru Pastikan spasi dan format ID pengunjung cocok di seluruh peristiwa SearchRequests dan pengguna. Format ID pengunjung yang konsisten memastikan penelusuran dapat mengidentifikasi aktivitas pengguna dengan benar.

Contoh dan skema jenis peristiwa pengguna

Bagian ini memberikan format data untuk setiap jenis peristiwa yang didukung.

Contoh untuk Pixel JavaScript dan Tag Manager disediakan. Untuk BigQuery, skema tabel lengkap untuk setiap jenis disediakan.

Untuk semua jenis peristiwa pengguna, userId bersifat opsional. Kolom informasi produk (priceInfo dan availability) bersifat opsional.

Perhatikan bahwa:

  • Kolom experimentIds hanya diperlukan jika Anda menjalankan eksperimen A/B.
  • Kolom attributionToken hanya diperlukan untuk Vertex AI Search untuk retail. Metrik ini digunakan untuk mengukur performa. Peristiwa predict, search, dan detail-page-view yang dihasilkan dari klik harus memiliki token atribusi untuk menautkan peristiwa kembali ke penelusuran atau rekomendasi yang menghasilkannya.
  • Pastikan semua peristiwa Anda menggunakan satu mata uang, terutama jika Anda berencana menggunakan konsol Google Cloud untuk mendapatkan metrik pendapatan. Vertex AI Search untuk retail API tidak mendukung penggunaan beberapa mata uang per katalog.

Untuk mengetahui detail selengkapnya tentang objek peristiwa pengguna, lihat dokumentasi referensi UserEvent API.

Tambahkan ke keranjang

Berikut ini menunjukkan format peristiwa pengguna add-to-cart.

Objek tambahkan ke keranjang minimum yang diperlukan

Contoh berikut hanya menampilkan kolom yang diperlukan dari format peristiwa pengguna add-to-cart.

Saat mengimpor peristiwa, Anda harus memberikan stempel waktu di kolom eventTime dalam format yang ditentukan oleh RFC 3339.

Kolom lain mungkin diperlukan, bergantung pada metode API yang digunakan atau jika kolom tambahan digunakan. (Misalnya, jika peristiwa pengguna dikaitkan dengan entity, pastikan untuk menentukan kolom entity.) Untuk mengetahui detail lengkap setiap kolom dan kapan kolom tersebut diperlukan, lihat dokumentasi referensi API UserEvent.

Pixel JavaScript

var user_event = {
  "eventType": "add-to-cart",
  "visitorId": "visitor-id",
  "productDetails": [{
    "product": {
      "id": "product-id"
    },
    "quantity": { "value": product-quantity
  }]
};

Tag Manager

<script>
    dataLayer = dataLayer || [];
    dataLayer.push({
      'cloud_retail': {
        'eventType': 'add-to-cart',
        'visitorId': 'visitor-id',
        // You can also define the visitor ID
        // directly on the Tag Manager tag.
        'productDetails': [{
          'product': {
            'id': 'product-id'
          },
          'quantity': product-quantity
        }]
      }
    });
</script>

BigQuery

Ini adalah skema JSON lengkap untuk jenis peristiwa pengguna ini. Tentukan skema ini saat membuat tabel untuk jenis peristiwa pengguna ini di BigQuery.

Mode untuk kolom wajib diisi ditetapkan ke REQUIRED atau REPEATED. Mode untuk kolom opsional ditetapkan ke NULLABLE.

Perhatikan bahwa eventTime diperlukan untuk mengimpor peristiwa dengan BigQuery. eventTime adalah string dengan format Stempel Waktu.

[
 {
   "name": "eventType",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "visitorId",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "eventTime",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "experimentIds",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "attributionToken",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "productDetails",
   "type": "RECORD",
   "mode": "REPEATED",
   "fields": [
     {
       "name": "product",
       "type": "RECORD",
       "mode": "REQUIRED",
       "fields": [
         {
           "name": "id",
           "type": "STRING",
           "mode": "REQUIRED"
         }
       ]
     },
     {
       "name": "quantity",
       "type": "INTEGER",
       "mode": "REQUIRED"
     }
   ]
 },
 {
   "name": "cartId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "userInfo",
   "type": "RECORD",
   "mode": "NULLABLE",
   "fields": [
     {
       "name": "userId",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "ipAddress",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "userAgent",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "directUserRequest",
       "type": "BOOLEAN",
       "mode": "NULLABLE"
     }
   ]
 },
 {
   "name": "uri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "referrerUri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "pageViewId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "entity",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

Tampilan halaman kategori

Berikut ini menunjukkan format peristiwa pengguna category-page-view.

Objek penayangan halaman kategori minimum yang diperlukan

Contoh berikut hanya menampilkan kolom yang diperlukan dari format peristiwa pengguna category-page-view.

Meskipun biasanya hanya ada satu kategori yang terkait dengan halaman, kolom pageCategories juga mendukung hierarki kategori, yang dapat Anda berikan sebagai daftar.

Saat mengimpor peristiwa, Anda harus memberikan stempel waktu di kolom eventTime dalam format yang ditentukan oleh RFC 3339.

Kolom lain mungkin diperlukan, bergantung pada metode API yang digunakan atau jika kolom tambahan digunakan. (Misalnya, jika peristiwa pengguna dikaitkan dengan entity, pastikan untuk menentukan kolom entity.) Untuk mengetahui detail lengkap setiap kolom dan kapan kolom tersebut diperlukan, lihat dokumentasi referensi API UserEvent.

Pixel JavaScript

var user_event = {
  "eventType": "category-page-view",
  "visitorId": "visitor-id",
  "pageCategories": ["category1 > category2"]
};

Tag Manager

<script>
    dataLayer = dataLayer || [];
    dataLayer.push({
      'cloud_retail': {
        'eventType': 'category-page-view',
        'visitorId": 'visitor-id',
        // You can also define the user ID and visitor ID
        // directly on the Tag Manager tag.
        'pageCategories': ['category1 > category2']
      }
    });
</script>

BigQuery

Ini adalah skema JSON lengkap untuk jenis peristiwa pengguna ini. Tentukan skema ini saat membuat tabel untuk jenis peristiwa pengguna ini di BigQuery.

Mode untuk kolom wajib diisi ditetapkan ke REQUIRED atau REPEATED. Mode untuk kolom opsional ditetapkan ke NULLABLE.

Perhatikan bahwa eventTime diperlukan untuk mengimpor peristiwa dengan BigQuery. eventTime adalah string dengan format Stempel Waktu.

[
 {
   "name": "eventType",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "visitorId",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "eventTime",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "experimentIds",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "attributionToken",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "productDetails",
   "type": "RECORD",
   "mode": "REPEATED",
   "fields": [
     {
       "name": "product",
       "type": "RECORD",
       "mode": "REQUIRED",
       "fields": [
         {
           "name": "id",
           "type": "STRING",
           "mode": "REQUIRED"
         }
       ]
     }
   ]
 },
 {
   "name": "pageCategories",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "userInfo",
   "type": "RECORD",
   "mode": "NULLABLE",
   "fields": [
     {
       "name": "userId",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "ipAddress",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "userAgent",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "directUserRequest",
       "type": "BOOLEAN",
       "mode": "NULLABLE"
     }
   ]
 },
 {
   "name": "uri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "referrerUri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "pageViewId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "entity",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

Tampilan halaman detail

Berikut adalah format data peristiwa pengguna detail-page-view.

Objek tampilan halaman detail minimum yang diperlukan

Contoh berikut hanya menampilkan kolom yang diperlukan dari format peristiwa pengguna detail-page-view.

Pada umumnya, productDetails berisi detail untuk produk terkait, kecuali jika paket item dijual bersama.

Saat mengimpor peristiwa, Anda harus memberikan stempel waktu di kolom eventTime dalam format yang ditentukan oleh RFC 3339.

Kolom lain mungkin diperlukan, bergantung pada metode API yang digunakan atau jika kolom tambahan digunakan. (Misalnya, jika peristiwa pengguna dikaitkan dengan entity, pastikan untuk menentukan kolom entity.) Untuk mengetahui detail lengkap setiap kolom dan kapan kolom tersebut diperlukan, lihat dokumentasi referensi API UserEvent.

Pixel JavaScript

var user_event = {
  "eventType": "detail-page-view",
  "visitorId": "visitor-id",
  "productDetails": [{
    "product": {
      "id": "product-id"
    }
  }]
};

Tag Manager

<script>
    dataLayer = dataLayer || [];
    dataLayer.push({
      'cloud_retail': {
        'eventType': 'detail-page-view',
        'visitorId': 'visitor-id',
        // You can also define the visitor ID directly on
        // the Tag Manager tag.
        'productDetails': [{
          'product': {
            'id': 'product-id'
          }
        }]
      }
    });
</script>

BigQuery

Ini adalah skema JSON lengkap untuk jenis peristiwa pengguna ini. Tentukan skema ini saat membuat tabel untuk jenis peristiwa pengguna ini di BigQuery.

Mode untuk kolom wajib diisi ditetapkan ke REQUIRED atau REPEATED. Mode untuk kolom opsional ditetapkan ke NULLABLE.

Perhatikan bahwa eventTime diperlukan untuk mengimpor peristiwa dengan BigQuery. eventTime adalah string dengan format Stempel Waktu.

[
 {
   "name": "eventType",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "visitorId",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "eventTime",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "experimentIds",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "attributionToken",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "productDetails",
   "type": "RECORD",
   "mode": "REPEATED",
   "fields": [
     {
       "name": "product",
       "type": "RECORD",
       "mode": "REQUIRED",
       "fields": [
         {
           "name": "id",
           "type": "STRING",
           "mode": "REQUIRED"
         }
       ]
     }
   ]
 },
 {
   "name": "userInfo",
   "type": "RECORD",
   "mode": "NULLABLE",
   "fields": [
     {
       "name": "userId",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "ipAddress",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "userAgent",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "directUserRequest",
       "type": "BOOLEAN",
       "mode": "NULLABLE"
     }
   ]
 },
 {
   "name": "uri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "referrerUri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "pageViewId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "entity",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

Tampilan halaman beranda

Berikut ini menunjukkan format peristiwa pengguna home-page-view.

Objek tampilan halaman beranda minimum yang diperlukan

Contoh berikut hanya menampilkan kolom yang diperlukan dari format peristiwa pengguna home-page-view.

Saat mengimpor peristiwa, Anda harus memberikan stempel waktu di kolom eventTime dalam format yang ditentukan oleh RFC 3339.

Kolom lain mungkin diperlukan, bergantung pada metode API yang digunakan atau jika kolom tambahan digunakan. (Misalnya, jika peristiwa pengguna dikaitkan dengan entity, pastikan untuk menentukan kolom entity.) Untuk mengetahui detail lengkap setiap kolom dan kapan kolom tersebut diperlukan, lihat dokumentasi referensi API UserEvent.

Pixel JavaScript

var user_event = {
  "eventType": "home-page-view",
  "visitorId": "visitor-id",
};

Tag Manager

<script>
    dataLayer = dataLayer || [];
    dataLayer.push({
      'cloud_retail': {
        'eventType': 'home-page-view',
        'visitorId': 'visitor-id'
        // You can also define the visitor ID
        // directly on the Tag Manager tag.
      }
    });
</script>

BigQuery

Ini adalah skema JSON lengkap untuk jenis peristiwa pengguna ini. Tentukan skema ini saat membuat tabel untuk jenis peristiwa pengguna ini di BigQuery.

Mode untuk kolom wajib diisi ditetapkan ke REQUIRED atau REPEATED. Mode untuk kolom opsional ditetapkan ke NULLABLE.

Perhatikan bahwa eventTime diperlukan untuk mengimpor peristiwa dengan BigQuery. eventTime adalah string dengan format Stempel Waktu.

[
 {
   "name": "eventType",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "visitorId",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "eventTime",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "experimentIds",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "attributionToken",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "productDetails",
   "type": "RECORD",
   "mode": "REPEATED",
   "fields": [
     {
       "name": "product",
       "type": "RECORD",
       "mode": "REQUIRED",
       "fields": [
         {
           "name": "id",
           "type": "STRING",
           "mode": "REQUIRED"
         }
       ]
     },
     {
       "name": "quantity",
       "type": "INTEGER",
       "mode": "REQUIRED"
     }
   ]
 },
 {
   "name": "userInfo",
   "type": "RECORD",
   "mode": "NULLABLE",
   "fields": [
     {
       "name": "userId",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "ipAddress",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "userAgent",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "directUserRequest",
       "type": "BOOLEAN",
       "mode": "NULLABLE"
     }
   ]
 },
 {
   "name": "uri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "referrerUri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "pageViewId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "entity",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

Pembelian selesai

Berikut adalah format data peristiwa pengguna purchase-complete.

Objek pembelian selesai minimum yang diperlukan

Contoh berikut hanya menampilkan kolom yang diperlukan dari format peristiwa pengguna purchase-complete.

Saat mengimpor peristiwa, Anda harus memberikan stempel waktu di kolom eventTime dalam format yang ditentukan oleh RFC 3339.

Kolom lain mungkin diperlukan, bergantung pada metode API yang digunakan atau jika kolom tambahan digunakan. (Misalnya, jika peristiwa pengguna dikaitkan dengan entity, pastikan untuk menentukan kolom entity.) Untuk mengetahui detail lengkap setiap kolom dan kapan kolom tersebut diperlukan, lihat dokumentasi referensi API UserEvent.

Pixel JavaScript

var user_event = {
  "eventType": "purchase-complete",
  "visitorId": "visitor-id",
  "productDetails": [{
    "product": {
      "id": "product-id"
    },
    "quantity": product-quantity
  }],
  "purchaseTransaction": {
    "revenue": revenue,
    "currencyCode": "currency-code"
  }
};

Tag Manager

<script>
    dataLayer = dataLayer || [];
    dataLayer.push({
      'cloud_retail': {
        'eventType': 'purchase-complete',
        'visitorId': 'visitor-id',
        // You can also define the visitor id directly on
        // the Tag Manager tag.
        'productDetails': [{
          'product': {
            'id': 'product-id'
          },
          'quantity': product-quantity
        }],
        'purchaseTransaction': {
          'revenue': revenue,
          'currencyCode': 'currency-code'
        }
      }
    });
</script>

BigQuery

Ini adalah skema JSON lengkap untuk jenis peristiwa pengguna ini. Tentukan skema ini saat membuat tabel untuk jenis peristiwa pengguna ini di BigQuery.

Mode untuk kolom wajib diisi ditetapkan ke REQUIRED atau REPEATED. Mode untuk kolom opsional ditetapkan ke NULLABLE.

Perhatikan bahwa eventTime diperlukan untuk mengimpor peristiwa dengan BigQuery. eventTime adalah string dengan format Stempel Waktu.

[
 {
   "name": "eventType",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "visitorId",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "eventTime",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "experimentIds",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "attributionToken",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "productDetails",
   "type": "RECORD",
   "mode": "REPEATED",
   "fields": [
     {
       "name": "product",
       "type": "RECORD",
       "mode": "REQUIRED",
       "fields": [
         {
           "name": "id",
           "type": "STRING",
           "mode": "REQUIRED"
         },
         {
           "name": "priceInfo",
           "type": "RECORD",
           "mode": "NULLABLE",
           "fields": [
             {
               "name": "price",
               "type": "FLOAT",
               "mode": "REQUIRED"
             },
             {
               "name": "originalPrice",
               "type": "FLOAT",
               "mode": "NULLABLE"
             },
             {
               "name": "currencyCode",
               "type": "STRING",
               "mode": "REQUIRED"
             },
             {
               "name": "cost",
               "type": "FLOAT",
               "mode": "NULLABLE"
             }
           ]
         }
       ]
     },
     {
       "name": "quantity",
       "type": "INTEGER",
       "mode": "REQUIRED"
     }
   ]
 },
 {
   "name": "cartId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "purchaseTransaction",
   "type": "RECORD",
   "mode": "REQUIRED",
   "fields": [
     {
       "name": "id",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "revenue",
       "type": "FLOAT",
       "mode": "REQUIRED"
     },
     {
       "name": "tax",
       "type": "FLOAT",
       "mode": "NULLABLE"
     },
     {
       "name": "cost",
       "type": "FLOAT",
       "mode": "NULLABLE"
     },
     {
       "name": "currencyCode",
       "type": "STRING",
       "mode": "REQUIRED"
     }
   ]
 },
 {
   "name": "userInfo",
   "type": "RECORD",
   "mode": "NULLABLE",
   "fields": [
     {
       "name": "userId",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "ipAddress",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "userAgent",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "directUserRequest",
       "type": "BOOLEAN",
       "mode": "NULLABLE"
     }
   ]
 },
 {
   "name": "uri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "referrerUri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "pageViewId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "entity",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

Berikut ini menunjukkan format peristiwa pengguna search.

Objek penelusuran minimum yang diperlukan

Berikut adalah kolom minimum yang diperlukan agar Vertex AI Search untuk retail berfungsi:

  • Untuk menampilkan daftar hasil penelusuran, Vertex AI Search untuk retail memerlukan searchQuery dan productDetails:

    • searchQuery dibaca dari parameter search_term atau dari peristiwa view_search_results.
    • productDetails dibaca dari parameter items peristiwa view_item_list. Daftar ini harus menyertakan daftar ID produk yang ditampilkan kepada pengguna akhir di halaman hasil penelusuran.
  • Setidaknya salah satu kolom searchQuery atau pageCategories harus ada.

Contoh berikut hanya menampilkan kolom yang diperlukan dari format peristiwa pengguna search.

Saat mengimpor peristiwa, Anda harus memberikan stempel waktu di kolom eventTime dalam format yang ditentukan oleh RFC 3339.

Kolom lain mungkin diperlukan, bergantung pada metode API yang digunakan atau jika kolom tambahan digunakan. (Misalnya, jika peristiwa pengguna dikaitkan dengan entity, pastikan untuk menentukan kolom entity.) Untuk mengetahui detail lengkap setiap kolom dan kapan kolom tersebut diperlukan, lihat dokumentasi referensi API UserEvent.

Pixel JavaScript

var user_event = {
  "eventType": "search",
  "visitorId": "visitor-id",
  "searchQuery": "search-query",
  "pageCategories": ["category1 > category2"],
  "productDetails": [
    {
      "product": {
        "id": "product-id1"
      }
    }, {
      "product": {
        "id": "product-id2"
      }
    }
  ]
};

Tag Manager

<script>
    dataLayer = dataLayer || [];
    dataLayer.push({
      'cloud_retail': {
        'eventType': 'search',
        'visitorId': 'visitor-id',
        // You can also define the visitor ID
        // directly on the Tag Manager tag.
        'searchQuery': 'search-query',
        'pageCategories': ['category1 > category2'],
        'productDetails': [
          {
            'product': {
              'id': 'product-id1'
            }
          }, {
            'product': {
              'id': 'product-id2'
            }
          }
        ]
      }
    });
</script>

BigQuery

Ini adalah skema JSON lengkap untuk jenis peristiwa pengguna ini. Tentukan skema ini saat membuat tabel untuk jenis peristiwa pengguna ini di BigQuery.

Mode untuk kolom wajib diisi ditetapkan ke REQUIRED atau REPEATED. Mode untuk kolom opsional ditetapkan ke NULLABLE.

Perhatikan bahwa eventTime diperlukan untuk mengimpor peristiwa dengan BigQuery. eventTime adalah string dengan format Stempel Waktu.

[
 {
   "name": "eventType",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "visitorId",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "eventTime",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "productDetails",
   "type": "RECORD",
   "mode": "REPEATED",
   "fields": [
     {
       "name": "product",
       "type": "RECORD",
       "mode": "REQUIRED",
       "fields": [
         {
           "name": "id",
           "type": "STRING",
           "mode": "REQUIRED"
         }
       ]
     }
   ]
 },
 {
   "name": "searchQuery",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "pageCategories",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "entity",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

Pelengkapan Otomatis

Kolom ini hanya diperlukan untuk peristiwa penelusuran jika Anda ingin menggunakan Autocomplete. Hal ini tidak diperlukan untuk penelusuran.

Contoh berikut menunjukkan kolom completionDetail saat pengguna mengetik "sh" dan mengklik saran kedua, "shoes", dalam daftar saran untuk memicu peristiwa penelusuran. Jika pengguna tidak mengklik saran apa pun, kolom completionDetail tetap kosong.

eventType harus berupa "search".

completionAttributionToken adalah attributionToken dari respons completeQuery.

selectedSuggestion harus sama dengan searchQuery.

Pixel JavaScript

var user_event = {
  "eventType": "search",
  "visitorId": "visitor-id",
  "searchQuery": "search-query",
  "pageCategories": ["category1 > category2"],
  "productDetails": [
    {
      "product": {
        "id": "product-id1"
      }
    }, {
      "product": {
        "id": "product-id2"
      }
    }
  ]
  "completionDetail": {
    "completionAttributionToken": "completion_token",
    "selectedSuggestion": "search-query",
    "selectedPosition": completion_position
  }
};

Tag Manager

<script>
    dataLayer = dataLayer || [];
    dataLayer.push({
      'cloud_retail': {
        'eventType': 'search',
        'visitorId': 'visitor-id',
        // You can also define the visitor ID
        // directly on the Tag Manager tag.
        'searchQuery': 'search-query',
        'pageCategories': ['category1 > category2'],
        'productDetails': [
          {
            'product': {
              'id': 'product-id1'
            }
          }, {
            'product': {
              'id': 'product-id2'
            }
          }
        ]
        "completionDetail": {
          "completionAttributionToken": 'completion_token',
          "selectedSuggestion": 'search-query',
          "selectedPosition": completion_position
        }
      }
    });
</script>

BigQuery

Ini adalah skema JSON lengkap untuk jenis peristiwa pengguna ini. Tentukan skema ini saat membuat tabel untuk jenis peristiwa pengguna ini di BigQuery.

Mode untuk kolom wajib diisi ditetapkan ke REQUIRED atau REPEATED. Mode untuk kolom opsional ditetapkan ke NULLABLE.

Perhatikan bahwa eventTime diperlukan untuk mengimpor peristiwa dengan BigQuery. eventTime adalah string dengan format Stempel Waktu.

[
 {
   "name": "eventType",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "visitorId",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "eventTime",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "productDetails",
   "type": "RECORD",
   "mode": "REPEATED",
   "fields": [
     {
       "name": "product",
       "type": "RECORD",
       "mode": "REQUIRED",
       "fields": [
         {
           "name": "id",
           "type": "STRING",
           "mode": "REQUIRED"
         }
       ]
     }
   ]
 },
 {
   "name": "searchQuery",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "pageCategories",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "completionDetail",
   "type": "RECORD"
   "mode": "NULLABLE"
   "fields": [
     {
       "name": "completionAttributionToken",
       "type": "STRING",
       "mode": "REQUIRED"
     },
     {
       "name": "selectedSuggestion",
       "type": "STRING",
       "mode": "REQUIRED"
     },
     {
       "name": "selectedPosition",
       "type": "INTEGER",
       "mode": "REQUIRED"
     }
    ]
 }
]

Tampilan halaman keranjang belanja

Berikut adalah format data peristiwa pengguna shopping-cart-page-view.

Objek tampilan halaman keranjang belanja minimum yang diperlukan

Contoh berikut hanya menampilkan kolom yang diperlukan dari format peristiwa pengguna shopping-cart-page-view.

Berikan objek productDetails kecuali jika keranjang belanja kosong.

Saat mengimpor peristiwa, Anda harus memberikan stempel waktu di kolom eventTime dalam format yang ditentukan oleh RFC 3339.

Kolom lain mungkin diperlukan, bergantung pada metode API yang digunakan atau jika kolom tambahan digunakan. (Misalnya, jika peristiwa pengguna dikaitkan dengan entity, pastikan untuk menentukan kolom entity.) Untuk mengetahui detail lengkap setiap kolom dan kapan kolom tersebut diperlukan, lihat dokumentasi referensi API UserEvent.

Pixel JavaScript

var user_event = {
  "eventType": "shopping-cart-page-view",
  "visitorId": "visitor-id
  "cartId": "cart-id",
  "productDetails": [{
    "product": {
       "id": "product-id"
     },
     {
       "id": "product-id"
     }
   }]
};

Tag Manager

<script>
    dataLayer = dataLayer || [];
    dataLayer.push({
      'cloud_retail': {
        'eventType': 'shopping-cart-page-view',
        'visitorId': 'visitor-id'
        // You can also define the visitor ID
        // directly on the Tag Manager tag.
        'cartId': 'cart-id',
        'productDetails': [{
          'product': {
            'id': 'product-id'
           },
           {
             'id': 'product-id'
           }
         }]
      }
    });
</script>

BigQuery

Ini adalah skema JSON lengkap untuk jenis peristiwa pengguna ini. Tentukan skema ini saat membuat tabel untuk jenis peristiwa pengguna ini di BigQuery.

Mode untuk kolom wajib diisi ditetapkan ke REQUIRED atau REPEATED. Mode untuk kolom opsional ditetapkan ke NULLABLE.

Perhatikan bahwa eventTime diperlukan untuk mengimpor peristiwa dengan BigQuery. eventTime adalah string dengan format Stempel Waktu.

[
 {
   "name": "eventType",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "visitorId",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "eventTime",
   "type": "STRING",
   "mode": "REQUIRED"
 },
 {
   "name": "experimentIds",
   "type": "STRING",
   "mode": "REPEATED"
 },
 {
   "name": "attributionToken",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "productDetails",
   "type": "RECORD",
   "mode": "REPEATED",
   "fields": [
     {
       "name": "product",
       "type": "RECORD",
       "mode": "REQUIRED",
       "fields": [
         {
           "name": "id",
           "type": "STRING",
           "mode": "REQUIRED"
         }
       ]
     },
     {
       "name": "quantity",
       "type": "INTEGER",
       "mode": "REQUIRED"
     }
   ]
 },
 {
   "name": "cartId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "userInfo",
   "type": "RECORD",
   "mode": "NULLABLE",
   "fields": [
     {
       "name": "userId",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "ipAddress",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "userAgent",
       "type": "STRING",
       "mode": "NULLABLE"
     },
     {
       "name": "directUserRequest",
       "type": "BOOLEAN",
       "mode": "NULLABLE"
     }
   ]
 },
 {
   "name": "uri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "referrerUri",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "pageViewId",
   "type": "STRING",
   "mode": "NULLABLE"
 },
 {
   "name": "entity",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

Kolom peristiwa pengguna Google Analytics 4

Tabel berikut menunjukkan cara kolom peristiwa pengguna Google Analytics 4 dipetakan ke kolom Vertex AI Search for retail.

Sebelum mengimpor atau mencatat peristiwa pengguna dari Google Analytics 4, pastikan peristiwa pengguna Google Analytics 4 Anda menggunakan kolom berikut sehingga Vertex AI Search untuk retail dapat mengintegrasikan data Anda dengan benar.

Google Analytics 4 Retail
ecommerce.purchase_revenue purchaseTransaction.revenue
event_name eventType
event_timestamp eventTime
items.item_id productDetails.product.id
items.price productDetails.product.priceInfo.price
items.quantity productDetails.quantity
Kunci:
event_params.key ditetapkan ke "currency"

Nilai:
event_params.value.string_value
productDetails.product.priceInfo.currencyCode
Kunci:
event_params.key ditetapkan ke "currency"

Nilai:
event_params.value.string_value
purchaseTransaction.currencyCode
Kunci:
event_params.key ditetapkan ke "search_term"

Nilai:
event_params.value.string_value
searchQuery
user_id userInfo.userId
user_pseudo_id visitorId

Atribut khusus

Anda dapat menyertakan atribut dan fitur kustom tambahan untuk peristiwa pengguna. Hal ini dapat menghasilkan rekomendasi yang lebih baik dan lebih spesifik bagi pengguna saat Anda menggunakan rekomendasi. Untuk menambahkan atribut kustom, gunakan attributes saat Anda mencatat peristiwa pengguna.

Jika Anda memberikan atribut kustom untuk peristiwa pengguna yang diserap, sebaiknya sertakan juga atribut tersebut dalam peristiwa pengguna yang Anda kaitkan dengan permintaan prediksi. Format atribut kustom harus konsisten antara peristiwa yang diimpor dan peristiwa yang disediakan dengan permintaan prediksi. Hal ini memungkinkan penggunaan atribut kustom tersebut saat melatih model dan menayangkan prediksi, yang membantu meningkatkan kualitas rekomendasi.

Anda dapat memberikan nilai teks kustom menggunakan kolom text, atau nilai numerik kustom menggunakan kolom number.

Misalnya, berikut ini menunjukkan bagian attributes dari permintaan untuk merekam peristiwa pengguna:

"attributes": {
  "user_age": {"text": ["teen", "young adult"]},
  "user_location": {"text": ["CA"]}
}

Tentang informasi pengguna

visitorId mewakili ID pengguna unik dan diperlukan saat Anda mencatat peristiwa pengguna.

Informasi pengguna (UserInfo) yang disertakan saat Anda merekam peristiwa pengguna berisi nilai visitorId dan, jika tersedia, nilai userId. userId bersifat opsional dan dapat digunakan sebagai ID persisten yang unik untuk pengguna di seluruh perangkat setiap kali pengguna login ke situs Anda. Saat Anda merekam userId untuk pengguna, Vertex AI Search untuk retail dapat menghasilkan hasil yang lebih dipersonalisasi untuk satu pengguna di beberapa perangkat, seperti perangkat seluler dan browser web.

Tentang stempel waktu

Saat Anda merekam peristiwa pengguna, pastikan untuk menyertakan stempel waktu yang akurat saat peristiwa terjadi. Stempel waktu yang akurat memastikan peristiwa disimpan dalam urutan yang benar. Stempel waktu dicatat secara otomatis untuk peristiwa yang dikumpulkan menggunakan Tag Manager dan Piksel JavaScript. Saat mengimpor peristiwa, Anda harus memberikan stempel waktu di kolom eventTime dalam format yang ditentukan oleh RFC 3339.

Langkah selanjutnya