Navigation

Milestone Billing for Projects

Bill clients per project phase with built-in payment approval

Goal: Set up project billing where each milestone generates an invoice the client reviews and approves before payment. The client_confirm capture mode ensures explicit acknowledgement of each charge.

What You'll Need

Trigger Billing (Event mode, client_confirm) — On-demand billing with client approval
Billing Customers — Client's payment identity
Charge Now — Fire the trigger from the UI when a milestone is complete

Steps

Create a milestone item

Edge > Billable Items > New Item. Trigger type. Mode: Event, Capture: Client Confirms Payment, Price: $5,000 (default), Allow Override: Yes, Max Capture: $25,000. Description: 'Project milestone — client reviews and pays'.

Set up the client

Create a billing customer for the project client with payment method and trigger permissions.

Enroll the client

Enroll in the milestone item. One enrollment covers all milestones — fire once per phase with specific amount and description.

Complete a milestone and fire

When a phase is done, open the billing customer, click Charge Now. Select the milestone item. Enter amount (e.g., $4,500) and description (e.g., 'Phase 2: Homepage designs — delivered March 15'). Click Send Invoice.

Client reviews and pays

Client receives email with invoice, amount, description, and Pay Now button. Reviews the work, confirms, clicks Pay Now.

Track milestone payments

Each charge appears in billing customer history and revenue dashboard. The evidence trail (invoice date, Pay Now click, IP) is recorded automatically.

Result

Each milestone generates a client-approved invoice. The client sees what they are paying for, clicks to approve, and the payment is recorded with full evidence. Strong position if a dispute ever arises.

Variations

Fixed milestone amounts

Use Fixed mode if all milestones are the same price. Amount locked at creation.

API-triggered milestones

Fire via POST /apis/edge/trigger/fire.php with override_amount and override_description instead of the UI.

Important: The client_confirm flow is designed for chargeback protection. The client's Pay Now click creates a timestamped acknowledgement that is difficult to dispute.

Was this article helpful?

NotebookLM Overviews