Custom Wizard Plugin 🧙

The Custom Wizard Plugin lets you make user wizards for your Discourse forum. You can provide information, take user input, and perform actions, like creating topics, updating profiles and much more.

:desktop_computer: Get the code

:page_facing_up: Read the documentation

:raising_hand_woman: Request a feature

:bug: Report a bug

Not sure how to install a plugin? Follow the steps here.

You will see this plugin in action when you use the Welcome, Feature Request and Bug Report wizards on (account required).

Wondering about how to handle updates? Read our Update and Support Policy.

Quick links

Wizard Administration
Wizard Settings
Step Settings
Field Settings
Conditional Settings
Field Interpolation
Wizard Examples and Templates

Right way to customize login page and others things
Discourse Tour - do we have such one?
How to edit sign up form?
Addressing gender balance in online communities
Locations Plugin
Custom page for users
Unable to find Discobot's editable text?
2019: The Year in Review
[PAID] Form to post content to Discourse
Pandoc integration
Custom fields when registering
Is there any means, tools or features... so we can create and use a template for threads?
Discord "Welcome Screen" onboarding possible?
Easier sign up flow
Use a form to make a topic
Use a form to make a topic
Remove plug-in data please!
Make wizards for creating of Personal ads
New Users > Starting Registration with a Prompt/Post
Create first topic when registering
Help "sorting" my users
Create sub-topics?
How to assign a new registrant automatically to a group
ProCourse Memberships :money_with_wings:
Unofficial plugins management during updates
Max length of custom user field descriptions
How can a user send a file in the sign up process?
How to add users to the group when registering
Surveys Plugin documentation?
Anyway to make Forms in Discourse - One Category?
2020: The Year in Review
Prompting users to submit a link
Choose groups and watched categories on signup
New Theme: Tag-Pages Navigation
Pinning plugin and theme versions for older Discourse installs
Customise home login page
Automatic user titles based on user custom field?
Tags restricted to a category are not available to plugins or components
How to inspire visitors to make the first post?
Allow invites to direct to a Category
Making user profile fields mandatory
Anyway to make Forms in Discourse - One Category?
Advice on getting users to use the post template
[PAID] File sharing plugin
Feature Request: Automatically add users to groups based on custom field value
Discourse-common asset availability: difference between development and production?
2021: The Year in Review
Visual form entry topic templates?
Using Discourse with KYC checks
Babble - A Chat Plugin
Automatically add all users to a group?
Modification homepage
New Topic template form, like GitHub Issue templates?
Modification homepage
Forms on Discourse
Require users to join at least one group at sign-up
Reject topic containing only one or two sentences in a specific category
Locations Plugin
"Go to quote" and "Was a reply to" filter interactions
How to make the user belong to a specific group once he creates the account
Horizontal admin menu buttons cut off
How to add custom fields to models
How to make users to explicitly agree to ToS
Ask users for information *after* sign-up (welcome page?)
Secure Media Uploads
How to add a placeholder in the registration page
Discord "Welcome Screen" onboarding possible?
Tagging users (with interests/passions/skills etc)
How can i create a contact form in discourse forum?
How to create an additional sign up step? User need to upload image upon sign up before they are approved to browse or post
Force existing users to fill custom user field
How to make users to explicitly agree to ToS
Members only Category
Discourse Policy
Changes in text content not reflected on (non-english) site
Create a brief questionnaire for a new user signing-up in a private forum to help staff with the vetting process?
Button to link any post in a topic to the first post (shown only for topic owner)
Add a plugin based custom user field to the create account form?
Popup or chatbot to collect leads

Wow, this is just awesome, started testing this plugin today and looks really powerful! Thanks a lot for sharing this with the community and keeping it updated @angus and @merefield :slight_smile:

Really look forward to conditional rules for the post builder if it’s still planned, that would be a fantastic addition and really unlock a lot more potential uses.

Something else that would be cool is an option to override the New Topic button to send users to a wizard. I’ve thought of a few ways this could be implemented with varying complexity.

Global Override ‘New Topic’ Button

Globally send the user to a single specified wizard, regardless of if they are on the homepage or a category. Looks like either the logic for the category could be sorted in the wizard itself, or a simple wizard like the welcome example could be used to route the user to the correct wizards for their new topic.

The only downside to the global override approach would be that all new posts would have to go through a wizard, but I don’t think that’s a big deal at all. Some wizards could be be more or less a simple composer editor if needed. I imagine this should be possible without it being directly supported in the plugin too, just not really sure how that would be done though.

Override ‘New Topic’ Button on a per Category Basis

Allow assigning different custom wizards for the New Topic button for:

  • The homepage (ideally using a simple wizard to route the user to an appropriate wizard for their topic).
  • Each individual category (if none is assigned, then the regular composer will open).

An alternative, but likely significantly more complex approach, would be keeping the regular composer support when the New Topic button is pressed. But if a user selects a category or subcategory that a custom wizard is assigned to, closing the composer and sending the user to the specified wizard.

E.g. On the Pavilion site the New Topic button is disabled in the open source parent category as well as the bug reports and feature requests child categories. It looks like selecting those categories are also disabled in the composer if I open it from a different child category within the open source parent category. I’m guessing this is to ensure using the wizard for topic creation in those two child categories.


Can you explain what the use case is? I don’t quite understand why you’d want to do this.

Thanks for circling back on this. Just to confirm, this is your experience when secure uploads are turned on?

I’ve made a new topic for examples and templates in the custom wizard knowledge base. I’ve added the four wizards we currently use on

Yes, that’ll be coming at some point :slight_smile: Remember you can already interpolate any wizard or user field into the post builder template, which allows for a certain level of conditionality.

This one is more for a seperate theme component. It’s relatively straightforward to do this, you just need to find the route or controller action handler for the the Create Topic button action and use the pluginApi to write your own (which would reroute the user to a wizard url). The current category should be available in that context, so you could make this category specific via a site setting that maps categories to wizard urls.

You know, it seems silly, but I never actually thought about linking the Create Topic buttons in our bug report and feature request categories to their respective wizards. Or if I did, I’ve long forgotten it. Not a bad idea.


Actually I recently commissioned pavilion to create exactly this and it turned out great. I still need to pay for it, so if you want to chip in I wouldn’t complain :wink: I opted to make it open source so you are welcome to use it either way. I’ll share it once I get things buttoned up with @merefield. Here’s a post with some screenshots of what it looks like, as you will read I had to pull it from production unfortunately because the wizard has been giving me issues. Edit-added the link


Wow! I’ve been procrastinating to make something like this myself and am absolutely willing to chip in some if it will be available as open source. Please PM details.


When I’m creating a wizard and click “Save changes”, it keeps loading/spinning forever and will never save.

These are the errors in my browser console:

“wizardname” is te name of the Wizard I am trying to create.
So it seems like it tries to load itself while creating, but that doesn’t work because it doesn’t exist yet because it hasn’t been created yet.

Do you know what I am doing wrong?

Nevermind, there was a conflict with the discourse-pirate-speak plugin. I removed it, now it works.


Hi @angus ,

I have an issue with the new update. It seems the language is missing on the buttons.

Thanks :slightly_smiling_face:

Update: It works only on English so I think it’s a core issue. Because it sometimes drops my default language and set it English… It’s so strange on admin section is half Hungarian and half English… :frowning:
Maybe the change from Transifex to Crowdin causing this? Has anyone experienced anything like this?

1 Like

Glad you figured it out :slight_smile:

The wizard you shared is missing key topic fields. You need to tell it what the title, and first post in the topic is. Please read this: Action Settings - Custom Wizard - Pavilion

Do you see the issue elsewhere on your site, besides the custom wizard?


Ouch, it then became a little more advance! I will have a look at it and see if I understand.

1 Like


How to stop move uploaded images to tombstone always? It looks like Discourse handle these uploads as unused media and broke all images when move to tombstone… I found a setting for this but this feature is useful for topics and posts so i prefer this setting on.

Screen Shot 2020-07-29 at 1.14.09 AM

After i use recover from tombstone command it move back these images but few days later disappear again.

Thank you! :slight_smile:

Is watch category dropdown working okay for people on the latest version of custom wizard?

I’m seeing the following:

So basically the dropdown is blank and it looks like the category-status div is empty. I have the custom wizard working fine on a different community, but its about 10 commits back.

The forum with the broken categories dropdown has custom wizard on this commit: f70170a
The forum with the working categories dropdown has custom wizard on this commit: 290bacc

(function() {
          if ('Wizard' in window) {
            Discourse.RAW_TEMPLATES['javascripts/topic-list-item'] = requirejs('discourse-common/lib/raw-handlebars').template({"1":function(container,depth0,helpers,partials,data) 

I’m not sure what these errors are due to - or is it due to using cdn ?

weird because the wizard when it tests for a while works and then there’s the white wall. It doesn’t help to undo changes.

Uncaught TypeError: Cannot set property ‘javascripts/topic-list-item’ of undefined
_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:36991 Error while processing route: custom.index
_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:38545 Uncaught {readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, …}

If statement is not working for previous step when i trying to select from other dropdown -> dropdown.
for example 1step , dropdown 1,2,3 then 2nd step i want to choose make new dropdown like:
if step1 dropdown i choose option:1 then dropdown (2step) have options a,b,c / if dropdown(step1) i choose option:2 then dropdown step2 options e,f,g etc
(when 1step is textarea if statement also not working for dropdown)

@angus The command IF works correctly only for a Prefill label (second dropdown) field. For Content label IF does not work if i wants to select from a previous field selected by a user using (first) dropdown

If you’re uploading images that are not associated with posts or users (i.e. avatars), yes they will be caught by the clean_up_uploads job.

The ability of a plugin to add exceptions to that process is not quite there yet (see further Adding a stable way of adding whitelisted "orphaned" uploads in a plugin). See in particular my note there:

For example some people want to use the Custom Wizard plugin to upload content associated with a topic (not a post per se).

The only way to address this issue currently is to turn off the site setting clean up uploads.

This is due to a change in Discourse. @fzngagan has just fixed this for this plugin.

That code is from an old version of the plugin. Please update.

It is not possible to have conditionality beween fields in the same step yet


But it’s not the same step - I tried to give it in the second or third step additionally supporting the route to option - it still doesn’t work

I’m getting the following error on one of my “create post” wizards when I try to complete it:

< !DOCTYPE html >

My other two create post wizards are working fine, so I have no idea what’s going wrong.

1 Like

Hey @JackALaing could you export your wizards and PM me the export file? Go to the “Transfer” tab in the wizard admin panel to export.

@slivo Could you also export your wizard and send it to me? I want to be sure we’re on the same page.


Hi @angus ,
Thanks for the awesome plugin!

Has anyone ever faced an error like this before? I can create a wizard, but it’s an empty page when I try to open it and this error in the dev tools.

Uncaught Error: Could not find module discourse/lib/topic-fancy-title imported from discourse/models/bookmark
at _ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74592
at f (_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74561)
at t.module.exports.a. (_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74639)
at t.module.exports.a. (_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74470)
at require (_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74637)
at _ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74596
at f (_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74561)
at t.module.exports.a. (_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74639)
at t.module.exports.a. (_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74470)
at require (_ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:74637)


Yep same here… :frowning: