Forms and applications
Building a form, letting people fill it in, and reading what comes back.
Module: intake — off until a bot owner runs /moduleadmin enable module: Forms and applications.
See Modules.
Building a full application form, start to finish
1. Create it
/formadmin create key: staff-app name: "Staff Application" template: Blank
key is a short id you'll refer to it by in every other command — lowercase,
no spaces. template can be Blank or Staff application (a pre-built
starting point, still fully editable).
2. Add questions
/formadmin addquestion form: staff-app type: "Short text"
This opens a modal — Discord's own pop-up form, not a follow-up message — for the question itself:
| Box | What goes in it |
|---|---|
| Question | The label shown above the answer box (45 characters, Discord's own limit) |
| Help text | Optional, shown under the label (100 characters) |
| Required? | yes / no, defaults to yes |
| Options | Choice types only — one option per line |
| Rules | Optional validation, see below — e.g. minWords=40, max=10 |
type is one of:
| Type | Value | What it collects |
|---|---|---|
| Short text | TEXT_SHORT | A single line |
| Long text | TEXT_LONG | A paragraph box |
| Number | NUMBER | Digits — commas are stripped, so 1,000 and 1000 both work |
EMAIL | Validated as name@domain.tld | |
| Link | URL | Must start with http:// or https:// |
| Date | DATE | Typed as YYYY-MM-DD |
| Pick one | SINGLE_CHOICE | One of the listed options |
| Pick several | MULTI_CHOICE | Any number of the listed options |
| Yes / no | BOOLEAN | A true/false toggle |
| Agreement | CONSENT | Like Yes/no, but if it's required the answer must be "yes" — a blank or "no" blocks submission |
| File upload | FILE | An attachment |
| Pick a member | USER_SELECT | Anyone in the server |
| Pick a role | ROLE_SELECT | Any role in the server |
| Pick a channel | CHANNEL_SELECT | Any channel in the server |
The key is generated from the question, not typed. "Subject Roblox
Username" becomes the key subject_roblox_username, truncated to 24
characters; a clash gets _2, _3, and so on appended. Keys are what
/formadmin removequestion and the CSV/JSON export headers use, so if you
need a specific one, check /formadmin show after adding the question rather
than guessing from the label.
Validation rules
The Rules box takes comma-separated name=value pairs. Which names do
anything depends on the question's type:
| Type | Rules | Example |
|---|---|---|
| Short/long text | minLength, maxLength, minWords, maxWords, regex | minWords=40, maxLength=2000 |
| Number | min, max, integer=true | min=1, max=168, integer=true |
| Date | notBefore, notAfter (both YYYY-MM-DD) | notBefore=2026-01-01 |
| Link | allowedDomains | not settable from the modal — template/JSON only |
| Pick several | minSelections, maxSelections | minSelections=1, maxSelections=3 |
| File upload | minFiles, maxFiles | maxFiles=3 |
A rule that doesn't apply to the question's type is silently ignored rather
than erroring — /formadmin check won't flag a stray minWords on a Number
question, it just never fires. The error a member sees names the field in
plain language ("Describe your relevant experience needs at least 40 words
(you wrote 12)"), never the rule name itself.
Long text has a hidden Discord ceiling: the biggest a text box can hold is
4000 characters, no matter what maxLength says.
By default the question goes on the form's first page. To organise a longer form into pages:
/formadmin addpage form: staff-app title: "Background"
Then add questions to it with page: page2 (page keys are page1, page2, …
in creation order — /formadmin show lists them). A "page" here is a
logical grouping, not necessarily one screen: Discord modals hold at most 5
fields, so a page with more than 5 questions is automatically split into
Background (1/2), Background (2/2) and so on when a member fills it in.
3. Check it
/formadmin check form: staff-app
Tells you what's blocking publish — usually a page with no questions, or a choice question with no options.
4. Preview it
/formadmin preview form: staff-app
Runs the form exactly as a member would see it, without creating a real submission.
5. Publish it
/formadmin publish form: staff-app
Publishing takes a snapshot. Anyone mid-application keeps the version of
the form they started on — editing a published form later, or even
adding/removing questions, never rewrites what's underneath someone halfway
through. /formadmin check has to pass clean first.
6. Post the panel
/formadmin panel form: staff-app name: main channel: #applications title: "Join the Staff Team" description: "..." button: "Apply now"
channel defaults to wherever you run the command. The form has to be
published first — panel refuses a draft.
That's a complete form: created, questioned, paged if needed, checked, published, and live behind a button.
A worked example, start to finish
Building a real staff application — three pages, five questions, two of them validated — using the exact commands above:
/formadmin create key: staff-app name: "Staff Application" template: Blank
/formadmin addpage form: staff-app title: "About you"
addpage gives back the new page's key — page2 here, since the form
already has page1 from creation. Add the region question to it:
/formadmin addquestion form: staff-app type: "Pick one" page: page2
Question:
Which region are you in?· Required:yes· Options:AmericasEurope or AfricaAsia or Oceania
And a commitment question on the same page, this time with a rule:
/formadmin addquestion form: staff-app type: Number page: page2
Question:
Hours per week you can commit· Required:yes· Rules:min=1, max=168, integer=true
A member typing 40.5 gets "Hours per week you can commit must be a whole
number." — that's the integer=true rule speaking in plain language, not a
schema error.
Add a third page for the write-up questions:
/formadmin addpage form: staff-app title: "Experience"
/formadmin addquestion form: staff-app type: "Long text" page: page3
Question:
Describe your relevant experience· Help text:Around 40 words or more.· Required:yes· Rules:minWords=40, maxLength=2000
Someone who writes twelve words sees "Describe your relevant experience needs at least 40 words (you wrote 12)" and keeps everything else they already answered — a failed question never wipes a page.
Close with an agreement page:
/formadmin addpage form: staff-app title: "Confirm"
/formadmin addquestion form: staff-app type: Agreement page: page4
Question:
I confirm the above is accurate· Required:yes
Then check, preview, publish, and post it, exactly as in the steps above.
This is what template: "Staff application" builds for you automatically
— region, hours, experience, a scenario question, and the agreement, already
wired with those same rules. Reach for the template unless you specifically
want fewer or different questions; reach for Blank when you don't.
Managing forms afterward
| Command | What it does |
|---|---|
/formadmin list | Every form and its state |
/formadmin show <form> | Its pages and questions |
/formadmin removequestion <form> <key> | Remove one question (key shown in show) |
/formadmin pause <form> | Stop taking new responses; drafts in progress stay saved |
/formadmin resume <form> | Let a paused form take responses again |
/formadmin panels | Every panel and whether its message is still healthy |
/formadmin delete <form> confirm: <exact name> | Retire a form — responses are kept, it just disappears everywhere. Confirm by typing the form's exact display name, on purpose: a typo shouldn't be able to take out an application history. |
/formadmin purge confirm: <exact name> | Irreversibly destroy a deleted form and every response to it |
Filling one in (member side)
/form open form: staff-app
Or press the panel button. The form runs privately, one page at a time.
You can leave and come back — progress is saved as you go:
| Command | What it does |
|---|---|
/form resume | Continue a form you started earlier |
/form status receipt: <code> | Look up a submission you made, by the receipt code you were given |
/form withdraw | Discard a form you have not submitted yet |
Reading responses (staff side)
There is no live review queue yet — responses are read as a list or exported, not approved/denied through the bot.
/formadmin responses form: staff-app
Shows the 15 most recent: who submitted, their status, and when. For the full answers:
/formadmin export form: staff-app format: CSV
format is CSV (spreadsheet) or JSON (full detail). The export always uses
the version each respondent actually answered, so column labels match what
they saw — even if the form has changed since.
Answers are frozen at submission time. Ranks change and people leave groups; a queue that re-checked identity on opening would quietly rewrite its own history, so responses show things as they were when submitted, not now.
Diagnostics
/intake health
Bot-owner diagnostic: checks whether intake can actually do what it's being asked to (permissions, config) in this server.
/intake audit
Recent intake configuration changes and case events — who created, published, or deleted what, and when.
It's not working
When you are stuck
"This feature is not enabled in this server."
intake is off. Ask the bot owner to run /moduleadmin enable module: Forms and applications.
"Cannot publish — N problem(s)"
Run /formadmin check to see exactly what — usually a page with no questions.
"Publish the form before putting a panel up for it."
/formadmin panel only works on a published form. Run /formadmin publish first.
People can't see the panel button
Check they can see the channel, and that the bot has View Channel and Send
Messages there — /formadmin panel refuses to post if the bot itself can't.
I edited a form and someone's application looks old
Working as intended. They keep the version they started on — see step 5 above.
"That did not match." when deleting a form
/formadmin delete needs confirm to be the form's exact display name, not
its key. /formadmin show has the name if you're not sure.