AI AgentsAgenciesBusinessWhatsApp

The AI Automation Agency Model: What Actually Makes It Work

Building the agent takes an afternoon. Getting your client's WhatsApp connected is what kills the margin. Here is the business model, the arithmetic, and the onboarding step that decides whether it scales.

Written by: Victor VillalobosReviewed by: Jennifer VillalobosAugust 11, 202612 min read
View as Markdown

There is a version of the AI automation agency pitch that is mostly true, and a version that is mostly hype, and the difference between them is one unglamorous step in the middle.

The true part: you can now build a working AI agent for a client in an afternoon. That is genuinely new. Two years ago the same agent was a two-month engagement.

The part nobody puts in the course: after you build it, someone has to connect that client's WhatsApp number, and that is where the schedule goes. Meta Business verification, a phone number that is not already in the consumer app, a webhook, template approval. Three weeks of email tennis with a client who has lost the password to a Facebook Business Manager their last agency created.

Build in a day, onboard in three weeks. That ratio is the whole business, and it is why so many of these agencies stall at four clients.

What an AI automation agency actually is

Strip the branding off and it is a systems integrator for a new category of system. You take a business process that currently runs on a human reading messages, and you replace the routine part of it with an agent that reads the same messages and calls the same internal systems.

The work is not model training. It is:

  • Working out which process is worth automating, which is a business conversation.
  • Writing the prompt and the rules, which is closer to writing a job description than to programming.
  • Wiring the tools into the client's existing systems, which is normal integration work.
  • Putting it on the channel the client's customers already use.
  • Staying on to fix it when reality arrives.

The last two are where agencies win or lose, and both are unglamorous.

The three revenue models

They are not mutually exclusive, and most agencies end up running two.

Project fee. A fixed price to build and launch one agent. Clean, easy to sell, and it ends. The risk is scope: an agent whose tools touch a legacy ERP is not the same project as one that answers from a PDF, and a single price for both is how you lose a quarter.

Retainer. Monthly, covering hosting, monitoring, prompt tuning and changes. Smaller number, better business. The honest version of this line item is that agents need maintenance: your client's refund policy changes, a supplier's API moves, customers start asking something nobody anticipated.

Resale. You hold the platform account, your client pays you a monthly figure that includes their usage, and you keep the spread. This is the one that compounds, and it is the one with the operational trap: if you cannot see per-client spend, one client's runaway broadcast eats the margin on the other nine.

A worked example, with the arithmetic visible rather than a promised multiple. Say you charge a client $400 a month for a WhatsApp support agent. Your direct costs are the platform plan, the model tokens, and Meta's per-message charges. On Zavu, Pro is $20 a month and includes $20 of usage credit; WhatsApp is billed at Meta's rates passed through without a per-conversation platform fee, and you can run the agent on your own OpenAI or Anthropic key at cost. For a client doing a few thousand conversations a month, the direct cost is tens of dollars, not hundreds.

The number that decides whether that spread survives is not on this list. It is how many hours you spent onboarding.

The onboarding wall

Here is the step that decides whether an agency does four clients or forty.

To put an agent on a client's WhatsApp, the client's business has to be connected to a WhatsApp Business Account, and only the client can authorize that. Which means, done the manual way:

  • You ask for access to their Meta Business Manager.
  • They do not know what that is, or the login belongs to a marketing person who left.
  • You get added, with the wrong role.
  • The number they want is already registered in the WhatsApp app on someone's phone.
  • Business verification asks for documents nobody in the room has.
  • Somewhere in here, two weeks go by, and you have not billed anything.
  • Multiply by every client. This is not a technology problem, it is a permissions problem, and it is why "we can build your agent this week" quietly becomes "we launch next month".

    The fix is to stop being in the middle. You send the client one link. They click it, authorize with Meta in their own account, and the connected sender appears in your project.

    TypeScript
    import Zavudev from "@zavudev/sdk" const zavu = new Zavudev({ apiKey: process.env.ZAVUDEV_API_KEY }) const { invitation } = await zavu.invitations.create({ clientName: "Clinica Andes", clientEmail: "ops@clinicaandes.cl", connectionType: "whatsapp_waba", expiresInDays: 14, allowedPhoneCountries: ["CL"], }) // Send invitation.url to the client. That is your entire onboarding.

    You never touch their Business Manager. They never send you a password. When they finish, the invitation moves to completed and carries the senderId plus connectedAccount with the number and verified name that got linked, so your system knows the client is live without anyone checking manually.

    Subscribe to invitation.status_changed and the whole pipeline becomes visible: pending when sent, in_progress when they start, completed when it works, failed when it does not. That last one is the useful one. failed carries a failureReason you can act on rather than guess at:

    failureReasonWhat actually happenedWhat to tell the client
    fb_cancelledThey closed Meta's dialogNothing is broken, the link still works
    fb_not_authorizedThey denied a permissionThey need to accept all of them
    signup_abandonedStarted, never finishedUsually stuck on business verification
    meta_no_pagesThey administer no Facebook PageOnly for Page connections, they need to create one

    A failed invitation stays usable, so "try the link again" is a real answer rather than a stall.

    Two things worth knowing before you build a process on this. One invitation connects one channel: to onboard a client on both WhatsApp and their Facebook Page, you create two invitations, and each completes into its own sender. And for Facebook Pages specifically, a Page can only be connected to one Zavu project at a time, so if you inherit a client from another agency, connecting their Page moves it to you and disconnects the previous one. That is the behaviour you want when winning an account and the behaviour to warn about when a client is testing two vendors at once.

    Seeing each client separately

    The resale model dies quietly when you cannot answer "how much did client seven cost me last month". Sub-accounts are the primitive for that: one per client, each with its own API keys, each with a spending cap.

    TypeScript
    const { subAccount } = await zavu.subAccounts.create({ name: "Clinica Andes", externalId: "crm_8842", creditLimit: 25000, // cents, so $250 }) // The API key is returned once, on creation. Store it now.

    Three things this buys you.

    The cap is enforced, not advisory. When a sub-account reaches its creditLimit, its messages are blocked. A client who imports a 40,000-row list and hits send cannot spend your margin, because the ceiling is a real one.

    Spend is attributable. zavu.subAccounts.getBalance(id) returns that client's totalSpent alongside the cap, which is what you need to invoice, and what you need to notice that client three's usage tripled before renewal rather than after.

    Billing stays in one place. Charges land on the parent team's balance, so you top up once and every client draws from it. Your clients never see a platform invoice, which is the point of resale.

    Set externalId to whatever your CRM calls that client and reconciliation stops being a spreadsheet.

    One constraint to design around: sub-account API keys cannot manage sub-accounts. Those calls need a parent key and return 403 otherwise, which is correct (a client's key should not be able to enumerate your other clients) and worth knowing before you architect a client-facing dashboard.

    Building fast enough to quote a fixed price

    Fixed-price only works if the build is predictable. The workflow that makes it predictable is the one where you do not write the code.

    terminal
    npx skills add zavudev/zavu-skills npx zavudev@latest login npx zavudev agents catalog

    The skills teach your coding agent this API, so it stops inventing endpoints and stops ignoring the 24 hour window. The catalog lists ready-made agents for support, lead capture and booking, and npx zavudev agents pull drops one into your repo as editable code you own, prompt and tools already written.

    From there each client is a prompt against a working starting point:

    > Take this booking agent and adapt it for a dental clinic. Availability comes from our client's Google Calendar. Confirmations go out in Spanish. Never book inside the two hours before an appointment slot. Deploy it and test with "tienen hora el jueves en la tarde?"

    Then, before it touches a client's customers:

    terminal
    npx zavudev agents test --agent <agentId> --message "tienen hora el jueves en la tarde?"

    That runs the real agent and returns what it would say, delivering nothing and charging nothing. For an agency this is the demo: you can show a client their agent answering their questions before their WhatsApp is even connected, which moves the sale earlier than the onboarding.

    What to charge

    We are not going to publish a rate card for your market, because we do not know it. But the structure that survives is consistent:

    Charge for the process, not the agent. "An AI agent" has no anchor price and invites comparison against a $29 chatbot tool. "Your reception line answers every message in under a minute, seven days a week, and books directly into your calendar" is priced against what a receptionist costs.

    Separate build from run. A one-time build fee plus a monthly that covers usage, monitoring and changes. Agents need maintenance, and a model with no recurring line means every fix is an argument.

    Put usage in the monthly, with a cap you enforce. That is the whole reason for creditLimit. You can promise "up to 5,000 conversations included" and mean it.

    Price the second client lower than the first. Your first agent in a vertical costs you discovery. The fifth dental clinic is a fork of the fourth, and the margin lives there. Agencies that compound do it by getting narrow, not by getting big.

    Honest limits

    Where this model does not work, said plainly.

    If the client's process is not written down anywhere, you are not automating, you are consulting. Charge for that separately or you will do it for free.

    If the client cannot get into their own Meta Business Manager, no link fixes that. The invitation removes you from the middle, but somebody at the client still has to be able to authorize. Qualify for that on the sales call.

    A one-agent agency is a freelancer with a logo. The model compounds through repetition inside a vertical. If every client is a different industry, every build is the first build.

    And the agent has to actually be good. An agency that ships a confident, wrong agent loses the client and the reference. The failure modes are known and mostly preventable, and knowing them is a meaningful part of what you are selling.

    Keep reading

    Need help? Contact us or join our Discord community for support.

    Get started

    Ready to get started?

    Start building for free, or schedule a call to discuss your specific use case.

    AI Automation Agency: The Honest Playbook | Zavu Blog