10. Billing & Payments
10.1 How Billing Works

The billing system operates on a ledger model. Every financial event creates an immutable financial transaction on the customer's ledger:
- Service charges (positive — customer owes more)
- Payments received (negative — customer owes less)
- Credits (negative — customer owes less)
- Late fees (positive — customer owes more)
- Refunds (negative — reduces a previous payment)
- Sales tax (positive — added to charges)
The customer's current balance is the sum of all their financial transactions. A positive balance means they owe money; a negative balance means they have a credit.
10.2 Invoices
In Per-Service Mode:
- An invoice is automatically generated when a service is completed and charged.
- Each invoice has a unique number (e.g., INV-2026-0042), line items, subtotal, tax, and total.
- Invoices can be downloaded as PDF or viewed in the customer portal.
In Monthly Statement Mode:
- Invoices are generated from closed monthly statements (see 10.4).
Invoice Status:
- Draft — created but not yet sent.
- Open — sent to the customer, awaiting payment.
- Paid — full payment received.
- Partial — a partial payment has been applied, but a balance remains.
- Overdue — past the due date with an outstanding balance.
- Refunded — the invoice payment has been refunded.
- Canceled — the invoice has been voided.
10.3 Charges dated in the future — the "Scheduled" badge
Some charges are posted before the money is due. That happens when you sell a one-off job and choose Now, dated… with a date still to come (see Section 8), or when you post-date a charge yourself.
A charge like that sits on the customer's account marked Scheduled. It means: this is agreed, but it isn't due yet.
While a charge is Scheduled:
- It shows on the customer's Billing page so you and your staff can see it's coming.
- It is not counted in their current balance.
- It does not appear on their statement, so the customer isn't billed for it early.
On the date you set, it stops being Scheduled and behaves like any other charge — it joins the balance and appears on the statement covering that date.
Changing the date: open the charge and edit its date. Useful when a customer asks to be billed later.
Watch out: Scheduled is not the same as unpaid. A Scheduled charge isn't overdue and shouldn't be chased — it simply hasn't come due yet.
10.4 Statements (Monthly Mode)

If you're using the Monthly Statement billing method:
- Each statement covers a period (e.g., March 1–31).
- During the period, all completed services, credits, payments, and fees are recorded as financial transactions.
- At the end of the period, the statement is closed with:
- Opening balance (carried from previous statement)
- All transactions for the period
- Closing balance
- The statement can be:
- Emailed to the customer automatically.
- Downloaded as PDF.
- Viewed in the customer portal.
Statement Day: Set the anchor day of the month for statements and due dates (1–28). Configure this in Settings > Company.
Statement Integrity: Each statement has a cryptographic signature to ensure transaction data hasn't been altered.
10.5 Autopay
Autopay automatically charges a customer's saved payment method when an invoice is due.
Enabling Autopay for a Customer:
- The customer saves a payment method (credit card, or PayPal) — either through the portal or you can add it on their behalf. Automatic payments run on cards and PayPal; bank transfers are for one-off payments (see 10.11).
- The customer opts in to autopay.
- Mark one payment method as the default autopay method.
- When an invoice is due, the system automatically charges the default method.
Autopay Retry Schedule: If a payment fails (e.g., declined card), the system retries according to your configured retry schedule. For example:
- Retry 1: 3 days after failure
- Retry 2: 7 days after failure
- Retry 3: 14 days after failure
After all retries are exhausted, the system can optionally disable autopay for that customer and send a notification.
10.6 Manual Payments
You can record payments made outside the system:
- Open the customer's billing tab.
- Click Record Payment.
- Enter the amount, date, and payment method:
- Cash
- Check (enter check number)
- Venmo
- Wire transfer
- Other
- The payment is posted to the customer's ledger and reduces their balance.
10.7 Credits & Debits
Issuing a Credit:
- Use credits for adjustments, goodwill discounts, or promotional offers.
- Open the customer's info page, go to the Billing tab, then click the Credit sub-tab.
- Enter the amount, reason, and description.
- The credit is posted as a negative transaction, reducing the customer's balance.
Issuing a Debit (Manual Charge):
- Use debits for one-time charges outside of regular services (e.g., repair charges, supply fees, service call fees).
- Open the customer's info page, go to the Billing tab, then click the Charge sub-tab.
- Enter the amount, customer, and description.
- The charge is posted as a positive transaction, increasing the customer's balance.
Confirmation Thresholds: To prevent accidental large credits or refunds, you can set a confirmation threshold (e.g., require confirmation for credits over $500) in Settings.
10.8 Refunds
To refund a payment:
- Open the customer's billing tab and find the payment.
- Click Refund.
- Enter the refund amount (full or partial).
- Select a reason: Duplicate, Service Not Rendered, Goodwill, Pricing Error, or Other.
- Add optional notes.
- The refund is processed through the original payment gateway and recorded on the ledger.
10.9 Late Fees
If late fees are enabled (see 2.6), they are automatically applied when:
- An invoice is past its due date.
- The grace period has elapsed (e.g., 15 days after due date).
- The invoice still has an outstanding balance.
Late fees appear as a separate Late Fee transaction on the customer's ledger. The fee amount depends on your configuration (flat amount or percentage of balance, with an optional maximum cap).
Per-Subscription Override: You can override the late fee grace period on individual subscriptions. For example, give a long-standing customer a longer grace period without changing the company-wide default.
10.10 Failed Payments & Retry Logic
When an autopay charge fails:
- The payment is recorded with a Failed status.
- The customer's autopay failure count is incremented.
- The system schedules a retry based on your retry schedule (Settings > Company, Payments section).
- If configured, the customer receives a notification about the failed payment.
- If all retries are exhausted:
- Autopay can be automatically disabled for the customer.
- An admin alert is generated so your team is aware.
- The subscription may be auto-paused if you've enabled that feature.
10.11 Bank Transfers (ACH)
If you have enabled bank transfers (Settings > Payments — see 2.2), customers see a second button in the portal: Pay by bank. It suits large invoices, where the fee saving is real — typically 0.8% capped at $5, against roughly 2.9% + 30¢ on a card.
This runs entirely on your own Stripe account. EZ Pool Biller never touches the money. It is worth being clear about what that means in practice:
- The feature must be switched on in Stripe, not only here. ACH Direct Debit has to be active on your Stripe account before the option appears (see 2.2). Stripe may review your account first.
- The money lands in your Stripe balance and pays out to your bank on your Stripe payout schedule — exactly like your card takings. Changing when you get paid is a Stripe setting, not a EZ Pool Biller one.
- Stripe sets the fee, not us. The percentages in this manual are Stripe's published ACH pricing at the time of writing; your own rate is whatever your Stripe agreement says. The ACH fee you configure in EZ Pool Biller is a separate thing — it is what you choose to pass on to the customer.
- Bank details never reach EZ Pool Biller. The account is confirmed on Stripe's own secure screen, and we only ever store the bank name and last four digits for display.
- Refunds, disputes and payout questions are Stripe's records. We show what happened on the customer's ledger; the authoritative history — and anything you need to contest a dispute — lives in your Stripe dashboard.
If you close or disconnect your Stripe account, bank payments stop working immediately, in the same way card payments would.
What the customer does: they choose the bank option, sign in to their bank through Stripe's secure screen to confirm the account, and approve the payment. They never type an account number into EZ Pool Biller, and we never see or store it.
The one thing to know: bank transfers are not instant.
| Card | Bank transfer (ACH) | |
|---|---|---|
| Money confirmed | Seconds | 3–5 business days |
| Typical cost | ~2.9% + 30¢ | 0.8%, capped at $5 |
| Maximum payment | $5,000 | $25,000 |
Between the customer approving and the money clearing, the payment sits in a pending state:
- The customer sees "payment on its way" on their dashboard, and their balance still shows the amount owed.
- The balance is not reduced yet — reducing it before the money arrives would be wrong if the transfer later fails.
- No late fee is charged on a balance a pending bank payment covers, so a customer who pays on the last day is not penalised for the clearing time.
When the money clears, the payment posts to the ledger and the balance drops, dated to the day the customer paid — not the day it cleared. Their statement reads as if it landed when they authorised it.
If a transfer fails (closed account, insufficient funds, a bank return), nothing is posted to the ledger, the balance stays open, and both the customer and your team are emailed. Bank returns can arrive several days after the payment, which is why the balance stays visible until the money is genuinely confirmed.
Disputes: if a customer disputes a settled bank payment, the payment is flagged for manual review rather than reversed automatically, and your team is alerted. Review their ledger and record a refund if that is the right outcome.
Automatic payments currently run on cards and PayPal only. Bank transfers are for one-off payments — a customer can pay any bill from their bank whenever they like, but cannot yet put a bank account on autopay.