Create Bulk Subscription
This page is a tutorial for the Billing — Bulk Bill Upload feature. For a full feature overview → Subscription and Billing
Learn how to process hundreds of invoices at once using the Bulk Bill Upload feature. Upload a single file containing your entire customer billing data — FlexiBill will automatically issue and deliver all invoices.
Interactive Demo
Prerequisites
Step-by-Step Guide
Choose Bill Type and Distribution Channel
Navigate to Subscription and Billing → Bill, then click Create Bill → Upload File.

Select the bill type:
One-Off Charge
A single, non-recurring invoice
Registration fees, event fees, ad hoc charges
Recurring
Invoices issued automatically on a repeating schedule
Monthly tuition, rent, memberships
Select the distribution channel — both can be selected simultaneously:
Invoice delivered to the customer's email address in the data file
Invoice delivered to the customer's WhatsApp number in the data file. Requires DOKU PayChat to be activated
Select Invoice Term and Grace Period
Configure the payment window and buffer period for all invoices in this upload.
Invoice Term — the deadline from the invoice issue date by which the customer must pay:
Due upon receipt
Same day the invoice is issued
15 days
15 days after invoice is issued
End of month
Last day of the month the invoice is issued
Grace Period — a buffer after the due date where no penalties apply, the customer can still pay, and the service remains active:
No grace period
Subscription expires immediately after the due date if unpaid
7 days
Customer has 7 additional days after the due date to pay
15 days
Customer has 15 additional days after the due date to pay
Invoice Term and Grace Period apply uniformly to all records in the uploaded file. If different customers require different terms, submit them in separate uploads.
Prepare the Billing File
Accepted formats: CSV, XLS, XLSX | Maximum file size: 50 MB | Maximum rows: 1,000
Download the template from the dashboard (Download Template) to avoid formatting errors. Templates are available for both One-Off Charge Bill and Recurring Bill types.
File naming rules:
Use only: letters (a–z, A–Z), numbers (0–9), hyphens (
-), and underscores (_)No spaces or special characters
Length: 3–100 characters, must start with a letter or number
Each upload must use a unique file name — file names cannot be reused across uploads
Required columns — One-Off Charge Bill:
beneficiary_name
✅
128
Customer name. No symbols except spaces and '
John Smith
beneficiary_email
✅
256
Customer email address
john@email.com
beneficiary_phone
✅
128
Phone with country code. Indonesia: 62, Malaysia: 60. Do not start with 0
6281234567890
beneficiary_identifier
✅
20
Unique customer reference ID
STU-122333
bill_identifier
Optional
20
Unique bill reference ID
BILL-001
bill_service_title
✅
256
Name of the billed service
April Tuition Fee
bill_service_description
Optional
256
Additional description
April 2025 Class 3A
bill_detail
Optional
2,056
Custom key-value data in parameter=value format, separated by ;. Maximum 10 pairs
student_id=122333;class=3A
currency
✅
3
Currency code
IDR or MYR
amount
✅
12
Bill amount
500000
Additional columns — Recurring Bill only:
cycle_type
✅
INTERVAL or SPECIFIC_DATE
INTERVAL
interval
If INTERVAL
Number + period unit: d=day, m=month, y=year. Range: 1–999
1m, 7d, 1y
date
If SPECIFIC_DATE
Billing day(s) of the month, separated by ;
1;15
month
If SPECIFIC_DATE
Billing month(s), separated by ;
jan;apr;jul;oct
start_date
✅
Start date in YYYYMMDD. Must be on or after the upload date
20250901
end_date_type
✅
AFTER_X_TIMES, SPECIFIC_DATE, or NEVER
AFTER_X_TIMES
end_date
If not NEVER
For AFTER_X_TIMES: number of cycles. For SPECIFIC_DATE: date in YYYYMMDD, must be after start date
12 or 20261231
📋 Sample: Billing File for Rachma
The school needs to bill student Rachma (class 3B, student ID 122333) for two separate charges:
Bill 1 — A one-off study tour fee of IDR 300,000
Bill 2 — A monthly extracurricular fee of IDR 50,000, billed every month for one year (12 cycles)
Since the two bills have different types, they must be submitted as two separate uploads — one for the One-Off Charge and one for the Recurring Bill.
Upload 1 — One-Off Charge Bill (Study Tour Fee)
File name: rachma-study-tour-2025
Rachma
6281234567890
122333
BILL-TOUR-001
Study Tour Fee
Study Tour November 2025
student_id=122333;class=3B
IDR
300000
Upload 2 — Recurring Bill (Monthly Extracurricular Fee)
File name: rachma-extracurricular-2025
Rachma
6281234567890
122333
BILL-EXCUL-001
Extracurricular Fee
Monthly Extracurricular 2025–2026
student_id=122333;class=3B
IDR
50000
INTERVAL
1m
20250901
AFTER_X_TIMES
12
What this configuration does:
cycle_type=INTERVALwithinterval=1m— invoice is issued once a month from the start datestart_date=20250901— first invoice issued on 1 September 2025end_date_type=AFTER_X_TIMESwithend_date=12— billing automatically stops after 12 invoices, covering the full academic year
Notice that beneficiary_identifier (122333) is the same across both bills. This is Rachma's student ID used as a reference — it links both billing records to the same student in your records, even though they are in separate files.
Before uploading, check the following — these are the most common causes of file rejection:
Phone numbers Use the international format with country code — Indonesia: 628xxx, Malaysia: 60xxx. Never start with 0. Numbers must be numeric only, no spaces or dashes.
Commas in values Avoid commas (,) in any column. In CSV format, commas are treated as column separators and will split your data into the wrong columns. Use semicolons (;) only inside bill_detail.
Excel formulas Do not leave formula cells in the file. If you used formulas to calculate values, copy the entire sheet and paste as values only (Paste Special → Values) before saving.
bill_detail format Every entry must follow parameter=value format. Separate multiple pairs with ;. Maximum 10 pairs per row. Example: student_id=122333;class=3A;month=April.
Amounts Enter plain numeric values only — no currency symbols, dots as thousand separators, or spaces. Correct: 500000. Incorrect: Rp 500.000.
Dates (Recurring only) All dates must follow YYYYMMDD format. start_date must be today or a future date. end_date must be after start_date.
Interval format (Recurring only) Valid units are d (day), m (month), and y (year) only. No other units are accepted. Number must be between 1 and 999. Example: 7d, 1m, 1y.
Upload the File
Drag and drop your billing file into the upload area, or click Select from your computer.

The system validates the file immediately upon upload. If errors are found, an Error List is displayed showing the error reason, row number, and column for each issue:


Fix the errors and click Re-upload File to resubmit.
Validation error reference:
The following errors are the most commonly encountered when uploading a billing file. Errors are shown in the Error List with the affected row and column.
File-Level Errors — The entire file is rejected before any rows are processed.
File format not supported
File is not CSV, XLS, or XLSX
Convert and re-save in a supported format
File size exceeds limit
File is larger than 50 MB
Remove unnecessary columns or rows, or split into multiple files
Row count exceeds limit
File contains more than 1,000 data rows
Split into multiple files of ≤1,000 rows each
Duplicate file name
A file with the same name has already been uploaded
Rename the file — e.g., append a date or batch number
File is empty
The file contains no data rows
Add billing records to the file
Column & Format Errors — Specific rows or columns fail validation.
Required data is empty
Any mandatory column
A required field is blank in one or more rows
Fill in all mandatory fields — see column reference above
Value exceeds character limit
beneficiary_name, bill_service_title, bill_identifier, others
Value is longer than the column's maximum character length
Shorten the value to fit within the limit
Invalid character in value
Any column
Value contains a comma (,), which is treated as a column separator
Remove commas from all values; use semicolons (;) only in bill_detail
Value comply safe string
beneficiary_name, bill_detail, others
Value contains a disallowed symbol or special character
Remove symbols not permitted for that column — names allow only spaces and '
Formula detected
Any column
Cell contains an Excel or Sheets formula instead of a plain value
Copy the cells and paste as values only (Paste Special → Values)
Data Integrity Errors — Values are in the correct format but fail business logic validation.
Invalid phone number format
beneficiary_phone
Phone number starts with 0 or contains non-numeric characters
Use the international format — Indonesia: 628xxx, Malaysia: 60xxx
Invalid currency code
currency
Currency code is not a recognized 3-letter ISO code
Use IDR for Indonesian Rupiah or MYR for Malaysian Ringgit
Amount is not a valid number
amount
Amount contains a currency symbol, comma, or space (e.g., Rp 500.000)
Use plain numeric value only — e.g., 500000
Amount is zero or negative
amount
Amount value is 0 or below
Enter a positive amount greater than zero
Recurring Bill Errors — Apply only to recurring bill uploads.
Invalid start date
start_date
Start date is before the upload date, or not in YYYYMMDD format
Use YYYYMMDD format; start date must be today or a future date
Invalid end date
end_date
End date is before or equal to the start date, or not in YYYYMMDD format
End date must be after the start date in YYYYMMDD format
Missing interval value
interval
cycle_type is INTERVAL but interval column is empty
Fill in the interval — e.g., 7d for every 7 days, 1m for monthly
Invalid interval format
interval
Interval does not follow the [number][unit] format, unit is not d, m, or y, or number is outside the 1–999 range
Use format: 1d, 30d, 1m, 1y — number must be between 1 and 999
Missing date value
date
cycle_type is SPECIFIC_DATE but date column is empty
Enter the billing day(s) of the month — e.g., 5 or 1;15
Invalid end date type
end_date_type
Value is not one of the accepted enum values
Use exactly: AFTER_X_TIMES, SPECIFIC_DATE, or NEVER
Missing end date value
end_date
end_date_type is AFTER_X_TIMES or SPECIFIC_DATE but end_date is empty
For AFTER_X_TIMES: enter the number of cycles (e.g., 12). For SPECIFIC_DATE: enter the date in YYYYMMDD
bill_detail Errors — Apply only when the optional bill_detail column is used.
Missing = separator
An entry does not follow the parameter=value format
Ensure every entry contains exactly one = sign — e.g., class=3A
Exceeds 10 pairs
More than 10 key-value pairs are separated by ; in a single cell
Reduce to a maximum of 10 pairs per row
Contains comma in value
A value within a parameter=value pair contains a comma
Replace commas within values with a different separator or rephrase the value
Configure Invoice Settings
1. Invoice Preferences
Click Manage invoice preferences to customize how invoices appear to your customers:
Logo
Upload your company logo — appears on all invoices and receipts
Template
Select from available invoice layout templates
Fee Payer
Configure whether the payment service fee is absorbed by the merchant or passed through to the customer

2. WhatsApp Distribution Setup (only if WhatsApp is selected as distribution channel)
Ensure DOKU PayChat is active with a registered WhatsApp Business Account
Select the PayChat Invoice Template and PayChat Receipt Template

Map each template variable to its corresponding billing data field (e.g.,
{{1}}→beneficiary_name,{{2}}→bill_service_title)

Preview the WhatsApp message to verify the content before submitting
Submit
Click the red Create Bill button to submit.
FlexiBill processes the file and begins issuing invoices. Processing time varies by file size — for large files, allow a few minutes before checking results.
To monitor the status of each invoice, navigate to Subscription and Billing → Bill and refresh the page. Each record will show its current Activity Log state — from Invoice In Process through to Invoice Sent.
👉 View Subscription Billing for full monitoring instructions.
What's Next
👉 View Subscription Billing — Monitor invoice delivery and payment status per customer
👉 Invoice and Receipt — Learn how customers receive, pay, and get receipts
👉 Host-to-Host Integration — Automate bill creation programmatically via API
FAQ
How do customers pay their bills?
Customers receive an invoice via Email or WhatsApp containing a unique payment link. They click the link, review the invoice details, and select an available payment method to complete the transaction. Payment methods available depend on your DOKU account configuration.
Is the payment link the same for every billing cycle?
No. Each billing cycle generates a completely unique payment link. A link from a previous cycle cannot be used to pay the current bill.
Can I reuse the same file name for a different billing upload?
No. Every upload must use a unique file name. If you attempt to upload a file with a name that has been used before, the system will reject it. Add a date or batch number to the file name to keep them unique (e.g., tuition-jan-2026, tuition-feb-2026).
Can I upload multiple files in one session?
Each file must be uploaded as a separate Create Bill action. There is no batch submission of multiple files in a single session. Each upload generates its own set of invoices and is tracked independently in the Bill list.
What happens if only some rows in my file have errors?
The entire file is rejected if any row fails validation — FlexiBill does not process partial files. The Error List will show every row and column that contains an issue. Fix all errors in the file and re-upload the complete corrected file.
How do I fill in the bill_detail column?
bill_detail is optional. If used, each entry must follow the parameter=value format, with multiple pairs separated by ;. Maximum 10 pairs per record.
Example: student_id=122333;class=3A;month=April
Do not use commas anywhere in this column — commas are treated as column separators and will cause a validation error.
Can I apply different invoice terms to different customers in the same file?
No. The Invoice Term and Grace Period selected during upload apply uniformly to all records in the file. If different customers require different payment terms, submit them as separate uploads — one per term configuration.
What happens after I submit — how do I know if invoices were sent?
After submission, each bill record is processed individually. Navigate to Subscription and Billing → Bill and check the Activity Log column:
Invoice In Process— system is generating the invoiceInvoice Sent— invoice successfully delivered to the customerInvoice Error— delivery failed, typically due to insufficient deposit balance
If you see Invoice Error, top up your deposit balance and the system will automatically retry delivery.
Last updated
Was this helpful?
