Skip to main content
All updates
Bug fixCommissionsPayrollPoint of Sale·2026.09.15·

Commission records can only be written by staff of that venue

The server functions that create, calculate and reverse commission records now require a signed-in venue administrator or manager with the commissions permission, acting on their own venue. Nothing changes on your screens, and every automatic commission — checkout, point of sale, appointments, private events, refunds — keeps working exactly as before.

# Commission records can only be written by staff of that venue

This is an internal security fix. No screen changes, no commission amount
changes, and nothing you need to do.

## What was wrong

Nine server functions behind commissions — calculating a commission, creating
one, the automatic commissions for pass, product, gift card, service and private
event sales, looking up the original seller of a pass, and the refund clawback
that reverses commissions — each took the venue id as an argument and acted on it
directly. They did not check that the caller was signed in, that the caller was
staff, that the caller held the commissions permission, or that the venue they
named was their own venue.

Functions of this kind are reachable by a direct request, not only through the
screens that use them. So the venue id in the argument is something the caller
chooses, and it was being trusted.

## What changed

Those nine now, before they read or write anything:

1. require a signed-in venue administrator or manager;
2. require the **Create and edit commission rules + templates** permission — the
   same permission your commission rules, templates, approvals, payroll marking
   and settings screens already require;
3. refuse outright when the venue in the argument is not the venue the signed-in
   staff member is working in;
4. refuse a platform operator who is not in an active support session for that
   venue.

The two functions that carry no venue in their arguments — the original-seller
lookup and the refund clawback — are now confined to the signed-in staff member's
own venue, so they can never read or reverse another venue's commissions, and the
refund clawback can never send another venue's webhooks.

Creating a commission by hand, running an automatic commission and requesting a
clawback now also write an entry to the venue's audit log, naming the staff
member. A refused cross-venue attempt is recorded too.

## What did not change

Every automatic commission still runs exactly as before and is unaffected by this
change: online checkout, subscription renewals, point-of-sale product and gift
card sales, completed appointments, private event payments, and the clawback that
runs when a payment is refunded. Those paths run on the server without a signed-in
person — a webhook from the payment provider has no session — so they continue to
call the same calculation code directly, with the same deduplication, the same
rounding, the same proportional-refund behaviour and the same webhooks.

Commission rules, templates, approvals, payroll marking, statements and settings
are untouched; they already required this permission.

## Compatibility

| Combination | Result |
|---|---|
| The release serving production today + this release | Safe. This release adds no database object and changes no table, so there is nothing for an older release to be incompatible with. |
| This release's code + the database as it is today | The intended state. There is no migration in this release. |
| Business app currently in the stores + this release | Unaffected. The app does not call these functions; it reaches commissions through the venue workspace screens, which are unchanged. |
Next update

Refund receipts reach the client again, and the refund window tells you before you refund

Refund receipt emails were silently not being sent for most older payments, and the refund window still said the receipt had gone out. The receipt now goes to the address saved with the original payment, the payer address saved with it, or the client account's own verified email. When none of those exists, the refund window warns you before you confirm, and the refund is recorded as "receipt not s