Anthropic Charged $30/Seat For What Hubot Did Free In 2015

Abstract tech illustration: Anthropic Charged $30/Seat For What Hubot Did Free In 2015

Anthropic shipped @Claude in Slack and the press treated it like a new paradigm. It's not. It's chat-ops — the same pattern GitHub open-sourced as Hubot in 2011 — repackaged at $30 per seat per month. If you run a 5-person team, you should know exactly what that line item buys you before you approve it.

What @Claude actually is, mechanically

@Claude in Slack is four commodity primitives glued together: a bot user, an event listener for @-mentions, a single HTTP call to the Claude API, and a messages table keyed by thread ID. That's the entire product surface. The "continuity across days" Anthropic markets in the launch post is a SELECT * FROM messages WHERE conversation_id = ? query — nothing more exotic than what any Rails app shipped in 2013.

None of those pieces are new or hard:

  • Slack has exposed bot users and the Events API since 2014.
  • GitHub open-sourced Hubot in 2011 with the same @-mention listener pattern.
  • Telegram, Discord, WhatsApp Business, and Signal all expose equivalent bot hooks.
  • The LLM call is a single POST to api.anthropic.com/v1/messages.

The Slack integration itself is clean — I'm not knocking the engineering polish. But the pattern is fifteen years old, and the reason it works has nothing to do with Anthropic. It works because tagging a bot in the thread where work already happens eliminates the context switch. That behavioral insight is free. What Anthropic is selling is the convenience of not having to wire it up yourself.

The four pieces, in working code

Here is the entire pattern in a Telegram bot I run for daily ops. Swap Telegram for Discord, WhatsApp Business, or Signal and the shape is identical.

import os, sqlite3, requests
from telegram.ext import Application, MessageHandler, filters

ANTHROPIC_KEY = os.environ["ANTHROPIC_API_KEY"]
BOT_USERNAME = os.environ["BOT_USERNAME"]  # e.g. "opsbot"

db = sqlite3.connect("threads.db", check_same_thread=False)
db.execute("""CREATE TABLE IF NOT EXISTS messages(
    thread_id TEXT, role TEXT, content TEXT, ts INTEGER)""")

def load_history(thread_id, limit=20):
    rows = db.execute(
        "SELECT role, content FROM messages WHERE thread_id=? "
        "ORDER BY ts DESC LIMIT ?", (thread_id, limit)).fetchall()
    return [{"role": r, "content": c} for r, c in reversed(rows)]

def call_claude(history):
    r = requests.post("https://api.anthropic.com/v1/messages",
        headers={"x-api-key": ANTHROPIC_KEY,
                 "anthropic-version": "2023-06-01"},
        json={"model": "claude-sonnet-4-5",
              "max_tokens": 1024,
              "messages": history},
        timeout=30)
    return r.json()["content"][0]["text"]

async def on_message(update, ctx):
    msg = update.message
    if f"@{BOT_USERNAME}" not in (msg.text or ""):
        return
    thread_id = f"{msg.chat.id}:{msg.message_thread_id or 0}"
    user_text = msg.text.replace(f"@{BOT_USERNAME}", "").strip()
    db.execute("INSERT INTO messages VALUES(?,?,?,strftime('%s','now'))",
               (thread_id, "user", user_text)); db.commit()
    reply = call_claude(load_history(thread_id))
    db.execute("INSERT INTO messages VALUES(?,?,?,strftime('%s','now'))",
               (thread_id, "assistant", reply)); db.commit()
    await msg.reply_text(reply)

app = Application.builder().token(os.environ["TG_TOKEN"]).build()
app.add_handler(MessageHandler(filters.TEXT, on_message))
app.run_polling()

That is ~40 lines of Python. It handles the same four responsibilities @Claude does: identity, listen, reason, remember. You can run it under systemd on any $6/month VPS. Round trip on mine is under three seconds, handling roughly 40 events a day across a Gmail triage inbox and two internal channels. No seat licensing. No workspace tier. Unlimited users on the bot.

The real math on a 5-person team

Let's compare the two approaches on equal footing — same user experience (tag a bot in-thread, get an AI response with memory), different infrastructure choices.

Line item @Claude in Slack (Team plan) Self-hosted on Telegram/Discord
Bot subscription $30/seat/mo × 5 = $1,800/yr $0
Slack Pro (prerequisite) ~$8.75/seat/mo × 5 = $525/yr not required
VPS (Hetzner CX22 or equivalent) n/a ~$72/yr
Claude API usage (~40 events/day, Sonnet) included, capped ~$180–$300/yr metered
Total year 1, 5 users ~$2,325 ~$250–$400
Marginal cost of the 6th user +$465/yr $0

Even if you already pay for Slack and only count the @Claude line, that's $1,800/year for a workflow whose infrastructure genuinely costs under $100 to run. Where the gap widens is scale: every seat you add to @Claude costs another $360/year, while the self-hosted bot serves the 6th, 20th, or 200th user at zero marginal infrastructure cost. Your only variable cost is API tokens, and those bill the same either way.

That is not a rounding error. That's a ~6–9x price gap on the base case that gets worse the more people you add.

Why Anthropic picked Slack (and skipped where SMBs actually work)

Anthropic went where enterprise procurement forms already exist. Slack reports roughly 65 million paid seats, most attached to companies that will absorb another $30/seat/month without a second signature. It's the safest distribution bet they could have made, and I understand it as a business decision.

But look at who got skipped in the launch:

  • Telegram — 900M+ monthly actives, heavily used by small businesses and agencies for internal coordination because it's free and the bot API is excellent.
  • WhatsApp — 2B+ users; the Business API is already the default customer channel for large chunks of the global SMB market.
  • Discord — the default for creator businesses, agencies, and technical communities.
  • Microsoft Teams — 320M seats, and still no first-party @Claude integration at launch.

If your team lives on any of those, licensing @Claude means either forcing everyone into Slack or paying for a tool that can't reach them. Both defeat the entire point of chat-ops, which is don't make people switch context to reach the AI. As Anthropic themselves put it in the Claude in Slack announcement, the goal is "meet teams where they already work." Fair — as long as "where they already work" is Slack.

What you actually need to spec before you buy any seat license

Before you approve $1,800/year for @Claude — or any other per-seat AI subscription — write down four things. If you can answer them, you can build or commission the bot directly and skip the license entirely.

  • Messenger: What client does your team already have open all day? If the honest answer is not Slack, per-seat @Claude is the wrong default.
  • Trigger surface: Which channels/threads should the bot listen to, and what phrase invokes it? (@bot, /summary, DMs only, etc.)
  • Workflows: Concretely — Gmail triage summary at 9am? Lead scoring on inbound? Draft rewrites? Approvals? List them. Each one is a function the bot calls, not a "capability" you buy.
  • Memory scope: Thread-level, channel-level, or per-user? All three are one column in SQLite; pick deliberately.

Once those are on paper, the build is a weekend for anyone comfortable with Python and a webhook, or a few days of contract work. You own the code, the data, the bot token, and the deployment. There is no vendor who can raise prices on you next quarter.

The pattern is old. The lesson isn't.

The interesting thing about the @Claude launch is not the product. It's the admission underneath it. Anthropic just conceded that the standalone chat tab loses — people don't want to open claude.ai in another window, they want the agent in the thread where the work is already being discussed. Solopreneurs and small teams figured that out two years ago by quietly wiring bots into whatever messenger they already had open. The enterprise segment is now catching up, and Anthropic is charging $30/seat/month to shortcut the wiring.

That's a reasonable business move for Anthropic. It's a bad default for a 5-person team. The chat window is dead. The messenger your team already uses is where your AI belongs, and you don't need permission — or a Team plan — to put it there.

Why bizflowai.io helps with this

This is exactly the kind of build I ship for small teams every week — a bot listening in the messenger they already use (Telegram, Discord, WhatsApp Business, or Teams), wired into the workflows that actually eat their time: inbox triage, lead scoring, meeting-note extraction, draft rewrites, internal lookups. The stack is boring on purpose — a VPS, a listener, the LLM call, SQLite for memory — and it belongs to the client, not to a per-seat pricing page. Most of these projects pay back the build cost inside the first quarter versus the equivalent seat licenses.


Want more like this?

I publish practical AI automation, GenAI engineering, and faceless content workflows on YouTube every week.

Subscribe to bizflowai.io on YouTube — never miss a new tutorial.

Planning an AI automation project or need a second opinion on your architecture?

Connect with me on LinkedIn — Lazar Milicevic, GenAI Engineer & bizflowai.io Founder.

Visit bizflowai.io for our services, case studies, and AI consulting.

Frequently asked questions

What is @Claude in Slack, mechanically?

@Claude in Slack is a bot user installed in a workspace that listens for @-mentions in channels it's invited to. When mentioned, it grabs recent message context, sends it to the Claude API, and posts the response in-thread. It uses a conversation store to remember prior thread messages. The four pieces are: a bot identity, an event listener, an LLM call, and a messages table with a conversation_id column.

How much does @Claude in Slack cost compared to a self-hosted bot?

@Claude on the Slack Team plan costs $30 per seat per month, so five seats runs about $1,800 per year, and it requires a paid Slack subscription. A self-hosted equivalent — a Telegram or Discord bot using a bot token, a Python listener, the Claude API, and SQLite for thread memory — runs on a €6/month VPS, roughly €72 per year flat, with unlimited users and no seat licensing.

Why did Anthropic launch @Claude on Slack instead of Telegram or WhatsApp?

Anthropic chose Slack because it has around 65 million paid seats and enterprise procurement budgets that absorb a $30 line item easily, making it the safest distribution bet. They skipped Telegram (800M+ monthly actives), WhatsApp (2B+ users with a Business API), Discord, and Microsoft Teams (320M seats) — platforms where small businesses and creator teams actually coordinate but where enterprise procurement forms don't exist.

How do I build a Claude bot for Telegram, WhatsApp, or Discord myself?

You need four commodity pieces: a bot user (via the platform's bot token or Business API), an event listener that catches @-mentions, an HTTP call to the Claude API for reasoning, and a messages table (SQLite works) with a conversation_id column keyed to the thread for memory. This stack runs on a €6/month VPS, handles dozens of events daily, and can be wired together in a weekend.

When should I use @Claude in Slack vs a self-hosted bot?

Use @Claude in Slack if your team already pays for Slack Enterprise and you have procurement budget that treats a $30/seat/month line item as noise — it's the fastest path. Use a self-hosted bot if your team coordinates in Telegram, WhatsApp, Discord, or Signal, if you want flat infrastructure costs (~€72/year), unlimited users without seat licensing, and ownership of the stack forever.