Skip to main content
An invoice in Kibble is a formal billing document with line items, a due date, and a unique invoice number. When you create one, Kibble generates a PDF, emails it to your vendor, and provisions a deposit address to receive payment. Once your vendor sends USDC on Base, Kibble updates the invoice status and sends you a payment confirmation email. If you configure a webhook URL, Kibble also POSTs a signed payload to your server.

Invoice number format

Invoice numbers follow the format INV-XXXX where XXXX is a zero-padded counter that increments per merchant. Your first invoice is INV-0001, the second is INV-0002, and so on. The counter is tied to your merchant email, so it persists across CLI sessions and API calls.

Creating an invoice

Run npx create-kibble and select kibble invoice when prompted. The CLI walks you through each field in sequence.
You will be asked for your business address, the vendor’s name and email, line items, a due date, and where payments should land.

Invoice fields

Merchant fields

These fields identify you as the billing party and appear on the PDF.

Vendor fields

These fields identify the party being billed.

Line items

Each line item has three fields. You can include between 1 and 30 line items per invoice. The total for each line is quantity × unit_price. Kibble sums all line totals to produce the total_amount.

Dates and metadata

Payment and automation

Downloading the PDF

The PDF is available at:
The invoice_id is returned when you create the invoice. The PDF is also attached to the email sent to your vendor.

Invoice statuses

Invoices move through a separate status lifecycle from payment links.
An invoice moves from draft to sent automatically when you create it with send_now: true (the default). If you create with send_now: false, the invoice sits in draft until you trigger sending via the API.

Immutable fields

Invoice records are append-only for audit purposes. The following fields never change after creation, even if you update your merchant profile:
  • merchant_name_snapshot
  • merchant_address_snapshot
  • invoice_number
This ensures that a printed or downloaded PDF always matches the database record.

Webhooks

If you pass a webhook_url, Kibble POSTs a signed JSON payload to that URL when the invoice status changes to paid, partial, or excess.
The request includes an X-Kibble-Signature header formatted as sha256={hex}. Verify it using the webhook_secret returned when you created the invoice. See Webhooks for verification details.