| Summary | Discourse Member Application lets you run a structured application process for prospective members before they join your Discourse community. | |
| Repository Link | GitHub - R23DPrinting/discourse-member-application · GitHub | |
| Install Guide | How to install plugins in Discourse |
discourse-member-application — A Pre-Invite Application System for Private Communities
discourse-member-application lets you run a structured application process for prospective members before they join your Discourse community. Applicants fill out a customizable public form at /apply, admins review submissions and approve or reject them, and approved applicants receive a private invite link automatically.
GitHub: GitHub - R23DPrinting/discourse-member-application · GitHub
The Story
I run a private community that uses Discourse’s invite-only mode. We were managing membership applications manually — a Google Form, a spreadsheet, copy-pasting invite links by hand. It worked, but it didn’t scale and it felt disconnected from the community itself.
I looked for a Discourse plugin that could handle pre-invite applications. I didn’t find one that fit. So I built this.
Demo
Features
Customizable Application Form
The form is built entirely through a Fields tab in the admin panel — no code required. Supported field types: text, textarea, yes/no, radio, checkbox group, and checkbox. Fields support labels, hints, required/optional, enable/disable, and conditional visibility (show a field only when another field has a specific value).
Admin Dashboard
Review and manage all applications from a dedicated plugin page. Filter by status (Pending / Approved / Rejected / Redeemed), search by email or username, and paginate through large lists. View full application details, add private admin notes, and approve or reject individually or in bulk.
Approval Flow
Approving an application generates a single-use Discourse invite and emails it to the applicant. Rejecting sends a customizable rejection email with optional feedback. When the applicant redeems their invite and creates an account, the application status automatically updates to “Redeemed.” Approved members can optionally be added to a Discourse group automatically.
Analytics
The Analytics tab shows summary stats (total applications, approval rate, avg review time), a 12-week trend chart of submissions vs approvals, and a conversion funnel from submitted → approved → redeemed.
Admin Notifications
When a new application is submitted, a private message is sent to configured usernames (or all admins if left blank).
Configurable UX
- Intro text at the top of the form (supports markdown)
- Success page at
/apply/successafter submission with a configurable message (supports markdown) - “Apply to Join” button on the login page and login-required homepage (toggleable)
- Application expiry — auto-reject pending applications after a configurable number of days
Editable Email Templates
Both the submission confirmation and rejection emails are editable via Admin → Customize → Email Templates — no code changes needed.
Security
Rate limiting (5 submissions per IP per hour), duplicate detection (blocks re-submission with pending/approved email or username, and blocks already-registered emails/usernames), and single-use invites.
Configuration
Installation
Add to your /var/discourse/containers/app.yml:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/R23DPrinting/discourse-member-application.git
Then rebuild:
cd /var/discourse && ./launcher rebuild app
Setting Up Your Form
After installation, go to Admin → Plugins → Member Application → Fields to build your application form.
The plugin ships with these default fields (all editable or deletable):
- Desired username
- Tell us a bit about yourself
- How did you hear about us?
- Are you currently part of any other similar online communities? (yes/no)
- If yes, which ones? (conditional — shown only when above is Yes)
- Vendor disclosures (checkbox group)
- Honesty confirmation (checkbox — system field, cannot be deleted)
Use the Add field button to create new fields. Use the up/down arrows to reorder. To make a field conditional, edit it and use the “Show only when” section to select a parent field and trigger value.
Workflow
- Prospective member visits your site and clicks Apply to Join (or navigates directly to
/apply) - They fill out the form and submit — no account required
- Admins receive a private message notification
- Admin reviews the application in Admin → Plugins → Member Application → Applications
- Admin approves → applicant receives an invite email with a single-use link
- Applicant redeems the invite, creates their account, and the application status updates to Redeemed
Settings
| Name | Description |
|---|---|
member_application_enabled |
Enable or disable the application form at /apply |
member_application_notify_usernames |
Comma-separated usernames to notify via PM on new submission. Leave blank to notify all admins. |
member_application_invite_group |
Group name to add to the invite when approving (leave blank to skip) |
member_application_expiry_days |
Auto-reject pending applications after this many days (0 = never) |
member_application_expiry_notify |
Send rejection email when auto-expiring applications |
member_application_show_apply_button |
Show an “Apply to Join” button on the login page and login-required homepage |
member_application_apply_button_text |
Label for the Apply to Join button (default: “Apply to Join”) |
member_application_intro_text |
Introductory text shown at the top of the apply form. Supports markdown. Leave blank to hide. |
member_application_success_message |
Message shown on the /apply/success page after submission. Supports markdown. |
Notes
- Community-agnostic — all default field text is configurable via the Fields tab
- Works with Discourse’s
login_required/ invite-only mode - MIT licensed
- Tested on Discourse 2026.3.0
Issues, PRs, and feature requests welcome on GitHub.