Semua kategori
Panduan Owner

Owner: Setup booth dan operasional harian sampai laporan.

Halaman ini hanya berisi kategori Owner (6 panduan). Untuk kategori lain, pakai tombol Berikutnya di bawah atau navigasi kiri.

OwnerOwner dan manager

Owner: Kelola Outlet dan Booth

Buat outlet, buat booth, atur kamera printer timer, dan kelola device pairing sampai revoke.

10 menit · 4 bagian · 12 langkah

Perlu disiapkan

  • Business sudah dibuat dan plan aktif.
  • Satu outlet minimal sebelum buat booth.
01/04

Ringkasan

Outlet adalah lokasi fisik (nama, alamat, kota, provinsi, status active atau inactive). Photobox adalah booth di dalam outlet (nama, slug unik per business, outlet induk, status online, offline, atau maintenance). Satu outlet bisa menampung banyak booth.

Limit plan di enforce server side. Membuat outlet atau booth melebihi max_outlets atau max_photoboxes ditolak. Semua query di scope business id: non member mendapat 404 anti existence leak.

02/04

Kelola outlet

Klik baris outlet untuk analytics: revenue (sum final amount), sessions count, customers distinct, average transaction, dan most popular package (group by package terbanyak).

  1. 1

    Buka Outlets, tekan Buat Outlet. Isi nama wajib, alamat opsional, kota, provinsi.

  2. 2

    Klik baris untuk analytics per outlet.

  3. 3

    Hapus hanya bila tanpa dependensi photobox, transaksi, atau relasi paket dan voucher. Jika ada, ubah status menjadi inactive.

FieldAturanContoh
nameWajibMall Kota Kasablanka
addressOpsionalLantai 2 Blok A
city / provinceOpsionalJakarta / DKI Jakarta
statusactive atau inactiveactive
03/04

Kelola booth dan device

Pairing memakai kode aktivasi sekali pakai kedaluwarsa sekitar 5 menit. Device kirim kode ke POST /api/v1/public/devices/activate, server verifikasi lalu terbitkan device token persisten (disimpan hash di server, token di localStorage device). Token diverifikasi bersama photobox id dan business id di tiap request.

Device status read only berisi resolusi kamera, status printer, dan last heartbeat. Tombol Ulangi Setup melakukan revoke lalu pairing ulang. Revoke membuat device langsung terkunci.

  1. 1

    Buat photobox: nama, slug lowercase alphanumeric plus dash, outlet induk, status.

  2. 2

    Di detail photobox tekan Tampilkan Kode atau QR.

  3. 3

    Di device buka /p/[businessSlug]/[photoboxSlug], input kode atau scan QR.

  4. 4

    Jalankan setup wizard sekali sampai welcome screen.

  5. 5

    Revoke dari daftar device bila device hilang atau rusak.

Endpoint device (owner dan publik)

GET /api/v1/business/:businessId/photoboxes/:id/activation
POST /api/v1/public/devices/activate
POST /api/v1/public/devices/verify
DELETE /api/v1/business/:businessId/devices/:id
04/04

Kamera, printer, dan timer

Timer mulai saat webhook paid. Semua endpoint sesi mengecek expiry dan mengembalikan SESSION_EXPIRED bila lewat. Countdown kiosk hanya UX, server adalah enforcer.

Timeout sebelum bayar: reset ke Welcome, checkout expired, tidak reuse. Timeout setelah bayar: auto finalize memakai foto terakhir, tetap print dan QR result. Timeout post paid dengan 0 foto: result menampilkan sesi berakhir, penanganan manual owner.

  1. 1

    Atur countdown 1 sampai 60 detik, mirror preview, fullscreen, facingMode, resolusi capture, jpeg quality.

  2. 2

    Atur print: enabled, paper 4x6, layout single, portrait, auto print true, copies, margins mm.

  3. 3

    Atur timer detik minimal 60, warning lebih kecil dari timer, max retakes (null sama dengan unlimited).

  4. 4

    Jalankan print test dan konfirmasi fisik Ya atau Tidak.

Contoh settings per booth

{
  "camera": { "countdown_seconds": 3, "mirror_preview": true },
  "print": { "enabled": true, "paper_size": "4x6", "auto_print": true },
  "session": { "timer_seconds": 300, "warning_seconds": 60 }
}

Troubleshooting

GejalaPenyebabSolusi
Booth tidak muncul di kioskDevice belum pairing atau token di revokeGenerate kode baru dan pairing ulang.
SESSION_EXPIRED terus munculTimer sesi terlalu pendek atau sesi lama dibuka ulangNaikkan timer_seconds, mulai sesi baru setelah paid.
Print test tidak keluarPrinter default OS belum di setSet printer default di kiosk, ulangi print test.

Langkah berikutnya

OwnerOwner dan manager

Owner: Template dan Frame

Upload frame sendiri, atur slot di builder, dan assign ke paket dengan aturan slot yang benar.

10 menit · 4 bagian · 12 langkah

Perlu disiapkan

  • Minimal satu package dengan photo count jelas.
  • File frame PNG atau SVG transparan.
01/04

Ringkasan

Template adalah frame yang menampung foto customer. Dua tipe: template legacy (layout kosong, overlay full canvas, backward compatible) dan template slot (layout canvas plus slots array, foto masuk pas per slot).

Customer hanya melihat template yang di assign ke paket yang ia beli dan slot count sama dengan photo count. Satu engine composeFrame dipakai di builder preview, editor kiosk, print renderer, dan result online.

02/04

Upload frame

Desain di Canva, Figma, atau Photoshop, ekspor PNG atau SVG transparan. Upload divalidasi tipe dan ukuran di server sebagai trust boundary.

  1. 1

    Buka Templates, tekan Upload.

  2. 2

    Isi nama dan kategori: Minimal, Cute, Retro, Y2K, Wedding, Birthday, Graduation, Event, Custom.

  3. 3

    Upload file maksimal 5 MB (PNG, JPG, WebP, SVG).

  4. 4

    Aktifkan toggle is active bila siap tampil.

AturanNilaiKeterangan
Tipe filePNG, JPG, WebP, SVGFrame transparan disarankan PNG atau SVG
Ukuran maks5 MBKompres sebelum upload
ThumbnailOtomatisDari preview builder
03/04

Atur slot di builder

Builder canvas: tambah slot (drag kotak), atur shape, posisi, ukuran, rotasi, fit, lalu Preview dengan foto contoh. Slot tidak bisa digeser atau resize keluar batas canvas (clamp saat drag).

Urutan render: clear canvas ke resolusi canvas, untuk tiap slot urut z naik clip ke shape lalu drawImage foto dengan fit cover atau contain plus transform zoom atau pan customer, lalu drawImage frame PNG penuh, lalu sticker dan text di atas.

  1. 1

    Pilih preset: 4x6 portrait 1200x1800, 4x6 landscape 1800x1200, 2x6 strip 600x1800, square 1500x1500, custom maks 3000x3000.

  2. 2

    Tekan Tambah Slot, drag kotak di canvas.

  3. 3

    Atur shape (rect, rounded, circle, ellipse), x, y, width, height, rotation -180 sampai 180, radius, fit, z.

  4. 4

    Tekan Preview, pastikan foto contoh pas tanpa distorsi.

  5. 5

    Simpan Draft (nonaktif) atau Publish (aktif). Minimal 1 slot, maksimal 8 slot.

Validasi server: width dan height di atas nol, x dan y di atas nol, x plus width dan y plus height di dalam canvas, shape enum valid.

04/04

Assign ke package

Edit package lalu multi select template. Filter otomatis hanya menampilkan template dengan slot count sama. Simpan menghapus relasi lama lalu insert bulk yang baru.

  1. 1

    Edit package, pilih template yang berlaku.

  2. 2

    Simpan relasi package templates.

  3. 3

    Uji dari kiosk: pilih paket, bayar, pastikan frame muncul di layar pilih template.

Troubleshooting

GejalaPenyebabSolusi
Template tidak bisa di assignslot count tidak sama dengan photo countUbah jumlah slot di builder atau pilih paket dengan photo count sama.
Hasil print beda dari previewFrame diganti setelah sesi dibuatSesi memakai snapshot saat transaksi. Buat sesi baru setelah publish.
Upload ditolakTipe atau ukuran file di luar aturanEkspor ulang PNG atau JPG di bawah 5 MB.

Langkah berikutnya

OwnerOwner dan manager

Owner: Voucher Promo

Buat kode diskon percentage atau fixed, batasi pemakaian, dan baca performanya.

8 menit · 4 bagian · 8 langkah

Perlu disiapkan

  • Minimal satu package aktif untuk eligibility.
01/04

Ringkasan

Voucher memberi diskon di checkout sebelum paid. Diskon tercatat di checkout session, payments, dan transactions. Kode unik per business huruf besar plus angka.

Frontend hanya display. Backend validasi ulang semuanya dan menghitung final amount sebagai source of truth: final sama dengan harga paket plus pricing yang berlaku minus diskon voucher valid.

02/04

Buat voucher

Dua tipe: percentage (1 sampai 100 persen, capped by max discount) dan fixed (nominal IDR flat, capped by gross). Bisa dibatasi periode, usage limit total, per customer, minimum transaksi, maximum diskon, dan paket atau outlet tertentu.

  1. 1

    Tekan Buat Voucher.

  2. 2

    Pilih tipe percentage atau fixed, isi amount.

  3. 3

    Isi periode start dan end, usage limit, usage per customer, minimum transaksi, maximum diskon.

  4. 4

    Assign ke paket dan outlet bila promo terbatas. Kosong berarti semua.

  5. 5

    Aktifkan toggle is active.

FieldAturanContoh
codeUnik per business, uppercaseGRANDOPENING20
typepercentage atau fixedpercentage
amount1-100 untuk persen, di atas nol untuk fixed20
min_transactionDi atas atau sama dengan nol30000
max_discountNull atau di atas nol10000
03/04

Validasi saat dipakai

Customer input kode ke POST apply voucher. Server cek: voucher ada, business cocok, is active true, tanggal berlaku, usage limit total, usage per customer, min transaction, package eligibility, outlet eligibility.

Voucher 100 persen membuat payment paid sintetik tanpa gateway. Voucher parsial kembali ke method picker untuk melunasi sisa. Saat webhook paid, ada TOCTOU re-check kuota: bila over limit, log warning tanpa rollback karena payment sudah settled, lalu insert voucher usages.

04/04

Baca performa

Buka baris voucher untuk total usage (count voucher usages), total diskon (sum discount amount), revenue generated (sum final amount transaksi yang memakai voucher), serta active dan expired count.

  1. 1

    Buka baris voucher untuk angka usage dan diskon.

  2. 2

    Bandingkan active dan expired untuk keputusan perpanjang.

  3. 3

    Periksa usages per customer bila curiga abuse, lalu turunkan limit atau persempit eligibility.

Troubleshooting

GejalaPenyebabSolusi
Voucher invalid atau expiredNonaktif, di luar periode, limit habis, atau tidak eligibleCek toggle, tanggal, limit, min transaction, dan assign paket atau outlet.
Diskon lebih kecil dari harapanTerkena cap max discount atau min transactionNaikkan max discount atau turunkan min transaction.
Voucher bisa dipakai berlebihRace pemakaian bersamaanTOCTOU re-check mencatat warning. Ketatkan limit dan pantau usages.

Langkah berikutnya

OwnerOwner dan manager

Owner: Baca Dashboard dan Analytics

Cara membaca revenue, filter tanggal, dan breakdown per outlet, paket, booth, dan metode bayar.

8 menit · 4 bagian · 10 langkah

Perlu disiapkan

  • Minimal satu transaksi paid agar metrik terisi.
01/04

Ringkasan

Dashboard adalah server component yang membaca transactions paid milik business Anda. Semua query di scope business id, tidak ada data lintas tenant.

Uang selalu integer Rupiah. Gross adalah total sebelum diskon (sum final amount? tepatnya gross), discount adalah total voucher terpakai dan tidak dihitung sebagai revenue, net adalah gross minus discount. Average transaction adalah net dibagi count paid, dibulatkan integer.

02/04

Metrik utama

Halaman Dashboard menampilkan revenue today, revenue month, gross, net, total sessions, paid transactions, total customers, average transaction, active photoboxes (status online), dan active outlets (status active).

  1. 1

    Buka Dashboard untuk kartu metrik dan chart revenue.

  2. 2

    Baca active photoboxes dan outlets untuk status operasional.

  3. 3

    Jika kosong: periksa filter tanggal dan pastikan ada transaksi paid. Pending, failed, expired tidak masuk revenue.

MetrikSumberCatatan
Gross Revenuesum transactions (paid)Sebelum diskon
Discountsum discount amountTidak dihitung revenue
Net Revenuegross minus discountAngka masuk bisnis
Avg Transactionnet dibagi count paidInteger Rupiah
03/04

Analytics dan breakdown

Halaman Analytics menyediakan breakdown per hari, outlet, package, photobox, dan metode pembayaran. Semua agregasi dari transactions, sehingga POS otomatis masuk laporan begitu insert ke transactions.

  1. 1

    Buka Analytics.

  2. 2

    Pilih rentang: Today, 7 hari, 30 hari, bulan ini, bulan lalu, tahun ini, custom.

  3. 3

    Ganti breakdown: by day, by outlet, by package, by photobox, by payment method.

  4. 4

    Samakan angka dengan Metrics dan Transactions.

04/04

Customers

Halaman Customers menampilkan nama, phone, email, total spending (sum final amount per customer), session history, transaction history, dan booking history. Search mendukung nama, phone, email. Klik baris untuk detail tab transaksi, sesi, booking.

  1. 1

    Buka Customers.

  2. 2

    Gunakan search untuk nama, phone, atau email.

  3. 3

    Klik baris untuk riwayat lengkap dan total spending.

Troubleshooting

GejalaPenyebabSolusi
Angka dashboard nolBelum ada transaksi paid di rentang ituLonggarkan filter tanggal, cek status paid.
Analytics beda dengan dashboardRentang atau breakdown berbedaSamakan from dan to, bandingkan agregasi yang sama.
Customer tidak ketemuSearch terlalu spesifik atau data nullCari sebagian nama, phone, atau email.

Langkah berikutnya

OwnerOwner dan manager

Owner: Staff dan POS Kasir

Undang staff dengan role yang tepat dan jalankan POS offline cash per booth untuk merchandise.

10 menit · 4 bagian · 10 langkah

Perlu disiapkan

  • Plan dengan slot staff tersedia (Growth 5, Business 20).
  • Add on POS aktif untuk entitlement kasir.
01/04

Ringkasan

Role business: owner akses penuh, manager hampir semua kecuali staff write dan billing, staff read only operasional. Permission dicek server side dengan fungsi can. Sembunyikan menu hanya UX, bukan pengaman.

POS adalah add on ber entitlement per booth dengan flag photoboxes pos enabled. Pembayaran POS offline only: cash, bank transfer, atau other. Tanpa integrasi payments, Pakasir, webhook, atau creditBalance.

02/04

Undang dan atur staff

Invite mencari user by email, buat user active bila belum ada, lalu insert business members. Update dan revoke memakai composite business id plus user id. Role owner tidak bisa diubah atau di revoke orang lain.

  1. 1

    Buka Staff, tekan Undang Staff. Isi email dan role.

  2. 2

    Cek limit max staff: Starter 0, Growth 5, Business 20.

  3. 3

    Ubah role atau revoke dari baris staff sesuai kebutuhan.

RoleAksesBatasan
ownerPenuhTidak bisa diubah atau revoke oleh lain
managerHampir semuaTanpa staff write dan billing
staffRead only operasionalTanpa finance detail dan settings
03/04

Aktifkan POS

POS dijual sebagai baris add ons code pos unit feature. Harga dibaca server dari add ons dan bisa diubah admin via UI tanpa deploy. Owner beli via subscription invoice QRIS, lalu apply intent upsert subscription add ons.

Gate di tiga lapis: layout POS redirect bila tidak berhak, tiap server action dan API throw POS NOT SUBSCRIBED, dan halaman aktivasi owner. Sidebar hanya render menu POS bila entitlement aktif dan role punya permission.

  1. 1

    Beli add on POS via subscription invoice QRIS sampai entitlement aktif.

  2. 2

    Aktifkan pos enabled per booth yang boleh jualan.

  3. 3

    Pastikan staff punya permission pos sell dan pos read.

04/04

Jalankan kasir

Katalog pos products per tenant: nama, SKU nullable unik per business, kategori text (keychain, gantungan, additional print, merchandise, lainnya), harga integer di atas nol, cost opsional untuk margin, stock nullable (null sama dengan tidak di track), image url eksternal.

Order: client hanya kirim product id plus qty. Server fetch ulang produk by id dan business id, hitung subtotal dan total, simpan snapshot di pos order items agar perubahan harga tidak mengubah riwayat. Stock decrement memakai guarded UPDATE stock sama dengan stock minus qty where stock di atas sama dengan qty.

  1. 1

    Owner atau manager buat katalog produk dan harga.

  2. 2

    Staff buka terminal POS, tambah item ke cart (qty, hapus, subtotal, total).

  3. 3

    Buat order pending dengan snapshot harga.

  4. 4

    Terima cash atau transfer offline. Order paid insert ke transactions untuk reporting tanpa kredit saldo.

Troubleshooting

GejalaPenyebabSolusi
POS_NOT_SUBSCRIBEDAdd on POS belum aktifSelesaikan invoice add on POS sampai entitlement aktif.
INSUFFICIENT_STOCKRace dua kasir untuk stok terakhirKurangi qty atau restock produk.
Staff tidak melihat menu POSTanpa permission atau tanpa entitlementCek role dan pos enabled per booth.

Langkah berikutnya

OwnerOwner dan manager

Owner: Keuangan dan Laporan

Catat expense, baca profit, export CSV dan XLSX, dan atur retention serta checkout.

10 menit · 3 bagian · 10 langkah

Perlu disiapkan

  • Transaksi paid tersedia untuk dibaca.
  • Kategori expense disepakati internal.
01/03

Ringkasan

Transactions adalah source of truth financial reporting. Payments adalah detail settlement. Setiap payment paid otomatis membuat transaction paid. POS otomatis masuk laporan karena insert ke transactions yang sama.

Transaksi manual (cash, bank transfer, other) dan offline dicatat untuk reporting tetapi tidak mengisi saldo. Saldo hanya dari QRIS via creditBalance. Kebijakan ini konsisten sejak migration 0016.

02/03

Transaksi dan finance

Tabel transactions berisi transaction number, tanggal paid at, customer (nama atau strip), package, outlet, photobox, payment method (qris, cash, bank transfer, other, offline), gross, discount, final, dan status badge. Status enum: pending, paid, failed, cancelled, refunded.

Finance menghitung: Net Revenue sama dengan sum final amount paid. Expenses sama dengan sum expenses amount. Estimated Profit sama dengan Net minus Expenses. Profit Margin sama dengan Profit dibagi Net kali 100.

  1. 1

    Buka Transactions. Filter date range, outlet, photobox, package, method, status.

  2. 2

    Search nomor transaksi, nama, phone, atau email customer.

  3. 3

    Klik baris untuk detail gross, discount, final, voucher, paid at.

  4. 4

    Untuk tunai di luar kiosk: tekan Catat Transaksi Manual, isi outlet, photobox, package, method, amount, note. Sistem insert paid plus audit log tanpa creditBalance.

  5. 5

    Buka Finance untuk gross, discounts, net, expenses, profit, margin.

  6. 6

    Tekan Tambah Pengeluaran: name, amount integer di atas nol, kategori, tanggal, outlet opsional, note.

Kategori expenseContohCatatan
Sewa dan utilitasRent, Electricity, InternetRutin bulanan
Operasional cetakPaper, InkIkuti volume cetak
SDM dan perawatanStaff, Maintenance, EquipmentPer outlet bila perlu
Pemasaran dan lainAdvertising, Other operationalUntuk hitung margin bersih
03/03

Export dan pengaturan

Reports via REST download: GET /api/v1/business/[businessId]/reports dengan type, from, to, format csv atau xlsx. CSV mengikuti RFC4180 dengan formula injection guard. XLSX via ExcelJS. Response attachment untuk download browser.

Retention days 1 sampai 3 di Settings. Cron retention menghapus media hasil setelah cutoff, baris transactions dan sessions dipertahankan. Checkout settings: qris expiry minutes 1 sampai 60 default 3, offline enabled boolean default false (opt in server gated, payment method offline non withdrawable).

  1. 1

    Buka Reports, pilih tipe: daily, weekly, monthly, revenue, transactions, outlet, photobox, expenses, voucher.

  2. 2

    Pilih format CSV atau XLSX, lalu unduh.

  3. 3

    Atur retention days di Settings.

  4. 4

    Atur checkout expiry dan offline enabled di Settings Checkout.

Contoh download laporan

GET /api/v1/business/[businessId]/reports?type=transactions&from=2026-09-01&to=2026-09-30&format=csv

Troubleshooting

GejalaPenyebabSolusi
Export kosongFilter tanggal tanpa transaksi paidLonggarkan rentang, cek status paid.
Profit terlihat minusExpense lebih besar dari net periode ituCek expense per kategori dan tanggal input.
Transaksi manual tidak menambah saldoBy design: manual reporting onlyTidak perlu aksi. Saldo hanya dari QRIS.

Langkah berikutnya

Catatan sumber kebenaran.

Panduan ini disusun dari perilaku kode berjalan SnapyOS. Backend menghitung ulang pembayaran. Dana QRIS masuk langsung ke rekening merchant owner. Hasil foto tersimpan 1 sampai 3 hari mengikuti pengaturan booth.