Unlock Events
Phase 2 + 2.5 update (May 2026): unlock events route into the same Activity Score engine as core events —
unlock_handlersfamily inevent_families. AS contributes to the universal formula's base scaling (capped at +50%) and the Weekly Bounty share. The unlock-criterion logic below is unchanged; the new mechanics are additive. The ten unlocks remainis_active=trueinmonitoring_rulesfor Resonance Official as of 2026-05-07.
The Phase 1 program ladders ten unlock events that each become claimable at a specific Tune-In level — L0, L10, L20, all the way to L90. Unlike core events (which exist at every tier and grow in payout as you climb), each unlock event is a single monitoring_rules row that simply isn't visible to a member until their tune level meets min_tune_level. Until then it appears in the 🔒 Upcoming Unlocks section of /cooldowns as motivation.
Unlock events are designed for two properties:
- A social witness. Almost every unlock requires another member to validate the activity — joining your thread, attending your stage, reacting to your reply, mentioning you. Solo-farmable activities are explicitly avoided.
- A Discord-trackable signal. Each event maps to gateway events the bot already receives, with anti-farm guardrails enforced via short-TTL KV keys.
This page walks through all ten in tune-level order.
L0 — thread_starter
| Tune required | 0 |
| Reward | 30 RSNC |
| Cap | 2 / day |
| Trigger | You create a thread; within 24 hours, at least 2 distinct other users post in it. |
| Gateway signals | THREAD_CREATE (records the new thread); MESSAGE_CREATE inside that thread ID (counts distinct posters). |
| Anti-farm | KV key thread:claimed:{thread_id} prevents claiming the same thread twice. KV counter thread_starter:claims:{user_id}:{day} enforces the daily cap. |
Available from the moment a member begins their Tune-In journey, this is the entry-level unlock and the lowest-friction validation that someone is starting community-shaped activity.
L10 — stage_host
| Tune required | 10 |
| Reward | 120 RSNC |
| Cap | 1 / week |
| Trigger | You host a Stage instance (bot sees you as moderator); at least 3 distinct attendees join. |
| Gateway signals | STAGE_INSTANCE_CREATE captures the stage and its host; VOICE_STATE_UPDATE events into the stage's channel ID count attendees. After 3 distinct attendees and 60s of sustained presence, the reward fires once. |
| Anti-farm | stage:claimed:{stage_instance_id} prevents double-claim. The 1/week cap prevents continuous staging. |
If a server has no Stage channels, the event simply doesn't fire — there is no error or penalty for members in such servers. Brands that want to encourage Stage hosting should configure at least one Stage-eligible channel.
L20 — deep_reply
| Tune required | 20 |
| Reward | 24 RSNC |
| Cap | 5 / day |
| Trigger | You reply to a message that already has at least 3 unique-user reactions at the time you reply. |
| Gateway signals | MESSAGE_CREATE with referenced_message_id; the parent's reactor count is read from KV msg:{parent_id}:reactors (7-day TTL, populated by MESSAGE_REACTION_ADD). |
| Anti-farm | deep_reply:claimed:{parent_msg_id} prevents claiming twice for the same parent. The 5/day cap prevents reply farming. |
The "parent already had 3 reactors" requirement is the social-witness mechanism: it forces members to engage with content the room has already endorsed, instead of replying to anything for points.
L30 — conversation_starter
| Tune required | 30 |
| Reward | 40 RSNC |
| Cap | 3 / day |
| Trigger | Your message receives replies from at least 3 distinct users within one hour of posting. |
| Gateway signals | MESSAGE_CREATE records the source message; subsequent MESSAGE_CREATE events with referenced_message_id pointing to it accumulate distinct replier IDs. Evaluated on a delay (KV key with 1h TTL or per-message Durable Object alarm). |
| Anti-farm | The 3/day cap. Only distinct repliers count — a single user replying ten times still counts as one. |
L40 — voice_sustained
| Tune required | 40 |
| Reward | 48 RSNC |
| Cap | 3 / week |
| Trigger | You stay in one voice channel for at least 60 continuous minutes — channel-hopping breaks the streak. |
| Gateway signals | VOICE_STATE_UPDATE events. On join, store voice:session:{user_id}:{channel_id} with the timestamp; on leave or move, compute the duration. |
| Anti-farm | Channel-hopping resets the timer. The 3/week cap prevents 24h-presence farming. Voice sessions that include the user being muted/deafened still count — presence matters here, not active speaking. |
L50 — mentor_reach
| Tune required | 50 |
| Reward | 36 RSNC |
| Cap | 3 / day |
| Trigger | You reply to a message from a new member (joined within the last 7 days, fewer than 5 server messages) within 24 hours of their post. |
| Gateway signals | MESSAGE_CREATE with referenced_message_id; check parent author's joined_at (cached from GUILD_MEMBER_ADD) and total message count. Both must pass. |
| Anti-farm | Only one mentor_reach claim per (mentor, target) pair per week — mentor_reach:{reply_author}:{target}:week. The 3/day cap on top. |
L60 — traffic_director
| Tune required | 60 |
| Reward | 80 RSNC |
| Cap | 1 / week |
| Trigger | You are @mentioned by at least 5 distinct users within a 24-hour rolling window. |
| Gateway signals | On every MESSAGE_CREATE, the mentions[] array is inspected. For each mentioned user, the counter user:mention_count24h:{mentioned}:{mentioner} is incremented (24h TTL — one mention per mentioner per 24h window). A scheduled hourly job finds users whose distinct-mentioner count crossed 5. |
| Anti-farm | Distinct mentioners — a single user mentioning you ten times counts as one. The 1/week cap prevents continuous claiming. |
This event recognizes members who become "convergence points" — people the community routes others to. It's claimable only once per week to keep it from rewarding fame instead of the underlying activity.
L70 — resonance_beacon
| Tune required | 70 |
| Reward | 60 RSNC |
| Cap | 3 / week |
| Trigger | You post a message containing an external URL; at least 3 distinct users react to the message. The message must also pass the quality gate (so this isn't link-spam). |
| Gateway signals | MESSAGE_CREATE with URL regex match; beacon:{msg_id}:reactors is a KV set populated by MESSAGE_REACTION_ADD. Fires once when the third distinct reactor lands. |
| Anti-farm | One reward per message; 3/week cap. The quality-gate prerequisite means the message itself has to be substantive — not just "look at this cool link". |
L80 — answered_question
| Tune required | 80 |
| Reward | 90 RSNC |
| Cap | 2 / day |
| Trigger | You reply to a message containing a question, and either: (path A) the question's OP reacts to your reply with one of ✅ 👍 🙏 ❤️ 💯, or (path B) your reply itself collects at least 3 unique-user reactions within 24 hours. |
| Gateway signals | Question detection via /\?\s*$/ regex on the parent's content; reply detection via referenced_message_id. Reactions tracked via the standard MESSAGE_REACTION_ADD pipeline. |
| Anti-farm | answered:{reply_msg_id} prevents double-claim across the two paths. The 2/day cap. |
L90 — dawn_patrol
| Tune required | 90 |
| Reward | 72 RSNC |
| Cap | 1 / day |
| Trigger | You post the first message in a channel after at least 8 hours of silence, and that message passes the quality gate. |
| Gateway signals | On MESSAGE_CREATE, KV channel:{id}:last_qualifying_msg is read; if the timestamp is at least 8h old and the current message passes the gate, fires. |
| Anti-farm | Guild-wide 1/day cap (not per-channel) — prevents members from rotating through silent channels for repeat claims. |
This is the only Phase 1 unlock that doesn't require a social witness — it rewards initiative, on the theory that a member at L90 has earned the trust to break silence in a way the community will eventually engage with. The quality-gate requirement is what keeps dawn_patrol from being a "post anything in a dead channel for free RSNC" exploit.
Notes on adding your own unlock events
The Phase 1 ladder is the reference, not the canon. Brands are encouraged to design their own unlock events that suit the activities their community values. When you do:
- Pick a Discord gateway signal you can already track. Most unlock events fall out cheaply because the bot already receives the underlying gateway event (
MESSAGE_CREATE,MESSAGE_REACTION_ADD,VOICE_STATE_UPDATE,THREAD_CREATE, etc.). - Always include a social-witness condition. "You did X" is farmable; "You did X and N other members validated it" usually isn't.
- Use short-TTL KV for state. Distinct-user counters, claim guards, and time-windows live in Cloudflare KV with TTLs scaled to the event (1h to 30 days). Avoid putting unlock-event state in Postgres if you can avoid it.
- Pick a
min_tune_levelthat creates progression, not a paywall. Every unlock should be reachable by an active member within a few weeks of sustained engagement. The L90 dawn_patrol is the late-game capstone, not the entry point.