← All posts

What a community platform actually is (and what a group chat can never be)

If you run something with members in it, you have probably been told to move it onto a "community platform", usually by someone selling one. The term is doing almost no work. A Discord server hosts a community. So does a Facebook group, a Slack workspace, a WhatsApp group, a Substack with comments on, a Circle, a Skool, a Mighty Network.

Here is a definition narrow enough to be useful:

A community platform is software where a person's membership is a first-class record, and everything else — what they can read, what they can post in, what they have paid for, what they have finished — resolves against it.

That sounds like an implementation detail. It is the whole thing. Let me show you what it buys.

The test: what happens when someone stops paying?

Take any tool you are considering and ask that one question.

In a group chat, the answer is "an admin remembers, eventually, and kicks them". Payment lives in Stripe or Gumroad or a spreadsheet. Access lives in the chat tool. Nothing connects the two but a human being with a to-do list. Everybody who has run a paid Discord knows the specific shame of discovering someone has been in the paid channel for four months for free, and the worse one of removing somebody who actually did pay.

In a course tool, the answer is usually "they lose the course, and there was nothing else". Which is fine, until you notice that the reason your students finish is not the videos.

On a community platform worth the name, the answer is: their membership record changes state, and every surface in the product reads that record. The paid channel stops rendering for them. The paid course locks. Their ticketed events grey out. Nobody had to do anything, because there was only ever one fact and everything was already looking at it.

What the record has to carry

In Klaas Academy a membership carries, at minimum, a role (owner, admin, moderator, member) and a status — invited, pending, active, suspended, banned, rejected. Not booleans scattered across tables. One row per person per community, and it is the access record.

That is why a member can be pending and see a banner explaining exactly that, with a button to cancel their own request, on every page of the app. It is why an admin approving somebody is one state change rather than four. It is why "banned" is different from "cancelled", which matters enormously the first time you have to use it.

It is also why the same person can belong to several communities on the same platform with a different role in each, and one login carries them between all of them.

The second thing: access has to be a property of the thing

Once membership is real, every piece of content can name who it is for. In Klaas each channel, course, event and library item carries an access level, and there are five gated ones:

The interesting part is not the list, it is that the enforcement lives in the database rather than in the page that draws the padlock. Access is decided by row-level security policies and by the functions that read on your behalf — not by the component rendering the screen. A gated item does not come back with a locked: true flag for the browser to respect; it does not come back. The user interface and the security boundary are not the same code, because if they are the same code then "hide the button" is one careless refactor away from being your entire access-control system.

This is the single most common way community setups leak. The channel is hidden from the sidebar, and the URL still works.

The third thing: the parts have to know about each other

A community platform is not a bundle. It is a set of surfaces reading the same records.

Concretely, in our case: a course lesson can be an event RSVP. A certificate is issued the moment a course reaches 100%, from inside the same database function that records the last lesson — not by a nightly job that might not run. A learning pathway locks course three until course two is finished, and the lock is derived from the enrolment's completion rate rather than stored, so it can never disagree with the progress bar. Search returns posts, comments, courses, library items, events and people from one query, already filtered by what you are allowed to see.

None of that is possible when your community is a chat tool plus a course tool plus a calendar tool plus a payment link, held together by Zapier and hope. Each of those is a separate model of who your members are, and they will drift.

What a group chat is genuinely better at

I do not want to be unfair to Discord, because Discord is extraordinary at the thing it does.

Real-time chat with a hundred people talking at once is a hard problem, and a threaded forum is a bad substitute for it. If your community's value is the live conversation — a gaming clan, a trading floor, a support room at 2am — then a community platform will feel slow and over-organised, and you should stay where you are.

The moment your community's value is anything durable, though, chat starts working against you. Everything scrolls away. Nothing is findable in six months. There is no version of "the onboarding sequence" that survives contact with a message log. And you cannot charge reliably for something you cannot reliably switch off.

The short version

You need a community platform when three things are true at once:

  1. People pay — or will — and access has to follow payment without you supervising it.
  2. The content is durable. Courses, recordings, a library, a schedule. Things that are worth finding again.
  3. Membership means something. There are tiers, or stages, or a difference between a new member and a founding one.

If none of those is true yet, a group chat is genuinely fine, and anyone telling you otherwise wants your subscription.

If all three are true, the thing you are actually shopping for is not a feature list. It is whether the software has one honest idea of who your members are — and whether every part of it reads from that idea, or just claims to.

Ours is at klaas.pro. We take 0% of what your members pay you, which is a different post.