Natural Participation
Reward organic community behavior without requiring slash commands. Users earn RSNC simply by participating naturally in your server.
All Natural Participation events are stored in the monitoring_rules Supabase table. When you connect your server via /setup connect, default events are automatically created. Both the Discord bot and Partner Portal read/write from this same source.
Features
| Feature | Description | Default | Configurable |
|---|---|---|---|
| GM Check-in | Reward "gm" or "good morning" | 25 RSNC, 24h cooldown | ✅ |
| GN Check-in | Reward "gn" or "good night" | 15 RSNC, 24h cooldown | ✅ |
| Quality Messages | Reward thoughtful, high-quality messages | 10 RSNC (disabled) | ✅ |
| Popular Messages | Reward when messages reach reaction thresholds | 25 RSNC (disabled) | ✅ |
| Auto-Welcome | Automatically reward new members on join | 50 RSNC, one-time | ✅ |
| Server Boost | Special reward for Nitro boosters | 500 RSNC | ✅ |
| Voice Activity | Reward for time in voice channels | 25 RSNC | ✅ |
GM/GN Check-in
Recognized Patterns
Good Morning (case-insensitive):
gm,GMgood morninggm everyone,gm fam,gm frensmorning!rise and shine
Good Night:
gn,GNgood nightgn everyone,gn famnighty nightsweet dreams,sleep well
Configuration
/config events action:edit name:gm_checkin reward:50
/config events action:edit name:gn_checkin reward:25
Cooldown
Default 24-hour cooldown prevents spam. Users can only earn once per day for each type.
Quality Message Scoring
Messages pass through a two-stage pipeline: the gateway relay computes quality metrics, and the worker enforces admin-configured thresholds from detection_config.
Pipeline
- Gateway relay filters out spam (very short messages, bot messages) and computes enriched metrics
- Relay forwards a
message_qualityevent with metrics to the worker - Worker fetches admin thresholds from
monitoring_rules.detection_config - Worker enforces hard thresholds (
min_characters,min_words) and optional composite score - If the message passes, the user is rewarded (subject to daily limits)
Quality Metrics
The gateway relay computes the following metrics for each qualifying message:
| Metric | Description |
|---|---|
length | Character count |
word_count | Total word count |
unique_word_count | Distinct words used |
unique_word_ratio | Vocabulary diversity (0–1) |
sentence_count | Number of sentences |
avg_word_length | Average word length |
has_question | Contains a question mark |
has_code_block | Contains code block (triple backticks) |
has_link | Contains a URL |
Composite Quality Score (0–100)
When qualifying_score is set in detection_config, messages receive a composite score:
| Dimension | Max Points | Logic |
|---|---|---|
| Length | 25 | min(25, length / ideal_length × 25) |
| Word count | 20 | min(20, word_count / ideal_words × 20) |
| Vocabulary diversity | 20 | unique_word_ratio × 25, capped at 20 |
| Sentence structure | 15 | min(15, sentence_count × 5) |
| Engagement signals | 10 | +5 for question, +5 for code block |
| Resource sharing | 10 | +10 for link |
Configurable Thresholds
All thresholds are set via detection_config on the monitoring_rules entry:
| Field | Type | Default | Description |
|---|---|---|---|
min_characters | int | 100 | Hard minimum character count |
min_words | int | 20 | Hard minimum word count |
qualifying_score | int (0–100) | 0 | Composite score threshold (0 = disabled) |
ideal_length | int | 200 | Length target for scoring curve |
ideal_words | int | 40 | Word count target for scoring curve |
min_unique_word_ratio | float | 0 | Vocabulary diversity gate (0 = disabled) |
maxDailyRewards | int | 5 | Max rewards per user per day |
excluded_channels | array | [] | Channel IDs to exclude |
channel_multipliers | object | Per-channel reward multipliers |
Configure via Discord
/config events action:edit name:regular_engagement min-characters:65 min-words:10
/config events action:edit name:regular_engagement qualifying-score:50
Configure via Partner Portal
In Partner Portal → Discord → Natural Participation:
{
"messageQuality": {
"enabled": true,
"minCharacters": 100,
"minWords": 20,
"rewardPerQualityMessage": 10,
"maxDailyRewards": 5
}
}
Popular Messages
Reward messages that get lots of reactions.
How It Works
- User posts a message
- Other members react
- When reactions reach threshold (default: 10), user earns reward
Enable Popular Messages
{
"reactionRewards": {
"enabled": true,
"thresholdForPopular": 10,
"popularMessageReward": 25
}
}
Voice Channel Rewards
Reward users for time spent in voice channels.
Configuration
| Setting | Description | Default |
|---|---|---|
minutesPerReward | Minutes in voice to earn one reward | 60 min |
rewardAmount | RSNC per reward cycle | 25 RSNC |
maxRewardsPerDay | Daily cap per user | 3 rewards |
requireOthers | Must have other users in channel | true |
minOtherUsers | Minimum other users required | 1 |
How It Works
- Gateway tracking: Bot tracks voice channel joins/leaves via Discord gateway
- Time accumulation: Voice minutes accumulate while in eligible channels
- Claim rewards: Users run
/voice claimwhen they have enough time - Daily cap: Voice tracker enforces
maxRewardsPerDaylimit
Voice rewards have their own rate-limiting system (maxRewardsPerDay). The /voice claim command bypasses the event handler's cooldown check because the voice tracker already enforces the daily limit. This allows users to claim multiple rewards in a single sitting if they've accumulated enough time.
User Commands
| Command | Description |
|---|---|
/voice | Check voice time progress and available rewards |
/voice claim | Claim earned voice reward (ephemeral response) |
Example Flow
- User joins voice channel at 2:00 PM
- User leaves at 3:00 PM (60 minutes accumulated)
- User runs
/voice→ Shows "1 reward available" - User runs
/voice claim→ Earns 25 RSNC - User can claim up to 3 rewards per day (default)
Configure Voice Rewards
/config voice minutes_per_reward:30 rsnc_per_reward:15 max_daily:10
Event Type
Voice rewards use the voice_time event type. When configuring via /config events:
/config events action:create name:voice_time reward:25 cooldown:-1 smart:true
Use cooldown:-1 or cooldown:0 for voice events. The voice tracker's maxRewardsPerDay is the authoritative rate limit, not the event cooldown.
Configurable Event Triggers
Beyond the built-in event types above, you can create custom triggered events that automatically detect and reward specific behaviors using the /config events command with a trigger option.
Trigger Types
| Trigger | Gateway Event | What It Matches |
|---|---|---|
keyword | channel_message | Messages starting with specific words (gm, gn, gz, etc.) |
min_length | message_quality | Non-spam messages longer than N characters |
reaction_count | reaction_threshold | Messages that receive N+ unique reactions |
Keyword Trigger
Watch specific channels for configurable keyword matches. Unlike the built-in GM/GN events, keyword triggers let you define any words to match.
/config events action:create name:gm_reward trigger:keyword keywords:gm,gn,gz channels:gm-channel reward:5 cooldown:24
How it works:
- Gateway relay sends all messages as
channel_messageevents with a 50-character content preview - Worker checks the preview against your configured keywords (case-insensitive, word-boundary aware)
- If a keyword matches and the channel is allowed, the message author is rewarded
- Cooldown and max-claims limits are enforced per user
Min Length Trigger
Reward users for posting substantive messages of a configurable length.
/config events action:create name:quality_chat trigger:min_length min-length:50 reward:2 cooldown:1
How it works:
- Gateway relay sends
message_qualityevents for non-spam messages with character count - Worker checks if the message length meets your configured minimum
- If it does, the message author is rewarded
Reaction Count Trigger
Reward message authors whose posts become popular (measured by unique reactions).
/config events action:create name:popular_post trigger:reaction_count min-reactions:5 reward:10 cooldown:0
How it works:
- Gateway relay sends
reaction_thresholdevents at levels [3, 5, 7, 10, 15, 20, 25, 50] - Worker checks if the threshold meets your configured minimum
- Each message can only trigger a reward once per event (KV-tracked, prevents double-rewarding)
- The message author receives the reward, not the reactor
Trigger Detection Config
Trigger configuration is stored in the detection_config JSON field on monitoring_rules:
// Keyword trigger
{ "trigger": "keyword", "keywords": ["gm", "gn", "gz"], "channels": ["gm-channel"] }
// Min length trigger
{ "trigger": "min_length", "min_length": 50 }
// Reaction count trigger
{ "trigger": "reaction_count", "min_reactions": 5 }
How It All Works
When you connect your Discord server via /setup:
- Real-time Detection: Resonance monitors messages for GM/GN patterns, quality content, and engagement
- Automatic Rewards: When patterns are detected, rewards are automatically distributed
- Custom Triggers: Create your own triggered events for keyword, length, or reaction-based detection
- No Configuration Needed: Default settings work out of the box
What Gets Detected
- GM/GN messages (with 24-hour cooldown)
- Quality messages (100+ characters, thoughtful content)
- Custom keyword matches (configurable per event)
- Popular messages by reaction count (configurable threshold)
- Voice channel activity
- Third-party bot level-ups (Mee6, Arcane, etc.)
- Server boosts
Check Your Cooldowns
Run /cooldowns to see your active cooldown timers and daily charge status. The command:
- Queries
monitoring_rulesfor all active events on the server - Shows events with cooldown timers (e.g., GM check-in: ⏳ 12h 30m)
- Shows daily charge events (e.g., Quality Messages: ✅ 3/5 charges available)
- Only displays events that have a cooldown or daily limit configured
Verify It's Working
Run /test all in your Discord server. You should see:
Natural Participation: Active ✅
Semantic Intent Detection
Beyond simple keyword matching, the bot uses a semantic detector to understand the meaning of messages — rewarding achievement announcements, quest completions, and milestone celebrations even when users phrase them differently.
Detected Intents
| Intent | Example Phrases | Confidence |
|---|---|---|
LEVELUP | "leveled up to level 5", "reached level 10!" | High |
COMPLETION | "quest completed", "finished the mission", "task done" | High |
STREAK | "30-day streak", "streak milestone reached" | High |
ENGAGEMENT | "earned XP on Zealy", "claimed OAT on Galxe" | High |
ACHIEVEMENT | "unlocked the badge", "earned achievement" | High |
REWARD | "claimed my reward", "got my tokens" | High |
MILESTONE | "hit 1000 points", "reached the milestone" | High |
ONBOARDING | "completed setup", "finished onboarding" | High |
Confidence Tiers
| Confidence | Threshold | How It's Determined |
|---|---|---|
1.0 | Phrase match | Exact multi-word trigger phrase detected |
0.7 | Keyword combo | Two or more related keywords present |
| filtered | < 0.6 | Single keyword — not rewarded to reduce noise |
Quest Platform Detection
The semantic detector also recognizes quest platform activity from 5 major platforms:
| Platform | Detected Phrases |
|---|---|
| Zealy | "XP on Zealy", "Zealy quest", "zealy.io" |
| Galxe | "Galaxy OAT", "Galxe campaign", "galxe.com" |
| Guild.xyz | "Guild role", "role granted by guild", "guild.xyz" |
| QuestN | "QuestN task", "questn.io" |
| Layer3 | "Layer3 quest", "layer3.xyz" |
When a quest platform message is detected, the intent is tagged as ENGAGEMENT and the originating platform is recorded in the event metadata.
Using Semantic Detection in Events
Create a custom event that fires on achievement announcements:
/config events action:create name:quest_achievement trigger:keyword smart:true reward:15 cooldown:24
Set smart:true to enable semantic matching instead of exact keyword matching.
Quest Platform Rewards
Automatically reward users who complete quests on external platforms and share their achievements in your Discord.
Supported Platforms
- Zealy (formerly Crew3) — XP earned, quest completed
- Galxe — OAT claimed, campaign completed
- Guild.xyz — role granted, quiz passed
- QuestN — task completed
- Layer3 — quest finished
How It Works
- User completes a quest on Zealy/Galxe/Guild/etc.
- User pastes achievement in your Discord server
- Semantic detector recognizes the platform + achievement
ENGAGEMENTevent fires → user earns RSNC- Platform source is recorded in event metadata
Create a Quest Platform Event
/config events action:create name:quest_platform reward:20 cooldown:24
Or configure separate rewards per platform via Partner Portal → Events.
Configuration in Partner Portal
Go to Partner Portal → Integrations → Discord → Natural Participation:
{
gmCheckin: {
enabled: true,
reward: 25,
cooldownHours: 24,
responseEnabled: false
},
gnCheckin: {
enabled: true,
separateCooldown: false, // Share cooldown with GM
reward: 15
},
messageQuality: {
enabled: false,
minCharacters: 100,
minWords: 20,
rewardPerQualityMessage: 10,
maxDailyRewards: 5
},
reactionRewards: {
enabled: false,
thresholdForPopular: 10,
popularMessageReward: 25
},
welcomeAutomation: {
enabled: false,
autoRewardOnJoin: false
}
}
Best Practices
Prevent GM Spam
-
Channel restriction: Limit GM/GN to a specific channel
- Configure in Partner Portal → Events → Allowed Channels
-
Reasonable rewards: Don't make GM/GN the highest paying event
-
Quality balance: Enable quality messages to reward substantive content
Encourage Voice Participation
- Reasonable caps: 10 rewards/day = 5 hours of voice
- Team activities: Combine with game nights for bonuses
- Multipliers: Give role bonuses for voice regulars
Quality Content
- Start disabled: Enable after community is established
- Moderate thresholds: 100 chars is reasonable
- Daily caps: Prevent gaming the system