Forms
Replace one-off Google Forms with forms that live right inside your platform. Zander's form builder lets you create custom forms — for applications, feedback, event signups, or anything else — and sends each response straight to a Discord channel or forum thread. Staff can also turn any response directly into a support ticket. Forms also power the "linked form" option in the Applications feature, so a staff or player application can use one of your forms as its application step.
📸 Screenshot: A published form page with multiple question blocks and a submit button
For Players
Submitting a Form
Forms are published at /forms/<slug> (a web address staff choose when creating the form). Depending on how staff set it up, a form may require any of the following before you can fill it out, checked in this order:
- The form must be published (draft forms are not publicly reachable).
- Login required — if set, you're redirected to log in first.
- Password protected — if the form has an access password, you must enter it before the form renders (your browser remembers unlocked forms for the session).
- Anonymous — if enabled by staff, you can submit without your identity being attached to the response.
Supported question block types: title/description, section break, short answer, paragraph, multiple choice, checkboxes, dropdown, linear scale, and image upload. Each block can be marked required, and answers are validated (length, email/URL format, valid option membership, min/max selections, numeric range, image URL format).
After submitting, you are taken to a confirmation page. If the form has Submitter Can View enabled and you were logged in, you're taken straight to your submitted response.
Your Responses
All your past form submissions are listed at /my/forms/responses. Click any entry to view the full response you submitted — you can only view your own responses unless you're staff.
📸 Screenshot: The /my/forms/responses page showing a list of submitted form responses with dates and form names
For Staff
Creating a Form
- Go to Dashboard → Forms and click Create Form.
- Enter a name and slug (the slug determines the public URL:
/forms/<slug>). - Add form blocks in order — each block is a question or input field, with a type, required flag, label/description, and type-specific config (options, min/max length, validation, etc.).
- Configure delivery options (see below).
- Save as a draft, then publish when ready.
📸 Screenshot: The form editor with multiple question blocks and delivery configuration options
Form Settings
| Setting | Description |
|---|---|
| Name | Display name shown at the top of the form |
| Slug | URL-safe identifier — sets the public URL to /forms/<slug> |
| Status | draft (not publicly accessible) or published |
| Require Login | Require the submitter to be signed in |
| Allow Anonymous | Allow submissions without attaching the submitter's identity |
| Access Password | Optional password to restrict who can open the form |
| Submitter Can View | Whether submitters can view their own response after submission |
Discord Delivery
When someone submits a form, Zander can automatically let your Discord know — set up one or both of these:
| Method | Setting | What Happens |
|---|---|---|
| Webhook notification | discordWebhookUrl + webhookEnabled: true | An embed is posted to the configured webhook URL |
| Forum thread | discordForumChannelId + postToForumEnabled: true | A new thread is created in the configured Discord forum channel containing the full response |
Both delivery methods happen in the background — if Discord notification fails for some reason, the player's submission still goes through fine.
Viewing Responses
Go to Dashboard → Forms → <Form Name> → Responses to see all submissions, plus an aggregate summary per question (option counts/percentages for choice types, average + distribution for linear scale, text samples for free text, image URL list for uploads). You can:
- Filter responses by status (
new,in_progress,resolved) - View each individual response in full, formatted answer-by-answer
- Update a response's status
- Convert a response into a support ticket
Deleting a form is blocked once it has responses — archive it (set status back to draft, or leave unpublished) instead of trying to delete it.
Converting a Response to a Ticket
From any response detail page, click Convert to Ticket. This:
- Creates a new support ticket with the form data pre-filled as the opening message
- Adds the submitter and converting staff member as ticket participants
- Posts a Discord embed in the ticket channel with action buttons
- Marks the form response as converted
This is blocked for anonymous responses (no submitter to notify) and for responses already converted.
Permissions
| Permission | Description |
|---|---|
zander.web.forms | Base access to the Forms dashboard (list, create) |
zander.web.forms.<slug> | Manage one specific form by slug — edit, view responses, convert to ticket (e.g. zander.web.forms.feedback) |
zander.web.forms.* | Manage all forms |
zander.web.forms alone only grants list/create access — every per-form action additionally requires the matching zander.web.forms.<slug> node or the wildcard. The forms list itself is filtered down to only the forms the current user has access to.
Use slug-specific permissions to give different staff teams access to only the forms relevant to them — for example, give your events team zander.web.forms.event-signup without exposing other forms.
API Reference
This section is for developers integrating with Zander directly; if you're just using the dashboard, you can skip it.
Base path /api/forms.
| Method | Path | Auth | Request | Response |
|---|---|---|---|---|
| GET | /api/forms/get | staff/session | id, slug, or published filter | Form(s) |
| POST | /api/forms/create | staff/session | name, slug, status, webhook/forum config, flags | Created form |
| POST | /api/forms/edit | staff/session | form fields | Updated form |
| POST | /api/forms/delete | staff/session | formId | Deletes (rejects if responses exist) |
| POST | /api/forms/publish | staff/session | formId | Sets status to published |
| GET | /api/forms/responses | staff/session | formId, filters | Response list |
| GET | /api/forms/response | staff/session | responseId | Single response |
| POST | /api/forms/response/status | staff/session | responseId, status | Updates response status |
Public form pages submit through their own POST /forms/:slug/submit route rather than the JSON API above; the JSON /api/forms/* endpoints exist mainly for dashboard/staff tooling and external integrations.
Feature Toggle
"forms": true
Disabling this feature (setting it to false) removes all /forms/ routes from the site and disables the Forms dashboard section.