Mark invoices as paid

View as Markdown

This guide walks through how to record payments against invoices in Tabs. Use this when a customer pays outside of a connected payment processor—for example, by check, wire transfer, or ACH initiated from the customer’s bank.

If you use Stripe or Plaid, Tabs reconciles payments automatically and you don’t need to record them manually.

Step 1: Find the invoice

Fetch the customer’s invoices to confirm the invoice is in the SENT status before recording a payment against it.

$curl "https://integrators.prod.api.tabsplatform.com/v3/invoices?filter=customerId:eq:{customerId}&page=1&limit=50" \
> -H "Authorization: YOUR_API_KEY"

Tabs returns a paginated list of invoices for that customer:

1{
2 "payload": {
3 "data": [
4 {
5 "id": "inv_ghi012",
6 "customerId": "cust_abc123",
7 "status": "SENT",
8 "issueDate": "2025-02-01",
9 "dueDate": "2025-03-03",
10 "total": 5000.00,
11 "balanceRemaining": 5000.00
12 }
13 ],
14 "limit": 50,
15 "totalItems": 1,
16 "currentPage": 1
17 },
18 "success": true,
19 "message": "Invoices retrieved successfully",
20 "error": null
21}

Save the invoice id—you’ll use it as {invoiceId} in the next step.

Tabs accepts payments on invoices in the SENT or PARTIALLY_PAID status. Invoices in any other status (for example, DRAFT or VOID) return an error.

Step 2: Record the payment

Call the payments endpoint to record that the payment was received. Tabs records the payment for the remaining balance amount and syncs it to your connected ERP.

$curl -X POST "https://integrators.prod.api.tabsplatform.com/v3/customers/{customerId}/invoices/{invoiceId}/payments" \
> -H "Authorization: YOUR_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{
> "receivedAt": "2025-03-01T00:00:00.000Z",
> "method": "CHECK",
> "reference": "CHK-4521"
> }'
1{}

Tabs marks the invoice as PAID and creates a corresponding payment record in your ERP.

Step 3: Take additional invoice actions

Beyond recording payments, you can take other actions on invoices using the actions endpoint:

$curl -X POST "https://integrators.prod.api.tabsplatform.com/v3/customers/{customerId}/invoices/{invoiceId}/actions" \
> -H "Authorization: YOUR_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{
> "action": "{ACTION}"
> }'

Send a payment reminder

Send a reminder email to the customer’s billing contact:

1{
2 "action": "SEND_REMINDER_EMAIL",
3 "sendReminderEmail": true
4}

Mark an invoice as sent off Tabs

Record that the invoice was sent to the customer through a channel outside of Tabs (for example, emailed manually or sent through another system):

1{
2 "action": "MARK_INVOICE_TO_SENT_OFF_TABS",
3 "markInvoiceToSentOffTabs": true
4}

Retrieve payments

To list all payments across customers, use the global payments endpoint:

$curl "https://integrators.prod.api.tabsplatform.com/v3/payments?page=1&limit=50" \
> -H "Authorization: YOUR_API_KEY"

Filter by invoice, customer, or status using the filter query parameter:

$# Payments for a specific invoice
$curl "https://integrators.prod.api.tabsplatform.com/v3/payments?filter=invoiceId:eq:{invoiceId}&page=1&limit=50" \
> -H "Authorization: YOUR_API_KEY"
$
$# Payments received after a date
$curl "https://integrators.prod.api.tabsplatform.com/v3/payments?filter=receivedAt:gte:2025-02-01T00:00:00.000Z&page=1&limit=50" \
> -H "Authorization: YOUR_API_KEY"

Supported filter fields: receivedAt, status, type, invoiceId, customerId.

Next steps