Case study 03 · WooCommerce · Apr – Sep 2026Studi kasus 03 · WooCommerce · Apr – Sep 2026
REDAS.
A members' store for a real estate association, where every PDF a customer buys is stamped with its own serial number and can be traced back to the order that bought it.Toko anggota untuk asosiasi real estate, di mana setiap PDF yang dibeli diberi nomor serial sendiri dan bisa dilacak ke pesanan yang membelinya.
Every copy has an owner.Setiap salinan punya pemilik.
The association sells documents and publications to members and the public. Each copy had to be traceable to its order, members needed their own prices, and nothing could depend on someone stamping and emailing PDFs by hand. WooCommerce gave the shop; everything that made it REDAS's shop I wrote as custom PHP in the child theme.Asosiasi menjual dokumen dan publikasi ke anggota dan umum. Setiap salinan harus bisa dilacak ke pesanannya, anggota butuh harga sendiri, dan tidak boleh ada proses manual menempelkan serial lalu mengirim PDF lewat email. WooCommerce menyediakan tokonya; semua yang membuatnya jadi toko REDAS saya tulis sebagai PHP custom di child theme.
What I builtYang saya bangun
The serial engine, with its own tracking tableMesin serial, dengan tabel tracking sendiri
FPDI stamping and secure download linksStamping FPDI dan link download yang aman
Bundles, member pricing and a custom checkoutBundle, harga anggota dan checkout custom
Order admin columns and an export pageKolom admin pesanan dan halaman export
Storefront changes and content shortcodesPerubahan tampilan toko dan shortcode konten
Already in placeSudah tersedia
WordPress, WooCommerce and the Flatsome themeWordPress, WooCommerce dan tema Flatsome
The payment gateway and PayNow accountsAkun payment gateway dan PayNow
The PDF publications themselvesFile PDF publikasinya sendiri
From checkout to downloadDari checkout sampai download
No hands in the loop.Tanpa proses manual.
Once payment clears, the order moves through every step on its own. The customer gets a link, and each download produces a PDF carrying that copy's serial.Begitu pembayaran berhasil, pesanan melewati setiap langkah dengan sendirinya. Pelanggan menerima link, dan setiap download menghasilkan PDF yang membawa serial salinan tersebut.
01 · checkout
Checkout
Member price, validated fields, PayNow or cardHarga anggota, field tervalidasi, PayNow atau kartu
02 · order
Order paidPesanan lunas
Bundles split into components; virtual orders complete themselvesBundle dipecah jadi komponen; pesanan virtual selesai otomatis
03 · serial
Serials issuedSerial dibuat
One per copy, numbered per file code, reset each yearSatu per salinan, bernomor per kode file, reset tiap tahun
04 · email
Secure linkLink aman
Order email carries a link tied to the serial and orderEmail pesanan membawa link yang terikat ke serial dan pesanan
05 · fpdi
Stamped PDFPDF ber-serial
FPDI writes the serial onto the file; downloads are countedFPDI menulis serial ke file; jumlah download dicatat
What's insideIsinya
Seven systems, one store.Tujuh sistem, satu toko.
All of it lives in the child theme as custom PHP, CSS and JavaScript, written against WooCommerce hooks rather than by editing plugins.Semuanya ada di child theme sebagai PHP, CSS dan JavaScript custom, ditulis lewat hook WooCommerce tanpa mengubah plugin.
01
Serial engineMesin serial
The heart of the store. Every copy sold gets a serial that is unique, sequential within its publication, and recorded in its own table.Inti dari toko ini. Setiap salinan yang terjual mendapat serial yang unik, berurutan di dalam publikasinya, dan dicatat di tabel sendiri.
A product map links each product to its file code and source PDFPeta produk menghubungkan setiap produk ke kode file dan PDF sumbernya
Sequence counted per file code and restarted every yearUrutan dihitung per kode file dan dimulai ulang setiap tahun
Each purchase is per project; the project name is stamped as a watermark on every pageSetiap pembelian per proyek; nama proyek ditempel sebagai watermark di setiap halaman
Quantity 3 means three serials, one per copyQuantity 3 berarti tiga serial, satu per salinan
Issued at checkout and on status change, with a sweep for any order that was missedDibuat saat checkout dan saat status berubah, dengan pengecekan untuk pesanan yang terlewat
How a serial is builtCara serial disusun
MC042026000046
MC04 · SC02
Document and edition: Main Contract 4th Edition, Sub-Contract 2nd EditionDokumen dan edisi: Main Contract 4th Edition, Sub-Contract 2nd Edition
2026
The current yearTahun berjalan
000046
Six-digit number, unique for every PDF sold. Buy two files and you get two different numbersEnam digit, unik untuk setiap PDF yang terjual. Beli dua file berarti dua nomor yang berbeda
Line 2Baris 2
The Name of Project the buyer types at checkout, capped at 85 characters so the stamp never wrapsName of Project yang ditulis pembeli saat checkout, dibatasi 85 karakter supaya stempel tidak pecah baris
A purchased cover with its serial and project line (test data)Cover yang dibeli dengan serial dan baris proyek (data tes)
02
Stamped PDF deliveryPengiriman PDF ber-serial
Customers never receive a raw file. Each download is generated on request with the copy's serial written into the PDF.Pelanggan tidak pernah menerima file mentah. Setiap download dibuat saat diminta, dengan serial salinan tertulis di PDF-nya.
Download links in the order email, tied to a serial and an orderLink download di email pesanan, terikat ke serial dan pesanan
Each request is checked against that order's serial map; anything else is refusedSetiap permintaan dicek ke peta serial pesanan; selain itu ditolak
FPDI imports the source PDF and stamps the serial on itFPDI mengimpor PDF sumber dan menempelkan serialnya
Download count and last download date recorded per serialJumlah download dan tanggal download terakhir dicatat per serial
03
Bundles
Some publications are sold as a set. A bundle had to behave like one product in the cart and like several products for serials.Beberapa publikasi dijual sebagai satu set. Bundle harus terlihat seperti satu produk di keranjang, tapi seperti beberapa produk untuk serial.
Bundles detected and split into their component items on checkoutBundle dideteksi dan dipecah jadi item komponennya saat checkout
Virtual component products created where neededProduk komponen virtual dibuat bila diperlukan
Every component gets its own serial and its own downloadSetiap komponen mendapat serial dan download sendiri
Component lines hidden on the thank-you page so the order still reads cleanlyBaris komponen disembunyikan di halaman terima kasih agar pesanan tetap rapi dibaca
04
Member pricingHarga anggota
Members of REDAS pay less, and the discount differs per publication.Anggota REDAS membayar lebih murah, dan potongannya berbeda per publikasi.
Discount configured per productDiskon diatur per produk
"REDAS Member" choice on the product page, with the price updating livePilihan "REDAS Member" di halaman produk, dengan harga yang langsung berubah
Validation before add to cart, and the same choice editable in the cartValidasi sebelum add to cart, dan pilihan yang sama bisa diubah di keranjang
Cart totals recalculated from the selectionTotal keranjang dihitung ulang dari pilihan tersebut
Product page: both prices and the required "REDAS Member" choiceHalaman produk: dua harga dan pilihan wajib "REDAS Member"Cart with the member price applied and "Amend My Order"Keranjang dengan harga anggota dan tombol "Amend My Order"
05
Checkout
A checkout shaped for an association: the right fields, clear errors, and fewer ways to type something wrong.Checkout yang disesuaikan untuk asosiasi: field yang tepat, pesan error yang jelas, dan lebih sedikit peluang salah ketik.
Custom and conditional fields (e.g. organisation), saved to the orderField custom dan kondisional (misalnya organisasi), disimpan ke pesanan
One phone field with a country code picker and a digit limit per countrySatu field telepon dengan pemilih kode negara dan batas digit per negara
Email confirmation checked as the customer typesKonfirmasi email dicek saat pelanggan mengetik
Input restrictions, coupons off, guest email synced to billingPembatasan input, kupon dimatikan, email tamu disinkronkan ke billing
"Amend my order" button and automatic completion of paid virtual ordersTombol "Amend my order" dan penyelesaian otomatis pesanan virtual yang lunas
Member, company and UEN, confirm email, phone with country code, Name of Project, card or PayNowAnggota, perusahaan dan UEN, konfirmasi email, telepon dengan kode negara, Name of Project, kartu atau PayNow
06
Admin & exportAdmin & export
The association's staff work from the orders screen, so it shows what they need without opening each order.Staf asosiasi bekerja dari layar pesanan, jadi layar itu menampilkan yang mereka butuhkan tanpa membuka tiap pesanan.
Custom order columns on both HPOS and legacy screensKolom pesanan custom di layar HPOS maupun legacy
Payment transaction link, scrollable wide table, unused columns removedLink transaksi pembayaran, tabel lebar yang bisa di-scroll, kolom yang tidak dipakai dihapus
An export page under the WooCommerce menu that builds files from order and product detailsHalaman export di menu WooCommerce yang membuat file dari detail pesanan dan produk
Branded order emailsEmail pesanan dengan branding
07
Storefront & contentToko & konten
A catalogue that reads like a publications list rather than a generic shop, plus the association's news and events.Katalog yang terasa seperti daftar publikasi, bukan toko biasa, ditambah berita dan event asosiasi.
Price format, "Click to order" button, product cards that only open from the buttonFormat harga, tombol "Click to order", kartu produk yang hanya terbuka dari tombolnya
Cart badge counter, mini cart, empty cart and product page layout fixesCounter badge keranjang, mini cart, keranjang kosong dan perbaikan layout halaman produk
[redas_announcements] and an advocacy variant, filterable by year[redas_announcements] dan varian advocacy, bisa difilter per tahun
[industry_events] and a resources list, with 12-hour times and events that expire the day after they end[industry_events] dan daftar resource, dengan format jam 12 jam dan event yang kedaluwarsa sehari setelah selesai
The REDAS homepageHomepage REDAS
Engineering notesCatatan teknis
The hard parts.Bagian yang sulit.
Decisions that shaped the code, described without sharing any of it.Keputusan yang membentuk kodenya, dijelaskan tanpa membagikan kodenya.
01 · sequences
Numbers that restart every yearNomor yang mulai ulang tiap tahun
Sequences are counted per file code within the current year, straight from the tracking table. An admin-only check shows the next number for every file code and simulates a future year to prove the reset.Urutan dihitung per kode file di tahun berjalan, langsung dari tabel tracking. Pengecekan khusus admin menampilkan nomor berikutnya untuk setiap kode file dan mensimulasikan tahun depan untuk membuktikan reset-nya.
02 · hpos
Two order storages at onceDua penyimpanan pesanan sekaligus
WooCommerce was moving orders to HPOS. Every read and write supports both HPOS and legacy post meta, and a one-time migration moved existing serial data across.WooCommerce sedang memindahkan pesanan ke HPOS. Setiap baca dan tulis mendukung HPOS dan post meta legacy, dan migrasi sekali jalan memindahkan data serial yang sudah ada.
03 · traceability
A serial per copy, not per orderSerial per salinan, bukan per pesanan
Each copy is stored with its position in the order line, so three copies of one report are three traceable files. A leaked PDF points to exactly one purchase.Setiap salinan disimpan bersama posisinya di baris pesanan, jadi tiga salinan satu laporan adalah tiga file yang bisa dilacak. PDF yang bocor menunjuk tepat ke satu pembelian.
04 · safety
Maintenance tools that stay offAlat perawatan yang tetap mati
Reset, migration and test tools exist for staging but are admin-only and disabled by default, so production serials cannot be wiped by a stray request.Alat reset, migrasi dan tes tersedia untuk staging, tapi khusus admin dan mati secara default, jadi serial di production tidak bisa terhapus oleh request yang nyasar.