Invoicing & paymentsGetting paid

Getting paid

Take card payments, send payment links, and record cash or checks.

This page explains how to collect money through Zoop — whether that is a card payment online or cash in hand.

Zoop handles two kinds of payments: online card payments through Stripe, and manual payments (cash, check, Zelle, Venmo, wire, or anything else) that you record yourself. You can use either or both. Every payment, no matter how it was collected, is recorded on the invoice so you always know what is owed and what has been paid.

TODO(screenshot): The Settings → Payments page showing the "Set up payments" state and the active Stripe card side by side.

Connect Stripe to accept card payments

To accept credit and debit cards, you need to connect a Stripe account. Stripe moves the money; Zoop keeps the record. If you only take cash or checks, you can skip this section.

Only the account owner can connect or disconnect Stripe. Other team roles do not see Settings → Payments.

Open Settings → Payments

Go to Settings in the sidebar, then select Payments.

Start the setup

Select Set up payments. Zoop opens Stripe's onboarding flow in the same window.

Complete the Stripe checklist

Stripe asks for four things: your identity, your business details, your bank account (where your payouts land), and acceptance of Stripe's terms. Take about 5 minutes to work through each item. A checklist on the Settings → Payments page shows what is still outstanding.

If Stripe is reviewing your information, the checklist shows "In review" — nothing more is needed from you at that point. Just wait.

Return to Zoop

After you finish on Stripe, you are redirected back to Zoop. The settings page shows Active with charges and payouts both enabled when setup is complete.

If the status looks stale, select Refresh status to pull the latest state from Stripe.

Settings → Card payments showing Stripe account active, with charges and payouts both enabled
Settings → Card payments showing Stripe account active, with charges and payouts both enabled

If your account needs attention

If Stripe pauses your account, Settings → Payments shows an Action needed banner. Select Finish on Stripe to resolve the outstanding items. The page updates automatically once Stripe processes the change.

Open your Stripe dashboard

From Settings → Payments, select Open Stripe dashboard to view payouts, disputes, and transaction history directly in Stripe.

Disconnect Stripe

Select Disconnect on the Settings → Payments page to remove the Stripe connection. New card payments stop immediately. Past invoices, payments, and customer records are preserved in Zoop — nothing is deleted.


Once Stripe is connected and you have sent an invoice, you can share a link so your customer can pay by card online. They do not need a Zoop account.

Open the invoice

Go to Invoices and open a sent or overdue invoice.

Share with customer

Select Share with customer in the action footer. A dialog shows the payment link and a QR code.

Copy or scan

Copy the link and paste it into a text or email, or let the customer scan the QR code directly. The link stays active until the invoice is paid.

TODO(screenshot): The "Share invoice" dialog showing the payment link field, copy button, and QR code.


Record a cash, check, or other manual payment

Use this when you collect payment outside of Stripe — cash on the job, a check in the mail, a Zelle transfer, anything. You do not need Stripe connected to record manual payments.

Open the invoice

Open the sent or overdue invoice you want to mark.

Select Record payment

Select Record payment in the action footer.

Fill in the details

Enter the amount, the payment method, and the date you received it. You can also add an optional reference number (such as a check number) and any notes. The amount field defaults to whatever is still owed on the invoice.

Supported methods: cash, check, Zelle, Venmo, wire, other.

Save

Select Record payment. The payment appears in the Payments section of the invoice and reduces the amount due.

You can record more than one manual payment on the same invoice. For example, record a partial cash payment now, then record a check for the rest when it arrives.

TODO(screenshot): The "Record payment" dialog with the method dropdown and reference field visible.


Add check or bank transfer instructions to invoices

If some customers pay by check or bank transfer, you can add written instructions that appear on every invoice. Your customer sees them when they open the invoice, next to the online payment option.

Open Settings → Payments

Go to Settings in the sidebar, then select Payments. The offline payment instructions section appears whether or not Stripe is connected.

Enter your instructions

Type what your customers should do — for example, a mailing address for checks, or a Zelle phone number.

Save

Select Save. The instructions appear on the customer-facing invoice view when they do not pay online.


Issue a refund

Refunds apply to Stripe card payments only. You can refund the full amount or a partial amount, up to what was originally charged. The money goes back to the card your customer used — you do not handle it directly.

Open the paid invoice

Open an invoice with status paid or partially refunded.

Select Issue refund

Select Issue refund in the action footer.

Set the amount and reason

Enter the refund amount (up to the refundable balance). Pick a reason from the dropdown: customer requested, duplicate charge, or fraudulent. Add an optional note if you need one.

Notify the customer (optional)

The Notify customer toggle is on by default. Zoop emails your customer a refund confirmation and an updated receipt. Turn the toggle off if you want to handle the communication yourself.

Confirm

Select Issue refund. The refund goes back to the original card. Most banks post it within a few business days, though timing varies.

Refunds only apply to Stripe card payments. If you need to undo a manually recorded payment (cash, check, etc.), open the invoice, find the payment in the Payments section, and delete it there. Then update the invoice amount as needed.

TODO(screenshot): The "Issue a refund" dialog with the amount, reason, and notify toggle.


Retry a failed charge using a saved card

When a customer saves a card through the customer portal or storefront, Zoop stores it so you can charge it again later. If a recurring charge fails, the invoice status changes to dunning — that means Zoop is waiting to retry the charge automatically, but you can also trigger a retry right now.

Open the dunning invoice

Go to Invoices and open an invoice with the status dunning.

Select Retry charge now

Select Retry charge now in the action footer. This button only appears when the customer has a saved card and Stripe is connected.

Pick the card and confirm

Choose which saved card to charge. Select Retry charge to attempt the payment immediately.

See recurring billing for how dunning and automatic retry schedules work.


Tap-to-pay

TODO(verify): Tap-to-pay is implemented in the Stripe payment processor (createTerminalLocation, createReader, processInPersonPayment in src/lib/payments/stripe/stripe-connect-processor.ts, and a tap_to_pay capability flag), but nothing in the app calls it — no route, server action, or component invokes the reader methods, no screen reads getCapabilities(), and there are no tap-to-pay UI labels. The backend exists but is not wired to any user-facing surface. Confirm with the product team whether tap-to-pay has shipped to users before documenting it.