Governance
This is the page that matters. Every number below is read from the same configuration the software enforces, and every rule described here refuses in production exactly as it is written here.
One budget, no second pool
Automations, your AI agent, the REST API and the loadouts all draw from the same counters. There is no separate allowance for the agent and no way to get a second one.
This is the only reason the table below is worth publishing. A product with a second, unmetered path to LinkedIn has caps that describe one code path rather than the account, and every number it publishes is a lie by omission.
Every write in the product goes through one decision function before it happens. If a feature could act without it, that feature would be the bug.
The caps we publish
These are per LinkedIn profile, per day, and they reset at midnight in the profile's own timezone.
| Channel | Default | Starter | Pro | Operator | Agency | Weekly |
|---|---|---|---|---|---|---|
| Direct messages Outbound | 100 | 150 | 200 | 250 | 250 | — |
| InMail Outbound | 10 | 20 | 20 | 20 | 20 | — |
| Connection requests Outbound | 20 | 25 | 30 | 40 | 40 | 150 |
| Comments | 20 | 30 | 40 | 60 | 60 | — |
| Reactions | 60 | 100 | 150 | 200 | 200 | — |
| Profile views (enrichment) | 100 | 150 | 200 | 250 | 250 | — |
| Search result pages | 50 | 100 | 100 | 100 | 100 | — |
| Posts published | 3 | 5 | 5 | 5 | 5 | — |
| Emails through your own provider Outbound | 200 | 500 | 500 | 500 | 500 | — |
Defaults are what a newly connected profile gets. You may lower any cap freely; raising one above your plan's ceiling is refused. Every column is read from the same configuration the Governor enforces.
The autonomy dial
You choose how much a profile is allowed to do without asking. The setting is per LinkedIn profile, not per workspace, so an agency can run one client on approvals and another autonomously.
| Mode | What it does | A direct message | A comment |
|---|---|---|---|
| Draft only | Everything becomes a draft for you to read. Nothing is ever sent, even after you approve it. This is the rehearsal mode — use it for the first week of a new template. | Waits for you | Waits for you |
| Approve every write | Every action that another person could see waits for you, including public comments and reactions. | Waits for you | Waits for you |
| Approve outbound only Default | Anything that lands uninvited in someone's inbox waits for you. Public and reversible actions run inside the caps. | Waits for you | Runs |
| Autonomous within caps | Actions run without asking. They are still capped, paced, de-duplicated, checked against your do-not-engage list and held outside your sending hours. | Runs | Runs |
The default for a newly connected profile is the least autonomous setting that is still useful. A product that defaulted to full autonomy would be one bad template away from a restricted account.
Quiet hours
By default nothing is sent between 22:00 and 07:00 in the profile's own timezone. Work raised inside that window is not refused and not lost — it is held, and the answer carries the time it will run.
A weekend pause is available as well. Both are enforced on our side, where jobs are simply not handed out, and again inside the extension, which refuses to write outside the window even if it is asked to.
Pacing
Two actions from the same profile are never closer together than 45 seconds, and no profile makes more than 6 writes in any ten-minute window, whatever the mix of channels.
The gap is randomised rather than fixed. A perfectly regular interval is a signature in itself, and the second cheapest thing to detect after volume.
An action that arrives too soon is refused with a code that says how long to wait, so an agent backs off instead of retrying into a wall.
Do not engage
A person, an email address or a whole domain can be added to a do-not-engage list, by hand, by CSV, or by an agent. Nothing on the list is ever contacted again by any part of the product.
The list is checked twice: when an action is requested and again when your browser is about to perform it. Days can pass between those two moments, and the check that matters is the second one.
Anyone who replies with a stop word is added automatically, and their queued messages are cancelled. In this language the words are matched case-insensitively and on word boundaries, so "unstoppable" does not contain "stop":
stopunsubscribenot interestedremove meopt out
De-duplication
The same person will not receive the same kind of message from the same profile twice within 30 days — unless they replied in the meantime, which makes it a conversation rather than a repeat.
This is the rule that protects you from your own enthusiasm, and from an agent that has forgotten what it did yesterday. It is enforced on a fingerprint of the profile, the target, the action type and the opening of the message, so a reworded version of the same approach is still a duplicate.
The approval queue
When your autonomy setting holds an action, it lands in a queue with the exact text that would be sent. Approve it and it goes; reject it and nothing happens.
What you read is what is sent. The message is rendered once, when the action is raised, and stored — it is not re-rendered later from a template that might resolve differently. You approved specific words for a specific person.
Nothing waits forever. An approval expires after 72 hours and is never executed afterwards. An hour-old message can be a good idea; a four-day-old one, sent without anyone looking again, is not.
Emergency stop
One click, or one tool call from your agent: every queued job for that profile is cancelled, the profile is paused, and you are notified.
Clearing it is manual and always will be. An emergency stop that lifts itself on a timer is a pause, and the moment you want one is the moment you do not yet know what went wrong.
When LinkedIn pushes back
If LinkedIn rate-limits a profile or shows it a challenge, the extension stops immediately and tells us. We park the profile for 6 hours, halve its caps for 48 hours, and notify you.
The response is automatic and deliberately blunt. The alternative — retrying to see whether it was a blip — is precisely the behaviour that turns a temporary limit into a restriction.
The audit log
Every tool call, every automation action, every approval decision and every API call is written to an audit log, including the ones that were refused. The refusals are the rows that answer "why did it not send?".
The log cannot be edited or deleted by anyone, including us. It is kept for 24 months by default. When an account is erased, the rows are anonymised rather than removed — what happened survives, who it happened to does not.
Every refusal, and what it means
When something is refused, the answer carries a code rather than a sentence, so that an agent can change its plan instead of retrying. These codes are a stable, public part of the interface.
| Reason | What it means | What to do |
|---|---|---|
extension_offline |
No paired browser is online for that profile. | Wait, then retry |
paced |
Too soon after the previous action. The answer carries how long to wait. | Wait, then retry |
quiet_hours |
Outside the profile's sending hours. The job waits and the answer carries the time it will run. | Wait, then retry |
rate_limited |
LinkedIn rate-limited the profile and it is parked while things settle. | Wait, then retry |
cap_reached |
The daily cap for that channel is spent. It resets at midnight in the profile's own timezone. | Change the plan |
channel_paused |
You have paused that channel for that profile. | Change the plan |
confirm_required |
The action is destructive and was called without confirm: true. | Change the plan |
consent_missing |
The owner of that LinkedIn profile has not granted consent yet. | Change the plan |
do_not_engage |
The person is on your do-not-engage list. | Change the plan |
duplicate |
You already sent this person the same kind of message inside the de-duplication window. | Change the plan |
emergency_stop |
Emergency stop is engaged for the profile. Only a person can clear it. | Change the plan |
tier_required |
The plan does not include that tool. The refusal names the plan that does. | Change the plan |
Every cap, limit, timeout and tool name on this page is read from the running product when the page loads. If the software changes, this page changes with it.