# Discourse Member Application

**URL:** https://meta.discourse.org/t/discourse-member-application/399190
**Category:** Plugin
**Created:** [March 24, 2026, 11:35pm UTC](https://meta.discourse.org/t/discourse-member-application/399190 "2026-03-24T23:35:06Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![R23D\_Printing](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/r23d_printing/32/544902_2.png) [@R23D\_Printing](https://meta.discourse.org/u/R23D_Printing)
#### Post date: [March 24, 2026, 11:35pm UTC](https://meta.discourse.org/t/discourse-member-application/399190/1 "2026-03-24T23:35:06Z")

</div>

| | | |
| --- | --- | --- |
| ℹ | **Summary** | **Discourse Member Application** lets you run a structured application process for prospective members before they join your Discourse community. |
| 🛠 | **Repository Link** | [R23DPrinting-group / discourse-member-application · GitLab](https://gitlab.com/r23dprinting-group/discourse-member-application) |
| 📖 | **Install Guide** | [How to install plugins in Discourse](https://meta.discourse.org/t/install-plugins-in-discourse/19157) |

  

# 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.

🔗 **GitLab:** [R23DPrinting-group / discourse-member-application · GitLab](https://gitlab.com/r23dprinting-group/discourse-member-application)

* * *

## 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

[![](https://global.discourse-cdn.com/meta/original/4X/3/7/7/377ebc7ab46b47f565de226746ae82fe88380033.jpeg "Discourse Member Application Plugin Overview") ](https://www.youtube.com/watch?v=CtWZVzLyI20)

* * *

## 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/success` after 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`:

```yaml
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://gitlab.com/r23dprinting-group/discourse-member-application.git

```

Then rebuild:

```bash
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):

1. Desired username
2. Tell us a bit about yourself
3. How did you hear about us?
4. Are you currently part of any other similar online communities? (yes/no)
5. If yes, which ones? (conditional — shown only when above is Yes)
6. Vendor disclosures (checkbox group)
7. 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

1. Prospective member visits your site and clicks **Apply to Join** (or navigates directly to `/apply`)
2. They fill out the form and submit — no account required
3. Admins receive a private message notification
4. Admin reviews the application in **Admin → Plugins → Member Application → Applications**
5. Admin approves → applicant receives an invite email with a single-use link
6. 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 GitLab.

🔗 [R23DPrinting-group / discourse-member-application · GitLab](https://gitlab.com/r23dprinting-group/discourse-member-application)

---

<div class="post-metadata">

### Author: ![R23D\_Printing](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/r23d_printing/32/544902_2.png) [@R23D\_Printing](https://meta.discourse.org/u/R23D_Printing)
#### Post date: [April 3, 2026, 11:02pm UTC](https://meta.discourse.org/t/discourse-member-application/399190/2 "2026-04-03T23:02:28Z")

</div>

**Update:** Repository has moved to GitLab. All links in the post above have been updated.

🔗 [https://gitlab.com/r23dprinting-group/discourse-member-application](https://gitlab.com/r23dprinting-group/discourse-member-application)

---

<div class="post-metadata">

### Author: ![Willy](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/willy/32/499930_2.png) [@Willy](https://meta.discourse.org/u/Willy)
#### Post date: [June 2, 2026, 8:11pm UTC](https://meta.discourse.org/t/discourse-member-application/399190/3 "2026-06-02T20:11:56Z")

</div>

Is there a way to upload a file?

---

<div class="post-metadata">

### Author: ![R23D\_Printing](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/r23d_printing/32/544902_2.png) [@R23D\_Printing](https://meta.discourse.org/u/R23D_Printing)
#### Post date: [June 2, 2026, 8:23pm UTC](https://meta.discourse.org/t/discourse-member-application/399190/4 "2026-06-02T20:23:40Z")

</div>

Hey! Not currently. But I can certainly look into adding the feature.

---

<div class="post-metadata">

### Author: ![gilles](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gilles/32/549022_2.png) [@gilles](https://meta.discourse.org/u/gilles)
#### Post date: [June 3, 2026, 8:33am UTC](https://meta.discourse.org/t/discourse-member-application/399190/5 "2026-06-03T08:33:29Z")

</div>

On my end, I’m considering allowing registrations by comparing a specific field filled out by the user with a CSV file. In my case, I’m setting up a Discourse forum for a community of van conversions from a specific manufacturer. I receive the sold vehicles along with their license plates, and I’d like to compare the license plates entered by the user against the CSV file during registration.
