Skip to main content

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:

BoxWhat goes in it
QuestionThe label shown above the answer box (45 characters, Discord's own limit)
Help textOptional, shown under the label (100 characters)
Required?yes / no, defaults to yes
OptionsChoice types only — one option per line
RulesOptional validation, see below — e.g. minWords=40, max=10

type is one of:

TypeValueWhat it collects
Short textTEXT_SHORTA single line
Long textTEXT_LONGA paragraph box
NumberNUMBERDigits — commas are stripped, so 1,000 and 1000 both work
EmailEMAILValidated as name@domain.tld
LinkURLMust start with http:// or https://
DateDATETyped as YYYY-MM-DD
Pick oneSINGLE_CHOICEOne of the listed options
Pick severalMULTI_CHOICEAny number of the listed options
Yes / noBOOLEANA true/false toggle
AgreementCONSENTLike Yes/no, but if it's required the answer must be "yes" — a blank or "no" blocks submission
File uploadFILEAn attachment
Pick a memberUSER_SELECTAnyone in the server
Pick a roleROLE_SELECTAny role in the server
Pick a channelCHANNEL_SELECTAny 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:

TypeRulesExample
Short/long textminLength, maxLength, minWords, maxWords, regexminWords=40, maxLength=2000
Numbermin, max, integer=truemin=1, max=168, integer=true
DatenotBefore, notAfter (both YYYY-MM-DD)notBefore=2026-01-01
LinkallowedDomainsnot settable from the modal — template/JSON only
Pick severalminSelections, maxSelectionsminSelections=1, maxSelections=3
File uploadminFiles, maxFilesmaxFiles=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:

Americas
Europe or Africa
Asia 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

CommandWhat it does
/formadmin listEvery 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 panelsEvery 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:

CommandWhat it does
/form resumeContinue a form you started earlier
/form status receipt: <code>Look up a submission you made, by the receipt code you were given
/form withdrawDiscard 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.