For the complete documentation index, see llms.txt. This page is also available as Markdown.

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

spinner

Prerequisites

Step-by-Step Guide

1

Choose Bill Type and Distribution Channel

Navigate to Subscription and Billing → Bill, then click Create Bill → Upload File.

Select the bill type:

Type
Description
Use when

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:

Channel
Requirement

Email

Invoice delivered to the customer's email address in the data file

WhatsApp

Invoice delivered to the customer's WhatsApp number in the data file. Requires DOKU PayChat to be activated

2

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:

Option
Due Date

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:

Option
Effect

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.

3

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:

Column
Required
Max Char
Description
Example

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:

Column
Required
Description
Example

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

beneficiary_name
beneficiary_email
beneficiary_phone
beneficiary_identifier
bill_identifier
bill_service_title
bill_service_description
bill_detail
currency
amount

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

beneficiary_name
beneficiary_email
beneficiary_phone
beneficiary_identifier
bill_identifier
bill_service_title
bill_service_description
bill_detail
currency
amount
cycle_type
interval
start_date
end_date_type
end_date

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 = INTERVAL with interval = 1m — invoice is issued once a month from the start date

  • start_date = 20250901 — first invoice issued on 1 September 2025

  • end_date_type = AFTER_X_TIMES with end_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.


4

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.

Error
Cause
Resolution

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.

Error
Affected Column(s)
Cause
Resolution

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.

Error
Affected Column(s)
Cause
Resolution

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.

Error
Affected Column(s)
Cause
Resolution

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.

Error
Cause
Resolution

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

5

Configure Invoice Settings

1. Invoice Preferences

Click Manage invoice preferences to customize how invoices appear to your customers:

Setting
Description

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

6

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

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.

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 invoice

  • Invoice Sent — invoice successfully delivered to the customer

  • Invoice 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.

Is there an automatic reminder before the due date?

FlexiBill currently delivers invoices at the scheduled billing time. Due date reminder notifications — sent to customers before the payment deadline — are planned for a future release.

Last updated

Was this helpful?