Skip to main content

WordPress Monetized Messaging: Build a Paid DM Platform with Per-Message Billing

· 10 min read
Creator of Better Messages
WordPress monetized messaging platform — per-message billing, per-role pricing, and balance display inside the messenger

A monetized messaging platform sells the conversation itself. Visitors browse profiles for free, but sending a direct message costs points — and so does opening a new thread or placing a call. The business model is paid DMs: the platform charges per interaction, the recipient (a creator, coach, or expert) earns a share, and the user tops up a balance to keep talking. Better Messages plus a points engine (GamiPress or MyCRED) implements this on WordPress — per-message billing, per-role pricing, per-call rates, with the balance shown inside the chat.

This guide covers the building blocks: per-message pricing, per-call billing, role-gated tiers, and the moderation layer that keeps spam and contact-sharing from draining revenue.

The monetized messaging stack#

LayerPlugin / setting
User accountsWordPress core
Points engineGamiPress or MyCRED
MessagingBetter Messages (free) + WebSocket version for calls + push
Per-message billingGamiPressNewMessageCharge / MyCredNewMessageCharge per WordPress role
Per-new-thread billingGamiPressNewThreadCharge / MyCredNewThreadCharge
Per-call billingGamiPressCallPricing / MyCredCallPricing — per call minute
Spam / contact-sharing filterBetter Messages AI Content Moderation (23 categories)
Top-up checkoutWooCommerce + points-engine top-up product (or any custom URL)
Mobile appBetter Messages iOS + Android (alpha)

A self-hosted DM platform on one WordPress install — no SaaS fee, no per-seat licensing, no platform cut.

Per-message pricing setup#

The pricing primitive lives at Better Messages → Settings → Integrations → Points Systems. Pick GamiPress or MyCRED as the provider, then choose the point type to charge against. Both engines share the same UI and per-role configuration.

GamiPress per-message pricing — per-role rates for messages, new threads, and calls

The pricing matrix has three charge types (new message, new thread, call) and three categories (private threads, groups, chat rooms) that combine. A typical paid-DM configuration: 10 points per message in private threads, 0 in groups, 25 to open a new thread, 5 per call minute. Group and chat-room chatter stays free, DMs are the monetized surface.

The charge is gated by category — set "private threads only" under NewMessageChargeTypes and groups stay free regardless of role. The charge_for_message action fires after delivery, deducting points from the sender. If a message fails moderation or validation, no points are deducted.

MyCRED per-message pricing — same UI on the alternate points engine

Every charge type has a row per WordPress user role. The pattern that converts: free users pay the headline rate, paid-tier members pay zero or a discounted rate, founding members pay nothing.

Per-call billing setup#

Voice and video calls have their own pricing row. The GamiPressCallPricing / MyCredCallPricing setting (per role) sets the rate per call minute — not per call.

Per-call pricing settings — voice and video billed per minute, with per-role rates

How the per-minute billing works:

  1. A user starts a call. The check_call_balance filter runs first — if the caller can't afford one minute, the call is blocked with the CallPricingStartMessage.
  2. The call connects. Better Messages tracks confirmed call-traffic minutes in a message-meta counter; charge_call_usage fires once per minute and deducts the configured rate.
  3. If mid-call the balance drops below one more minute, the call ends gracefully with the CallPricingEndMessage.

The same engine handles one-on-one and group calls — the caller pays. Group video calls scale to 32 participants; group audio calls go to 50. For a paid expert-AMA model, the expert hosts a group call inside a chat room, attendees pay per minute.

Role-gated tiers#

Monetized DM platforms usually run a tiered subscription model on top of per-message pricing — free users see profiles, paid tiers unlock the ability to send DMs at all. Better Messages handles tier gating with the restrictRoleBlock setting at Settings → Permissions.

A common shape for a creator-economy DM platform:

RoleCan send DMsPer-message ratePer-call rate
Subscriber (free)Non/an/a
Member (paid tier 1)Yes10 points5 points/min
Premium (paid tier 2)Yes5 points2 points/min
VIP (paid tier 3)Yes0 points0 points/min
Creator (recipient)Yes (replies only)n/an/a

The free Subscriber role is added to restrictRoleBlock so the Send Message button is hidden for it. Paid tiers progressively reduce the per-message cost via the per-role configuration. Combine with a membership plugin (MemberPress, Paid Memberships Pro, Restrict Content Pro) for the subscription side — it assigns the WordPress role on payment, Better Messages reads it on every send.

Spam, scam, and contact-sharing moderation#

A monetized DM platform attracts users trying to extract value without paying — spam DMs from bot accounts, scam / phishing links to high-value users, and contact sharing where users send phone numbers or social handles to continue off-platform.

Better Messages AI Content Moderation covers all three. The Cloud AI provider (included with the WebSocket version) covers 23 content categories — the OpenAI base set plus extended categories built for monetized platforms: Spam, Scam / Phishing, Contact Sharing, Doxxing, Commercial Promotion, Impersonation, Profanity, Threats, Drugs / Alcohol, and Minor Safety.

Two action modes per category — Flag Only (delivers, marked for review) and Hold for Review (held until a moderator approves). For a monetized DM platform, the high-leverage configuration is Contact Sharing → Hold for Review plus Spam → Flag Only.

On top of categories, Custom Rules let you define platform-specific rules in plain text:

Block any attempt to move conversation to email, SMS, Telegram, WhatsApp, Discord, or any external chat
Block sharing of phone numbers, emails, social handles, or external profile links
Block solicitation of payments outside the platform

The Cloud AI evaluates each rule against the message in context — it sees surrounding messages, not just one — useful for catching multi-message contact-sharing where a user splits a phone number across two sends.

Balance display#

The current balance can be shown inline in up to six placements (toggled in settings): Chat header, Threads list (top), Threads list (bottom), User menu, User menu popup, Reply form area.

User balance displayed inline in the messenger header and reply form

Most platforms enable Chat Header + Reply Form Area. The balance number links to a configurable Balance URL — typically a WooCommerce product, a custom checkout, or a Stripe page. When a send is blocked, the NewMessageChargeMessage text shows up as a toast with a "Top up" link.

Free vs WebSocket version#

FeatureFree versionWebSocket version
Per-message billing (GamiPress / MyCRED)yesyes
Per-new-thread billingyesyes
Per-role pricing matrixyesyes
Balance display in messengeryesyes
Role-gated sendyesyes
Real-time message deliverypollinginstant
Voice / video calls (1-on-1 + group up to 32/50)yes
Per-call-minute billingyes
AI content moderation (23 categories, Cloud AI)OpenAI keyincluded with license
End-to-end encryption (AES-256-GCM, per thread)yes
Web push notifications (desktop + iOS PWA)yes
Native mobile app (iOS / Android)yes
info

For a monetized DM platform, the WebSocket version is where the model actually pays off — per-call billing is WebSocket-only, the Cloud AI moderation that catches spam and contact-sharing is included with the license, and web push notifications keep users coming back. The free version covers the basics; a real revenue platform leans on call billing, real-time delivery, and built-in moderation.

Frequently asked questions#

Can I charge different rates for different user roles?#

Yes — every charge type (new message, new thread, call) has a row per WordPress role. Free users pay the headline rate; paid-tier members pay discounted rates; VIPs can be set to 0. The role lookup happens on every send, so changes apply immediately.

How do users top up their balance?#

The points engine handles the wallet, not Better Messages itself. Most platforms run a WooCommerce product that grants points on purchase (both GamiPress and MyCRED have official WooCommerce add-ons), or a custom Stripe checkout that calls the points-engine API on success.

Does Better Messages support both voice and video call billing?#

Yes — the CallPricing setting covers both, billed per connected minute. The per-role matrix applies the same way as message billing. Group calls are billed to the caller (the user who initiates), not split across participants — for split-bill scenarios, hook into the charge_call_usage action.

Can I block spam contact-sharing automatically?#

Yes — enable AI Content Moderation under Settings → AI and set Contact Sharing to Hold for Review (or Flag Only for less friction). The Cloud AI catches phone numbers, emails, social handles, and external chat-platform mentions even when split across two messages.

What happens if a user's balance hits zero mid-message?#

The send is blocked with the NewMessageChargeMessage shown as a toast — typically "You need 10 points to send this message. Top up your balance." Mid-call, the call ends gracefully with the CallPricingEndMessage; no charge is taken for the partial minute that pushed the balance negative.

Can the recipient earn from messages they receive?#

The default model deducts from the sender only. For revenue-share scenarios, the charge_for_message action is the integration point — a small functions.php snippet can trigger a parallel credit to the recipient via the points-engine API.

Is the platform GDPR-compatible?#

Yes — every message, points transaction, and billing log lives in the WordPress database on your server. The cloud WebSocket relay is blind to message content (only routing metadata flows through it), so the cloud version is GDPR-compatible by default. For stricter cases, the self-hosted WebSocket relay keeps even the routing metadata on your infrastructure.

See also#

Install Better Messages from WordPress.org →