Membuat layanan

Buat dan atur layanan (event type) Termilo: durasi, buffer, harga, deposit, mode lokasi, dan staf. Bisa lewat dashboard atau langsung lewat endpoint POST /api/services.

Lihat .md

Layanan adalah hal yang dipesan pelanggan — konsultasi 1:1, kelas, meeting, atau sesi apa pun yang punya durasi. Di standar penamaan Termilo istilahnya event type; di skema dan API resource-nya secara literal bernama services (tidak ada tabelevent_type terpisah).

Membuat layanan butuh akun dengan peran tenant_owner atau tenant_admin (peran tulis). tenant_staff dan tenant_viewer hanya bisa membaca.

Lewat dashboard#

Cara tercepat. Semua langkah di bawah mengikuti editor layanan di dashboard.

  1. Katalog → Layanan → Tambah layanan

    Buka dashboard, masuk ke Katalog, lalu pilih Layanan dan klik Tambah layanan.

  2. Identitas layanan

    Isi Nama, Kategori, dan Deskripsi. Aktifkan "Aktif untuk dibooking" agar layanan muncul di halaman publik; matikan untuk menyembunyikannya tanpa menghapus.

  3. Durasi & buffer

    Atur Durasi (menit) dan Buffer setelah (menit) lewat stepper. Buffer adalah jeda otomatis sesudah sesi agar slot berikutnya tidak menempel.

  4. Harga & deposit

    Isi Harga (Rp). Opsional, aktifkan "Minta deposit" lalu pilih 20% / 30% / 50% dari harga.

  5. Lokasi & staf

    Pilih Mode lokasi (offline / online / customer / phone / manual) dan tetapkan staf yang melayani layanan ini.

  6. Simpan

    Simpan. Layanan langsung tersedia di halaman booking jika statusnya aktif.

Status menentukan visibilitas
Layanan dengan status active langsung muncul di halaman booking. Pilih hidden untuk menyembunyikannya dari pelanggan tanpa menghapus, atau disabled untuk menonaktifkan.

Field sebuah layanan#

Field di bawah adalah body untuk POST /api/services. Hanya slug, name, dan durationMin yang wajib; sisanya punya nilai bawaan yang aman. Buffer default 0, status default active.

Catatan satuan: priceAmount memakai satuan terkecil mata uang dan boleh null untuk layanan gratis. Durasi dan buffer dalam menit. Semua timestamp di respons adalah epoch milidetik UTC (sufiks _at_ms).

PARAMETERTIPEWAJIBKETERANGAN
slugstringwajibIdentifier layanan di URL, mis. konsultasi-30. Unik per tenant.
namestringwajibNama yang dilihat pelanggan saat memilih layanan.
durationMinnumberwajibDurasi sesi dalam menit.
descriptionstringopsionalPenjelasan singkat layanan. Opsional.
categoryIdstringopsionalID kategori untuk pengelompokan di katalog. Opsional.
bufferBeforeMinnumberopsionalJeda sebelum sesi, dalam menit. Bawaan 0.
bufferAfterMinnumberopsionalJeda sesudah sesi, dalam menit. Bawaan 0.
priceAmountnumber | nullopsionalHarga dalam satuan terkecil (sen / rupiah penuh). Nullable.
priceCurrencystringopsionalKode mata uang, mis. "IDR".
status"active" | "hidden" | "disabled"opsionalStatus tampil. Bawaan active.
Kapasitas kelas/grup
Tidak ada field capacity di layanan. Kapasitas berasal dari resource (resources.capacity) yang ditautkan ke layanan; availability mengembalikan capacityRemaining per slot. Selengkapnya di panduan Booking grup & kelas.

Lewat API#

Dashboard memakai POST /api/services dengan sesi + CSRF. Integrasi server-to-server memakai GET /v1/services, POST /v1/services, dan PATCH /v1/services/:serviceId dengan API key tenant. Read membutuhkan services:read; create dan update membutuhkan services:write.

Create Partner API wajib membawa Idempotency-Key. Retry request yang sama mengembalikan layanan awal tanpa duplikat; gunakan PATCH dengan status: disabled untuk menonaktifkan layanan secara recoverable.
Implementedsesi dashboard + CSRF · POST /api/servicesLiveAPI key tenant · POST /v1/services
# Dashboard (session cookie + CSRF). Tanpa prefix /v1 — path nyata hari ini. curl https://app.termilo.id/api/services \ -X POST \ -H "Content-Type: application/json" \ -H "X-Termilo-CSRF: $CSRF_TOKEN" \ --cookie "__Host-termilo_session=$SESSION" \ -d '{ "slug": "konsultasi-30", "name": "Konsultasi 30 menit", "durationMin": 30, "bufferAfterMin": 10, "priceAmount": 150000, "priceCurrency": "IDR" }'

Sukses mengembalikan 201 dengan envelope standar Termilo — ok, data, dan meta.requestId. requestId juga dikirim di header respons x-request-id. Validasi gagal mengembalikan VALIDATION_ERROR (400) dengan details: [{path, message}].

201 Createdapplication/json
{
"ok": true,
"data": {
"serviceId": "svc_8f3a",
"slug": "konsultasi-30",
"name": "Konsultasi 30 menit",
"durationMin": 30,
"bufferBeforeMin": 0,
"bufferAfterMin": 10,
"priceAmount": 150000,
"priceCurrency": "IDR",
"status": "active"
},
"meta": { "requestId": "req_a1b2" }
}

Deposit, lokasi & staf#

Editor layanan juga mengatur deposit, mode lokasi, dan penugasan staf. Ini konfigurasi di sisi dashboard — sebagian tidak ditulis lewat POST /api/services (deposit dan staf memakai relasi tersendiri).

  • Minta deposit

    Aktifkan per layanan lalu pilih 20% / 30% / 50% dari harga. Nilai ini tampil di ringkasan booking.

  • Mode lokasi

    Pilih offline, online, customer, phone, atau manual. Untuk online, tautan meeting datang dari integrasi Google Meet/Zoom saat booking dibuat.

  • Staf

    Tetapkan staf yang melayani layanan ini. Hanya staf terpilih yang muncul saat pelanggan memilih. Penugasan disimpan lewat relasi service_staff.

Deposit dibayar lewat gateway milik bisnis
Persentase deposit ditentukan di editor layanan. Pembayarannya diproses lewat gateway pembayaran yang dihubungkan bisnis sendiri (BYOK) — dana masuk langsung ke rekening bisnis. Tidak ada event webhook untuk pembayaran. Lihat panduan Deposit & pembayaran.