providers/claude/plugin/skills/apideck-mcp-receive-payment/SKILL.md
Task playbook for recording a customer payment against an invoice via the Apideck MCP server's `apideck-receive-customer-payment` workflow tool. Use when the user says a customer paid an invoice and wants the accounting service updated. AR mirror of `apideck-pay-bill` — same shape, opposite ledger side. Different unified endpoint, different counterparty (customer vs supplier), different allocation type.
npx skillsauth add apideck-libraries/api-skills apideck-mcp-receive-paymentInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
When the user wants to record a payment against an existing invoice, prefer apideck-receive-customer-payment over stitching accounting-invoices-get + accounting-payments-create manually. The workflow tool fetches the invoice, reads its outstanding balance, builds the right allocation with type: "invoice", and surfaces structured errors with failingStep.
| User intent | Tool |
|---|---|
| "Customer paid invoice 4", "Apply $500 to invoice 12 from ACME", "Record receipt for invoice 99" | apideck-receive-customer-payment ✓ |
| "Pay vendor bill X" | apideck-pay-bill (AP — accounts payable, different unified endpoint) |
| "Create an unallocated customer prepayment" | accounting-payments-create directly (no allocation) |
| "Show me unpaid invoices" | accounting-invoices-list with filter[status]=open |
payment_method capitalized for QuickBooks: "Check", "CreditCard", "Cash". Lower-case fails JSON parsing. Other connectors accept lower-case ("check", "ach", "wire").amount to settle the full outstanding balance. The workflow defaults to the invoice's balance (outstanding), not the gross total, so partial-paid invoices don't get over-settled. Only pass amount when the user explicitly wants a partial payment.apideck-pay-bill. Customer payments (someone owes you) → apideck-receive-customer-payment → accounting-payments-create. Vendor bills (you owe someone) → apideck-pay-bill → accounting-bill-payments-create. The unified APIs split AR and AP into separate endpoints; the wrong one will be rejected by the connector with confusing error messages (e.g. QuickBooks: VendorRef missing when there's a customer on the other side).x-apideck-service-id when the consumer has multiple accounting connections.| Arg | Required | Default | Notes |
|---|---|---|---|
| invoice_id | yes | — | From accounting-invoices-list. |
| account_id | yes | — | The deposit account that received the payment. From accounting-ledger-accounts-list. Often a bank or undeposited-funds account. |
| amount | no | invoice's outstanding balance | Pass smaller for a partial payment. |
| transaction_date | no | today (YYYY-MM-DD) | Some connectors reject future dates. |
| payment_method | no | — | QB requires capitalized. |
| reference | no | — | Memo / external reference. |
| x-apideck-service-id | no | first accounting connection | E.g. "xero", "quickbooks". |
{
"invoice_id": "inv-42",
"payment_id": "pay-77",
"amount": 250.50,
"currency": "EUR",
"transaction_date": "2026-04-26",
"invoice_total": 250.50,
"partial": false,
"service_id": "xero"
}
partial: true indicates an under-payment; tell the user a follow-up payment is needed for the rest.
isError: true){
"invoice_id": "inv-42",
"amount": 100,
"currency": "USD",
"error": "accounting-payments-create failed: ...",
"failingStep": "accounting-payments-create",
"upstream": { ... }
}
failingStep values:
accounting-invoices-get — invoice ID wrong or connector lost the recordvalidate-amount — invoice has zero outstanding balance (already paid)accounting-payments-create — payment write failed; check upstreamUser: "ACME paid invoice inv-42 for $250.50 by check. Apply it to our bank account."
accounting-ledger-accounts-list filtered to bank — say "acc-bank".{
"name": "apideck-receive-customer-payment",
"arguments": {
"invoice_id": "inv-42",
"account_id": "acc-bank",
"payment_method": "check",
"x-apideck-service-id": "xero"
}
}
payment_id to the user.| Symptom | Cause | Fix |
|---|---|---|
| failingStep: validate-amount | Invoice already fully paid | Confirm with user; pass explicit amount only if recording an over-payment is intentional |
| Moneybird returns 404 from /accounting/payments | Moneybird models customer payments as financial_mutations, not payments | Connector coverage gap; surface the limitation, fall back to the Proxy API |
| QB rejects with parse error | payment_method lower-case | Pass "Check" (capitalized) for QB |
| UrlElicitationRequiredError | Connection expired/missing | Surface consent URL, retry after OAuth |
apideck-mcp — front-door skillapideck-mcp-pay-bill — AP mirror (paying a vendor bill)development
Jira Teams via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Teams's native API. Use when the user wants to call Jira Teams (no unified API resource mapping). Routes through Apideck with serviceId "jira-teams".
development
Jira Service Desk via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Service Desk's native API. Use when the user wants to call Jira Service Desk (no unified API resource mapping). Routes through Apideck with serviceId "jira-service-desk".
development
Jira Data Center via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Data Center's native API. Use when the user wants to call Jira Data Center (no unified API resource mapping). Routes through Apideck with serviceId "jira-data-center".
development
JetBrains YouTrack via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to JetBrains YouTrack's native API. Use when the user wants to call JetBrains YouTrack (no unified API resource mapping). Routes through Apideck with serviceId "jetbrains-youtrack".