What the reviewer sees
There is one link per workspace. Whoever holds it can see that workspace’s suggested changes: what the change is, why, where it lands, the current and proposed text, and the source links (onlyhttp and https links are shown).
For each one they can decline with a reason: wrong, not now, already done, or never touch this. They can approve only what the link’s scope allows.
What the link can approve
The link approves at mostapprove:own_site:safe: a change to the workspace’s own site whose change class is safe (hygiene such as structured data, meta tags, alt text and internal links, with nothing that names a price, a number with a unit, a promise, a competitor or a product), and only when it can be undone (effect class pure or reversible).
Everything else the page shows says Your agency approves this one instead of an Approve button, and the client can still decline it. That includes a claim-class change (it says something a customer could hold the business to), a change nothing classified, a change to another site, outreach, and anything compensable or irreversible. You approve those in the app. An approval the link is not allowed to give answers 403 with code: "scope_denied" and details.reason: "client_link_scope".
They cannot see settings, billing, analytics, tasks, outreach contacts, autonomy, or any other workspace.
The client portal
The same link also opens the client portal atapp.attensira.com/portal/<token>. It uses the same token, so creating, replacing, turning off and rotating the link apply to the portal too. The portal shows, in order:
- The changes waiting for the client’s yes, with the same approve and decline as the reviewer page and the same scope.
- This week’s scorecard: the newest stored weekly scorecard for the workspace, without next week’s plan. Before the first one is composed, the portal says it arrives on Monday. The portal shows it even when public scorecard links are off for the workspace, because the portal is a link you gave your client.
- Recent receipts: the Receipts verified lines from the scorecards of the last four weeks, newest first. A week with none is left out.
When the link no longer opens
If the link expired, was replaced, or was turned off, the portal says This link no longer opens and offers one button, Ask for a new link. Pressing it adds a notice to the workspace’s Inbox:Your client for <workspace> asked for a new client link, where <workspace> is the workspace name (or its domain when it has no name). Asking again while that notice is open does not add a second one. Send the client a new link from Client link. A link that was signed before a Rotate on the receipt link cannot ask, because its signature no longer checks out: the client has to contact you directly.
Creating and revoking it
Create it from the workspace’s card on Clients, under Client link, or from Settings → Agency (/settings/agency), under Client portal links, which lists every workspace in the org with its link. A viewer cannot create one.
In Settings → Agency, each workspace shows its live link with Copy and the date it works until, or Create link when it has none. Rotate is the same as New link: it asks first, then replaces the link, and the old one stops working immediately. Turning a link off is on the Clients card.
- The link is valid for 90 days.
- New link replaces it. The old link stops working immediately.
- Turn off revokes it.
What an approval does
An approval through the link, or through the portal, is the same approval as one in the workspace. It is recorded with the nameclient:<workspace name> (for example client:Acme), so you can tell the client said yes. A decline is recorded the same way.
- Approvals are refused when the org’s credits are used up.
- Declines always go through.
Over the API
Dashboard routes (signed-in session):GET,POSTandDELETE /v1/projects/{id}/reviewer-linkread, create or replace, and revoke the link. Each answers{active, token?, url?, portal_url?, issued_at?, expires_at?}.urlis the reviewer page (/r/<token>) andportal_urlthe client portal (/portal/<token>).
GET /v1/share/{token}:{kind: "review", review: {workspace, shared_by, expires_at, items}}, the suggested changes. Each item carriesapprovableand, when it isfalse,held, the sentence the page shows; itschangecarriesclass(safeorclaim).GET /v1/share/{token}/portal: the client portal.POST /v1/share/{token}/items/{itemId}/approvePOST /v1/share/{token}/items/{itemId}/declinewith{"reason": "wrong" | "not_now" | "already_done" | "never_touch"}.POST /v1/share/{token}/request-link: ask for a new link.
act and its own approve scopes.