How to Run an OnlyFans Agency at Scale
This page is for the person running an OnlyFans agency — a handful of creators under contract, chatters on shifts, and growth that stalls every time you sign someone because signing them means hiring someone. An agency is a staffing business with a software problem: you sell creators attention they cannot supply themselves, mostly chat hours, and past three or four creators it only stays profitable if software absorbs everything that is not judgement. Below: who does what, where the handoff between a human and a job runs, what the stack underneath has to be, and what a five-creator roster actually costs in credits a month.
The three roles, and what each one is allowed to touch
Chatters work conversations. They see one inbox spanning the roster, they send, they close. They never hold a creator's login, never pick a segment for a blast, and never set a PPV price outside an agreed band. The scarce resource here is attention: a good chatter holds roughly 40–60 live conversations in a shift, which is the number that should drive your hiring plan, not the number of creators you have signed.
The ops owner runs the jobs: the sync workers, the campaign calendar, the credit budget, the on-call rota when a session expires. One person can own this for a roster of a dozen creators if the jobs are boring and well logged. This role, not the chatters, is who talks to the API.
The creator produces content and approves anything that goes out under their name. The approval step is not a formality — it is what keeps you out of the argument that starts when a fan quotes a message the creator never wrote.
The handoff: what the system does, what the human does
Draw this boundary explicitly, as a written rule, and enforce it in code. Where the line can sit at all is set by the API surface — the wider picture of what can and cannot be automated is worth reading before you draw it. The version that survives contact with reality:
| Event | System | Human |
|---|---|---|
| New subscriber | Sends the welcome DM within minutes | Nothing |
| Inbound DM | Classifies, drafts, routes to a chatter queue | Reads, edits, sends |
| Fan asks for a custom | Tags the thread, surfaces the price band | Negotiates and closes |
| Weekly drop | Builds the audience, previews cost, queues the send | Approves the cost figure |
| Fan goes quiet 14 days | Adds them to a win-back list | Writes the bump copy once |
Creator's OnlyFans session expires (424) |
Pauses sends for that creator, pages ops | Re-links the account |
The rule of thumb: the system may do anything reversible and cheap, the human owns anything priced or personal. The top row is the one to build first — a welcome DM that fires off a subscriber diff is the cheapest revenue in the table, because there is no new-subscriber event to wait for. A routing handler enforcing that boundary is about twenty lines:
// POST handler for the message.received webhook
export async function onMessage(event) {
const { chatId, message } = event.data; // chatId === the fan's user id
const accountId = ROSTER[message.toUser.id]; // toUser is the creator — route the roster by it
const text = (message.text || "").toLowerCase();
const wantsCustom = /custom|personal|request|how much/.test(text);
if (wantsCustom) {
return queue.push({ accountId, chatId, lane: "human", priority: 0, reason: "pricing" });
}
const faq = matchFaq(text); // your own intent table
if (faq) {
await api.post(`/accounts/${accountId}/chats/${chatId}/messages`,
{ text: faq.answer, price: 0 },
{ headers: { "Idempotency-Key": `faq:${message.id}` } });
return; // 2 credits — the only billed line here
}
queue.push({ accountId, chatId, lane: "human", priority: 2 });
}
Note what is absent: no branch sends anything priced. Every path that smells like money ends in a human lane. Two payload facts shape that handler — there is exactly one event type, message.received, and the body carries no account id, so data.message.toUser.id is what tells you which creator the DM was addressed to; and delivery is at-least-once, so dedup on the X-Ofapis-Delivery header before you do anything. There is also no tip event, which means a thank-you lane has to be driven off your own records rather than off a webhook. See chatter software for the queue side of this, and webhook setup for getting the event delivered and verified in the first place.
The five layers of an agency stack
- Credentials. One API token for the whole roster, held by the ops owner, rotated on staff changes. Chatters authenticate to your panel, never to OnlyFans. This single fact is most of your security posture.
- The roster table.
account_id, creator name, status, plan tier, who owns the relationship. Every other table carriesaccount_idas a foreign key. Small agencies run this as an Airtable base long before it becomes a real schema, and the API is plain enough that a script action can fill it. The mechanics are in multi-account management. - Sync workers. One per concern — inbox, subscribers, lists — each taking
accountIdas a parameter so one code path serves the whole roster. The four jobs that make up this layer, and what each costs, are laid out in the daily automation playbook. - The panel. A unified inbox plus a campaign calendar. This is the part you build or buy; see agency software for how to decide.
- The ledger. Your own log of every call: request id, account id, endpoint, status, credits. Nothing else gives you per-creator cost, and per-creator cost is what tells you which contract is underwater.
The arithmetic that decides your architecture
Here is the calculation most agencies do too late. Pro is $159/month with 120,000 credits and five linked creators — and credits are not flat per call. A read is 1. A DM through POST /accounts/{id}/chats/{chatId}/messages is 2. A scheduled post or scheduled message is 3, a media upload 5, and a mailing trigger is free on the call itself and then 1 credit per recipient.
Run that against five creators. Three chatters sending 200 messages a shift is 18,000 messages a month, so 36,000 credits — the line you want to be paying, because it tracks revenue. Weekly drops to 4,000 fans on three creators is another 48,000. And polling five inboxes once a minute would be 216,000 calls a month on its own, more than the entire allowance before a single reply goes out; webhook deliveries are not API calls and cost nothing, so inbound detection belongs on message.received and polling drops to a reconciliation sweep of about 14,400 calls a month.
That totals roughly 98,000 of 120,000 credits — enough for five creators with busy inboxes and three of them dropping weekly, and not enough for the other two to start running campaigns as well. Campaigns, not conversations, are what consume an agency's budget: a mass DM to 4,000 fans is 4,000 credits whether it earns anything or not, and the per-job breakdown is in agency automation.
Where agencies lose money
Duplicate sends. A retried trigger without an Idempotency-Key is a second blast to the same audience, charged again and visible to every fan. Send a key on every POST; a repeat replays the first response and is not charged twice. Do not lean on the 409 guard for this — it only blocks a run that is still live. Trigger a mailing that has already finished and it recounts the audience, debits again and sends again.
Untargeted broadcasts. Creating a mailing with listId: null means "everyone", and the audience is enumerated from existing chat threads, which is also why preview returns recipientCount: -1 for that case — it cannot count without enumerating. Target a list and you get a real number and a real estimatedCost before you commit.
Silent session expiry. When a creator's session dies, calls for that account return 424 and in-flight mailing runs pause rather than fail. If nobody is watching for it, you discover it from the creator asking why the drop never went out. Alert on the status code, not on the complaint — the full set is in API errors. Note which way the money runs: a 424 is refunded, but the 422 you get once an account is unlinked or its stored OnlyFans authorization is rejected is charged, so a creator nobody re-linked burns credits on every retry.
Unattributed spend. One token, one credit pool, many creators. Without your own ledger you cannot answer "is this creator profitable", which is the only question that matters at renewal. There is no statistics or earnings endpoint to fall back on, so if you did not log it you cannot report it — roll your own log up into whatever you use for revenue analytics.
If you are still testing rather than buying: the Free tier is 250 credits, one linked account and 60 requests a minute — enough to link one creator, point message.received at a handler and watch a shift land in your own tables before you commit a roster. The allowances and per-call weights are on pricing.
FAQ
How many creators can one agency manage per chatter?
A chatter holds roughly 40–60 concurrent conversations in a shift, so the ratio that matters is conversations per shift, not creators per chatter. A roster of five mid-size creators with heavy inboxes can need three chatters; five quiet ones can need one. Size staffing from your inbox volume, which you can measure directly from unreadMessagesCount across GET /accounts/{id}/chats.
Should chatters have access to the creator's OnlyFans login?
No. Chatters should authenticate to your own panel, which calls the API with a token the ops owner holds. That way removing a chatter is one row in your database rather than a password reset on every creator account, and every action is attributable to a person in your own logs.
What does an agency actually pay to run on an API?
Plan fee plus credits consumed. Pro is $159/month with 120,000 credits and five linked creators; the credits, not the fee, are the variable you manage. A read is 1 credit, an account-scoped DM is 2, a scheduled post 3, a media upload 5, a broadcast 1 per recipient. Failures are not uniformly free, either: 401, 402, 403 and 429 are rejected before anything is debited, OnlyFans-side failures (5xx, 424) and idempotency conflicts (409) are refunded, but a malformed request (400), a missing account (404) and an unlinked account (422) are charged. Budget all three lines on pricing.
How do we keep one creator's data out of another's?
Address every call through its account-scoped route and never the unscoped legacy form, which silently resolves to the first active account on the token. Each linked account runs its own encrypted session, and the egress IP depends on the tier: Free shares a pool, Starter gives a dedicated proxy per account, Pro a dedicated proxy per creator. Separation reduces the chance that one creator's traffic implicates another — it is not a guarantee against a ban, and nobody honest will sell you one.
Do we need a developer to start an agency?
To start, no — the flows above can be assembled in a no-code tool such as Make or n8n. You will want one by the time you have a shared inbox, a CRM and a credit ledger, because those need durable state and real error handling rather than a chain of steps. The API underneath is the same either way.