agentleFS
apideck-librariesapideck-libraries/api-skills/skills/apideck-mcp-receive-payment/SKILL.md

apideck-mcp-receive-payment

Skill4 starsChanged 3 months agoApache-2.0View on GitHub

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.

The file

We split this skill into the rules it gives an agent

2 rules. About 0 are common, 0 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    When the user wants to record a payment against an existing invoice, prefer apideck-receive-customer-payment over stitching …

    line 13
  2. Very specific:

    SET x-apideck-service-id: when the consumer has multiple accounting connections.

    line 30

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Receive a customer payment (Apideck MCP)

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.

When this is the right tool

User intentTool
"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

IMPORTANT RULES

  • CONFIRM before calling. Receive-payment is mutating and not idempotent — calling twice creates two payments on the connected service. Always show the user the invoice total, currency, deposit account, and customer, and wait for explicit confirmation before invoking.
  • PASS payment_method capitalized for QuickBooks: "Check", "CreditCard", "Cash". Lower-case fails JSON parsing. Other connectors accept lower-case ("check", "ach", "wire").
  • OMIT 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.
  • DON'T confuse with 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).
  • SET x-apideck-service-id when the consumer has multiple accounting connections.

Argument map

ArgRequiredDefaultNotes
invoice_idyes—From accounting-invoices-list.
account_idyes—The deposit account that received the payment. From accounting-ledger-accounts-list. Often a bank or undeposited-funds account.
amountnoinvoice's outstanding balancePass smaller for a partial payment.
transaction_datenotoday (YYYY-MM-DD)Some connectors reject future dates.
payment_methodno—QB requires capitalized.
referenceno—Memo / external reference.
x-apideck-service-idnofirst accounting connectionE.g. "xero", "quickbooks".

Result shape

Success

{
  "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.

Failure (with 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 record
  • validate-amount — invoice has zero outstanding balance (already paid)
  • accounting-payments-create — payment write failed; check upstream

Worked example

User: "ACME paid invoice inv-42 for $250.50 by check. Apply it to our bank account."

  1. The user already gave you the invoice id. Find the deposit account: accounting-ledger-accounts-list filtered to bank — say "acc-bank".
  2. Confirm: "Recording $250.50 payment from ACME on invoice inv-42 to bank account acc-bank via Xero, payment method check. Confirm?"
  3. On confirmation:
    {
      "name": "apideck-receive-customer-payment",
      "arguments": {
        "invoice_id": "inv-42",
        "account_id": "acc-bank",
        "payment_method": "check",
        "x-apideck-service-id": "xero"
      }
    }
  4. Surface payment_id to the user.

Common failure modes

SymptomCauseFix
failingStep: validate-amountInvoice already fully paidConfirm with user; pass explicit amount only if recording an over-payment is intentional
Moneybird returns 404 from /accounting/paymentsMoneybird models customer payments as financial_mutations, not paymentsConnector coverage gap; surface the limitation, fall back to the Proxy API
QB rejects with parse errorpayment_method lower-casePass "Check" (capitalized) for QB
UrlElicitationRequiredErrorConnection expired/missingSurface consent URL, retry after OAuth

Related

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.