# Mark ZenMaid appointments paid and chase unpaid balances

> Your agent matches cash, Venmo and Zelle payments to unpaid ZenMaid appointments, marks them paid and drafts reminders for real balances.

Source: https://cotlet.dev/integrations/zenmaid-api-mcp-server/mark-appointments-paid

Customers pay the cleaner in cash, send Venmo on Sunday night or Zelle on Monday, and ZenMaid still shows every one of those jobs as unpaid. Once a week someone sits with the bank app on one screen and the List View on the other, ticking boxes and guessing who really owes money.

Cotlet does it in your own ZenMaid account with list\_appointments, get\_contact, mark\_appointment\_paid and send\_message, called by your AI agent, an n8n workflow or a script.

[Request access](https://cotlet.dev/app/signup?app=zenmaid) [All ZenMaid tools](https://cotlet.dev/integrations/zenmaid-api-mcp-server)

Hosted · nothing to install or maintain

Official options

## Can ZenMaid do this on its own?

ZenMaid has no API for payments (checked 12 Oct 2026), and Zapier has no ZenMaid actions. ZenMaid itself can mark many appointments paid at once from List View Bulk Actions, but it cannot see Venmo, Zelle or cash, and its help describes no automatic payment reminders: invoices are created and sent by hand.

By hand

## How you do it in ZenMaid today

1. Open Appointments > List View, click Edit filters, set Show to unpaid appointments, choose last week as the time frame and click Apply Filter.
2. Compare each row with the payments received in Venmo, Zelle, PayPal or the cash envelope, matching by customer name and amount.
3. Tick the matched appointments, then choose Bulk Actions > Mark as: Paid. Card payments are skipped, because ZenMaid marks them paid on its own when a card is charged or an invoice is paid online.
4. For what is left, open Reports > Customers Sorted by Unpaid Balance, open each contact and send a reminder from Send message or create an invoice with a payment link.
5. Repeat every week. A Venmo sent under a spouse's name, a tip paid with the job, or one payment covering two cleans is where the match goes wrong, and a customer gets a reminder for a bill they already paid.

With an agent

## How to mark ZenMaid appointments paid and chase unpaid balances

Prompt

```
Here are this week's Venmo and Zelle payments. Mark the matching ZenMaid appointments as paid, then list who still owes us and send them a friendly payment reminder after I check the list.
```

1. 01  
### Start from your payment list, not from ZenMaid  
You paste or forward the week's Venmo, Zelle and cash records. The agent then pulls the unpaid appointments for the same period with list\_appointments, so it only matches against jobs that still show money owed.
2. 02  
### Match carefully, and say how  
A payment matches when name and amount agree. A payment equal to two appointments of the same customer covers both. Partial amounts, different names or amounts that include a tip are not matched automatically; get\_contact shows the customer's other appointments and balance so you can decide.
3. 03  
### Mark only the confirmed matches  
The agent marks the matched appointments paid after your OK and leaves card-paid jobs alone. If one turns out to be paid already, for example because the customer paid an invoice online in the meantime, it is skipped without an error.
4. 04  
### Remind only real balances  
Unmatched appointments older than the grace period you set become the reminder list, with the amount and date of each job. Customers with an open dispute in their notes are left out. Each reminder goes out from your chosen template after you approve the list.

### What you get back

Example data

```
Payments received: 14 (Venmo 8, Zelle 4, cash 2)
Marked paid: 12 appointments, $1,560.00
One Zelle covers two cleans: Martinez 7 Oct and 14 Oct, $240.00
Needs your call: "J. Carter" Venmo $135.00, no customer with that amount
Still unpaid after 7 days: Nguyen $150.00 (3 Oct), Brooks $95.00 (6 Oct)
Reminders sent: 2
```

### Other ways to ask

- Every Monday, list ZenMaid appointments from last week that are still unpaid, grouped by cleaner who collected cash.
- Mark all of Rosa's cash jobs from Saturday as paid; she handed in $480.
- Show me customers whose unpaid balance is over $200, oldest first, without sending anything.

Before you automate it

## What ZenMaid allows, and what to know first

- Marking a ZenMaid appointment as paid never charges the card on file, and an appointment paid by card cannot be marked unpaid or edited afterwards.
- ZenMaid marks an appointment paid automatically when the customer pays its invoice online or when you charge the card, so those jobs drop out of the unpaid filter on their own.
- ZenMaid invoices are created by hand and cannot be automated, and a generated invoice cannot be edited: you void it and create a new one.
- ZenMaid Bulk Actions > Charge Credit Cards in List View is grayed out if any selected appointment has no saved card or no Stripe or Square processor is connected.
- Cleaners cannot mark ZenMaid appointments as paid; it takes an owner or office manager login.

mark\_appointment\_paid and send\_message ask for your OK by default. To run it weekly without you, switch confirmation off for those tools in your dashboard.

Sources: [ZenMaid help: How to Mark Appointments as Paid](https://zenmaid.com/answers/en/articles/1317154-how-to-mark-appointments-as-paid) · [ZenMaid help: How to Reflect an Unpaid Balance](https://zenmaid.com/answers/en/articles/1317838-how-to-reflect-an-unpaid-balance) · [ZenMaid help: How to Create, Send, and Track an Invoice](https://zenmaid.com/answers/en/articles/3190361-how-to-create-send-and-track-an-invoice-in-zenmaid) · [ZenMaid help: Ways Customers Can Be Charged by Card](https://zenmaid.com/answers/en/articles/12099721-ways-customers-can-be-charged-by-card-in-zenmaid)

REST

## Call mark\_appointment\_paid from a script

curl

```
curl https://cotlet.dev/api/v1/zenmaid/mark_appointment_paid \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"appointment_id":"a_991870"}'
```

Example response

```
{
"appointment_id": "a_991870",
"paid": true,
"total": "120.00"
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the tool is zenmaid\_mark\_appointment\_paid. Example data.

[Schedule it in n8n, Make, Zapier or cron](https://cotlet.dev/integrations/zenmaid-api-mcp-server#automations)

Tools

## ZenMaid tools this automation uses

__Cotlet ZenMaid tools used to mark ZenMaid appointments paid and chase unpaid balances__
| Tool | Parameters |
| ----------------------- | -------------------------------------------------------- |
| list\_appointments | from, to, query, paid, include\_cancelled, limit, cursor |
| get\_contact | contact\_id |
| mark\_appointment\_paid | appointment\_id |
| send\_message | appointment\_id, contact\_id, template, channels, body |

[All 13 ZenMaid tools with descriptions](https://cotlet.dev/integrations/zenmaid-api-mcp-server#tools)

## More ZenMaid automations

- [Reassign a ZenMaid cleaner's appointments when they call in sick](https://cotlet.dev/integrations/zenmaid-api-mcp-server/reassign-cleaner-appointments)
- [Reschedule or cancel a day of ZenMaid appointments in bulk](https://cotlet.dev/integrations/zenmaid-api-mcp-server/reschedule-appointments)
- [ZenMaid API and MCP server: every tool](https://cotlet.dev/integrations/zenmaid-api-mcp-server)
- [All use cases](https://cotlet.dev/use-cases)

## Give your agent access to ZenMaid.

Free 7-day trial with 5,000 credits, no card needed. Cotlet is independent and not affiliated with ZenMaid.

[Request access](https://cotlet.dev/app/signup?app=zenmaid)
