Skip to main content
Invoicing is Meow’s accounts-receivable surface. You define the products you sell and the customers you bill, then combine them into an invoice — its line items, due date, the payment methods you’ll accept, and the account that collects the money. Meow emails the invoice to the customer on its invoice date and tracks it through to paid.
Only bank transfer is enabled by default. Card, ACH direct debit, and USDC payment methods must be turned on for your business before you can add them to an invoice. Test the whole flow in the sandbox before going live.

You’ll need

  • An API key with the billing scopes for the resources you touch:
    • billing:products:read / billing:products:write for products
    • billing:customers:read / billing:customers:write for customers
    • billing:invoices:read / billing:invoices:write for invoices
    • billing:accounts:read to list collection accounts

1. Create or find a product

A product is a reusable good or service with a default price. List what you already have — GET /billing/products returns a bare array:
curl https://api.meow.com/v1/billing/products -H "x-api-key: $MEOW_API_KEY"
Response
[
  { "id": "prod_9f8e7d6c", "name": "Catnip Consulting", "description": "Advisory retainer", "default_price": "150.00" }
]
Create a new one when you need it:
curl -X POST https://api.meow.com/v1/billing/products \
  -H "x-api-key: $MEOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Catnip Consulting", "description": "Advisory retainer, billed hourly", "default_price": 150.00 }'
Response
{ "id": "prod_9f8e7d6c", "name": "Catnip Consulting", "description": "Advisory retainer, billed hourly", "default_price": "150.00" }
Save the product id — you’ll reference it from each invoice line item.

2. Create or find a customer

A customer is who you invoice. POST /billing/customers needs a nickname and email; an address is optional but appears on the invoice when present.
curl -X POST https://api.meow.com/v1/billing/customers \
  -H "x-api-key: $MEOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "nickname": "Purrfect Partners",
    "email": "billing@purrfectpartners.com",
    "address": {
      "street_line_1": "9 Whisker Way",
      "street_line_2": "Suite 200",
      "city": "San Francisco",
      "state": "CA",
      "postal_code": "94105",
      "country": "US"
    }
  }'
Response
{
  "id": "cust_4a5b6c7d",
  "nickname": "Purrfect Partners",
  "email": "billing@purrfectpartners.com",
  "address": { "street_line_1": "9 Whisker Way", "street_line_2": "Suite 200", "city": "San Francisco", "state": "CA", "postal_code": "94105", "country": "US" },
  "created_time": "2026-06-30T10:30:00.000Z",
  "updated_time": null
}
Save the customer id for the invoice. GET /billing/customers lists your existing customers as a bare array.

3. Choose the payment methods

Check which payment methods are enabled for your business. The response lists them under allowed_types:
curl https://api.meow.com/v1/billing/payment-method-types -H "x-api-key: $MEOW_API_KEY"
Response
{ "allowed_types": ["BANK_TRANSFER", "CARD", "ACH_DIRECT_DEBIT"] }
BANK_TRANSFER is always available. CARD, ACH_DIRECT_DEBIT, INTERNATIONAL_WIRE, and the USDC/USDT variants only appear once enabled for your business. Card and ACH direct debit also require customer consent to charge.

4. Pick a collection account

Collection accounts are where invoice payments land. List the accounts available to receive funds:
curl https://api.meow.com/v1/billing/accounts -H "x-api-key: $MEOW_API_KEY"
Response
{
  "accounts": [
    { "id": "acct_1a2b3c4d", "display_name": "Primary Operating Account", "account_number_mask": "••1234", "status": "open", "is_primary": true, "banking_product": "GRASSHOPPER" }
  ]
}
Use the account id as collection_account_id on the invoice.

5. Create the invoice

Combine the pieces into an invoice. Each line item points at a product_id and a quantity; omit price or description to inherit the product’s defaults, and add a discount_percentage for a per-line discount.
curl -X POST https://api.meow.com/v1/billing/invoices \
  -H "x-api-key: $MEOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_id": "cust_4a5b6c7d",
    "line_items": [
      {
        "product_id": "prod_9f8e7d6c",
        "quantity": 10,
        "price": 150.00,
        "description": "10 hours of advisory work",
        "discount_percentage": 10,
        "discount_description": "Early-payment discount"
      }
    ],
    "invoice_date": "2026-06-30",
    "due_date": "2026-07-30",
    "payment_method_types": ["BANK_TRANSFER", "CARD"],
    "send_email_on_creation": true,
    "additional_recipient_emails": ["ap@purrfectpartners.com"],
    "note": "Thanks for your business!",
    "name": "INV-2026-001",
    "collection_account_id": "acct_1a2b3c4d",
    "show_contact_address": true
  }'
Response
{
  "id": "inv_7c8d9e0f",
  "name": "INV-2026-001",
  "customer_id": "cust_4a5b6c7d",
  "status": "Open",
  "amount": "1350.00",
  "amount_paid": "0.00",
  "amount_due": "1350.00",
  "line_item_ids": ["line_2b3c4d5e"],
  "invoice_date": "2026-06-30",
  "due_date": "2026-07-30",
  "payment_method_types": ["BANK_TRANSFER", "CARD"],
  "collection_account_id": "acct_1a2b3c4d",
  "created_at": "2026-06-30T10:30:00.000Z",
  "sent_at": "2026-06-30T10:30:01.000Z"
}
FieldDescription
customer_idRequired. The customer being invoiced.
line_itemsRequired. Each references a product_id and quantity; price/description default to the product, and discount_percentage applies a per-line discount.
invoice_date / due_dateRequired. The date the invoice is scheduled to be sent and the date payment is due (YYYY-MM-DD).
payment_method_typesRequired. The methods to accept — a subset of allowed_types.
send_email_on_creationRequired. Whether to email the customer (and additional_recipient_emails) on the invoice_date. Despite the name, the email is sent on invoice_date, not at create time.
collection_account_idRequired. The account that collects payment.
additional_recipient_emailsExtra addresses to copy on the invoice and its receipts.
recurring_scheduleAn RFC 2445 RRULE to send the invoice on a repeating schedule.
Use today’s invoice_date to send the invoice now, or a future date to schedule it — the invoice stays Scheduled and the email goes out on the invoice_date.

6. Send invoices on a recurring schedule

For subscriptions or retainers, pass a recurring_schedule as an RFC 2445 RRULE when you create the invoice, and Meow issues each occurrence on schedule.
{ "recurring_schedule": "FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=1" }
A tool like the RRULE generator makes it easy to build and preview the schedule string.

7. Retrieve and track invoices

Fetch one invoice with GET /billing/invoices/{invoice_id}, list them all with GET /billing/invoices (a bare array), or download the PDF from GET /billing/invoices/{invoice_id}/download. Each invoice reports its status alongside amount, amount_paid, and amount_due:
statusMeaning
DraftCreated but not yet sent.
OpenSent and awaiting payment.
PendingA payment is in progress.
ScheduledQueued to send on a recurring schedule.
Partially PaidSome, but not all, of the balance is paid.
PaidPaid in full; see paid_at.
OverduePast due_date and still unpaid.
Canceled / ExpiredVoided or lapsed before payment.

End to end

# 1. Create a product and capture its id.
PRODUCT_ID=$(curl -s -X POST https://api.meow.com/v1/billing/products \
  -H "x-api-key: $MEOW_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"Website Build","description":"Custom website development","default_price":5000.00}' \
  | jq -r .id)

# 2. Create the customer.
CUSTOMER_ID=$(curl -s -X POST https://api.meow.com/v1/billing/customers \
  -H "x-api-key: $MEOW_API_KEY" -H "Content-Type: application/json" \
  -d '{"nickname":"Purrfect Partners","email":"billing@purrfectpartners.com"}' \
  | jq -r .id)

# 3. Pick the first available collection account.
ACCOUNT_ID=$(curl -s https://api.meow.com/v1/billing/accounts \
  -H "x-api-key: $MEOW_API_KEY" | jq -r '.accounts[0].id')

# 4. Create and send the invoice.
curl -s -X POST https://api.meow.com/v1/billing/invoices \
  -H "x-api-key: $MEOW_API_KEY" -H "Content-Type: application/json" \
  -d "{
    \"customer_id\": \"$CUSTOMER_ID\",
    \"line_items\": [ { \"product_id\": \"$PRODUCT_ID\", \"quantity\": 1, \"description\": \"Website build - phase 1\" } ],
    \"invoice_date\": \"$(date +%Y-%m-%d)\",
    \"due_date\": \"$(date -v+30d +%Y-%m-%d 2>/dev/null || date -d '+30 days' +%Y-%m-%d)\",
    \"payment_method_types\": [\"BANK_TRANSFER\"],
    \"send_email_on_creation\": true,
    \"collection_account_id\": \"$ACCOUNT_ID\"
  }" | jq '{ id, status, amount_due }'

See also

Create a product

Full request contract for POST /billing/products.

Create a customer

Register who you invoice, with an optional address.

Create an invoice

Line items, discounts, payment methods, and scheduling.

List collection accounts

The accounts that can receive invoice payments.