Buyer seats
Give one person at a buyer their own dashboard: inviting them, resending and withdrawing the invitation, the two switches you control, and what removing the seat does.
After this page you can let somebody at a buyer watch their own calls, take them in their browser or on their mobile, and see the caller once a call qualifies — without giving them anything of yours.
A buyer's seat is one person's login to that buyer's dashboard. It shows them the calls you put through to that buyer, and nothing else: no price, no revenue, no payout, no sub-publisher, no other buyer, no console.
One seat per buyer
- One person, one login, one buyer. While a seat is held, or an invitation to it is out, nobody else can be invited to it: a second invitation is
409 seat_exists. To change the person, remove the seat, then invite the new one. - Not one of your team. A buyer's seat never appears on Team, never opens your console, is never counted as one of your plan's seats, and never gets a wallet or a plan of its own. Your buyers pay you off-platform.
- One login, many seats. The same person may sit at buyers of two different publishers, or at one of yours and run an account of their own. Their dashboard switcher shows one tile per buyer.
Inviting someone
Tick Invite … to the buyer dashboard now when you add the buyer, or use Invite someone on the buyer's Seats tab later. A dashboard destination needs the invitation: it rings the person who holds the login, and until they accept, calls skip this buyer.
{
"email": "jane@acmeroofing.example",
"name": "Jane Doe"
}- 1
It is emailed
At once, in your brand, with a link to the accept page. The invitation lasts seven days.
- 2
They answer
Somebody with a login signs in and accepts; somebody new chooses a name and a password on the page — the invitation proves the address, so there is no verification email. They land on the buyer's dashboard. No thanks declines it instead, and you are told.
- 3
The seat is theirs
Accepting makes the seat, and — when the buyer's destination is the dashboard and nobody held it — points the dashboard at their browser in the same moment. Your Activity tab records the acceptance.
What the Seats tab shows
| State | What you see | What you can do |
|---|---|---|
| Invited (pending) | The address, when it was sent and when it runs out. | Send it again — a fresh link and seven fresh days, the old link dead — or Withdraw it. |
| Seat held | Who holds it, since when, and how calls reach them now: their browser, their mobile, or their phone. | Change the two switches below, or Remove the seat. |
| Declined | They pressed No thanks. Nothing was set up; the buyer's calls still ring wherever its destination points. | Invite again, the same person or someone else. |
| Expired | Seven days passed with no answer. | Send it again re-arms it, or withdraw it. |
| Withdrawn | History. The link no longer works. | Invite again. |
The two switches
| Switch | Default | What it does |
|---|---|---|
| Can see the caller's number after a call qualifies | Off | Works together with the buyer's own Show the caller's number once a call qualifies on the Destination tab — both are needed. With both on, their dashboard shows the whole number once a call has qualified, and ***-***-1234 before that. Until then it shows only the last four digits. |
| Can change their own destination | On | Lets them point the buyer's calls at their own mobile (after proving it with a texted code, and only while Let their seat ring their own mobile instead is on) or at their browser (only while Let their seat take calls in the browser is on). Off: only you change where calls ring, and their dashboard shows it without a way to change it. |
Removing a seat
Remove takes the seat away at once. Their login stays a login — it may hold other seats — but it no longer opens this buyer. Removing is allowed even on an archived buyer: taking access away always is.
- A dashboard destination bound to their login is unbound in the same save, and reads
seat_missing: routing skips the buyer until you choose another destination or someone new accepts an invitation. A save that had already moved the destination is never undone. - A phone destination is left exactly as it is — even the mobile they proved. The answer's note tells you to change it on the Destination tab if calls should stop going there.
- SMS alerts are not left on their phone. An alert number that was the mobile they proved is cleared, so every converted call does not keep texting someone who no longer holds the seat. The alerts switch stays on and reads no alert number until you set one or the next seat points them at its own verified mobile.
{
"seat": null,
"invitation": null,
"removed": {
"membershipId": "4b3a2918-0f7e-4d6c-9b5a-493827160514",
"userId": "7c6b5a49-3827-4160-9f5e-4d3c2b1a0f9e",
"name": "Jane Doe",
"email": "jane@acmeroofing.example"
},
"destination": {
"type": "dashboard",
"e164": null,
"seatName": null,
"ready": false,
"reason": "seat_missing"
},
"destinationUnbound": true,
"alertsCleared": false,
"note": "Acme Roofing's dashboard destination rang Jane Doe's browser, so it rings nobody now and calls skip this buyer — pick another destination on the Destination tab, or invite someone to the seat."
}The Seats tab through the API
| Route | Does |
|---|---|
GET /api/tracking/buyers/:id/seats | { seat, invitation } — the seat held (or null) and the invitation out (or the newest lapsed or declined one while nobody holds the seat). |
POST /api/tracking/buyers/:id/seats | Invite { email, name? }. 409 seat_exists while a seat is held or an invitation is out; 409 buyer_archived. |
PATCH /api/tracking/buyers/:id/seats/:membershipId | { canSeeCaller?, canEditDestination? }. May answer warnings — for instance, the reveal is on here but off on the Destination tab. |
DELETE /api/tracking/buyers/:id/seats/:membershipId | Remove the seat, as above. |
POST /api/tracking/buyers/:id/seats/invitations/:invitationId/resend | A fresh link and seven days, for a pending or expired invitation. |
DELETE /api/tracking/buyers/:id/seats/invitations/:invitationId | Withdraw it. |
404. Every change is written to the activity log at high severity. Shapes and codes: the Buyers API reference.{
"seat": {
"membershipId": "4b3a2918-0f7e-4d6c-9b5a-493827160514",
"userId": "7c6b5a49-3827-4160-9f5e-4d3c2b1a0f9e",
"name": "Jane Doe",
"email": "jane@acmeroofing.example",
"status": "active",
"canSeeCaller": false,
"canEditDestination": true,
"delivery": "mobile",
"createdAt": "2026-09-21T15:02:11.000Z"
},
"invitation": null
}