Help centre · For airline staff
Connecting Discord
Watch the video: Connect Discord
This article shows how to post your airline's activity to a Discord channel, and how to connect your Discord server so linked pilots get their pilot ID as their nickname.

You need the Discord connection permission (or to be the owner). Everything is on Staff → Airline settings → Settings, on the Community tab, in five parts, in the order you set them up: Discord server (connect, invite link, Check connection), Members (nicknames, roles, joining and leaving), Roles (which Discord role each rank and hub gives), Posts (what is posted where) and Staff log.
Post activity to a channel
This uses a Discord webhook. It works on its own, without the bot.
- In Discord, open the channel's Edit Channel → Integrations → Webhooks → New Webhook, then press Copy Webhook URL.
- In Vaeroly, go to Staff → Airline settings → Settings → Community and scroll to Posts. Once your server is connected, open Use webhooks instead first.
- Paste the link into Main webhook URL.
- In the table, tick On for what to post (each type's Where stays on Main webhook): Departures, Arrivals, PIREPs, PIREPs waiting for review (for staff), Rank promotions, New pilots, Awards, News posts, New events, Event reminders (a day and an hour before, with a sign-up button), Weekly recap, Airport NOTAMs, New bookings, Daily summary (just after midnight) and Daily staff summary (just after midnight, for staff). Airport NOTAMs, New bookings, PIREPs waiting for review, Daily summary, Daily staff summary and Event reminders are newer and stay off until you tick them.
- Press Save.
- Press Send test message and check the channel.
Arrivals and PIREPs
These are two post types:
- Arrivals: a short post when the pilot lands, as soon as ACARS reports the touchdown. It shows the pilot, the flight number, the arrival airport, the landing rate (and G when known) and a link to the live map. It is posted once per flight. Flights filed by hand or claimed never reported a touchdown, so they get no arrival post.
- PIREPs: the filed PIREP, with the aircraft, landing, block time, points and status. A PIREP that needs review is orange and starts with ⚠️ Needs review, followed by the reasons it was flagged. When staff decide, the same post is updated: green when accepted, red when rejected.
Airlines that had Arrivals and PIREPs ticked before the split have both ticked, with the same channels and roles. If you pick a role to mention for PIREPs, Mention only when a PIREP needs review (on by default) pings it only for PIREPs waiting for a decision.
If two posts per flight are too many, untick On for Arrivals in Posts and press Save: the PIREP post still goes out. Tick it again to bring the arrival posts back.
To stop posting, empty Main webhook URL and press Save. Keep the webhook link private: anyone who has it can post to that channel.
A different channel for each event
Everything set to Main webhook goes to the channel of Main webhook URL (the main channel), unless you give an event its own. For example, PIREPs to #pireps, promotions to #promotions and news to #announcements.
- In Discord, make a webhook in the other channel and copy its URL, as above.
- In the Posts table, pick Own webhook… in the event's Where.
- Paste the link into Own webhook URL, which appears under it.
- Make sure the event is ticked, then press Save.
Pick Main webhook to post the event to the main channel again. Several events can use the same webhook.
A News posts item meant only for some pilots (one rank and above, or one hub) isn't posted in full: the channel gets a short notice saying who it's for, with a link to read it on the crew centre.
An event with its own channel is posted even when Main webhook URL is empty. So you can, for example, post only the weekly recap, to one channel. An event that isn't ticked isn't posted anywhere, even with its own channel.
Send test message sends one test to each channel you set up, and tells you for each one whether it worked. Channels are named by their events, never by their link.
If PIREP posts move to another channel, staff decisions on older PIREPs no longer update their old post.
https://discord.com/api/webhooks/.Post through the bot, with a role to mention
Once your server is connected (see below), each post type can go to a channel picked from a list, posted by the bot itself, without a webhook. Each post type can also mention one role, for example @Alerts on NOTAMs or @Events on new events.
- In the Posts table, pick a channel in the post type's Where. The list shows only the channels where the bot can post (it needs View Channel, Send Messages and Embed Links there).
- Optionally pick a role in its Mention column.
- Make sure the post type is ticked, then press Save.
A post type with a bot channel goes there instead of its webhook. If it also had its own webhook, that one is kept and used whenever the bot can't post. A mention also works on webhook posts.
The chosen role is the only thing a post can ping: names in posts never ping anyone, and @everyone is never used. In Discord, turn on Allow anyone to @mention this role in the role's settings, or the mention shows without pinging.
The types under For staff only at the bottom of the table (PIREPs waiting for review and Daily staff summary) are meant for a channel only staff can read. A PIREP waiting for review shows ⏳ Waiting for review there; once staff decide, the same post changes to ✅ Reviewed: accepted or ❌ Reviewed: rejected, with who reviewed it and when. When the bot posts (not a webhook), it also marks the post with a reaction: ⏳ waiting, ✅ accepted, ❌ rejected. The bot needs Add Reactions and Read Message History in that channel. Posts never show pilots' email addresses or network IDs.
Accept and Reject from Discord
When the bot posts PIREPs waiting for review in a channel (a bot channel, not a webhook), each post has an Accept and a Reject button. Staff can decide the PIREP right there:
- Accept accepts it at once. Reject first asks why: the pilot sees the reason, as on the crew centre.
- The bot answers privately (only the one who pressed sees it), and the post changes to ✅ Reviewed: accepted or ❌ Reviewed: rejected. The buttons go away.
- The pilot gets the decision email and direct message, as for a decision on the crew centre. The decision is in the Activity log, marked (from Discord).
Only staff who may review the PIREP can use the buttons: their Discord account must be linked to Vaeroly (/link), and they need the PIREP review permission for the pilot's hub. Their own flight, a co-pilot's copy and a PIREP someone else is reviewing right now are refused, as on the crew centre. If your airline asks staff for two-step login, the button opens a form in Discord asking for the authenticator code (or a recovery code) before the decision is made; staff who haven't set up two-step yet decide on the crew centre after setting it up. To remove the buttons, untick Accept and Reject buttons on the post (bot channel only) under PIREPs waiting for review in the Posts table and press Save.
Event reminders
Tick Event reminders (a day and an hour before, with a sign-up button) in the Posts table, pick where they go, and press Save. It is off until you tick it.
- A day before an event (or as soon as an event is less than a day away), the channel gets 📅 … starts tomorrow (or today), with when it starts, the airports, how many pilots signed up and the departure slots left.
- An hour before, it gets ⏰ … starts in an hour.
- Posted by the bot, each reminder has a Sign up button that opens the event on the crew centre. Webhook posts have the link in the post instead.
- An event moved to a new time is reminded again. Reminders never name pilots.
Before this post type, airlines with the Event reminders feature got the hour-before reminder with New events. They still do, until they tick Event reminders here: then the reminders go only to its channel, never twice.
Daily summaries
Daily summary posts yesterday in numbers just after midnight: flights, hours, the pilots with the most flights and the softest landing (pilots who hide from leaderboards are left out). Daily staff summary adds PIREPs waiting for review, PIREPs rejected, hard landings, applications waiting and bookings made.
They are posted once a day, in the first hours after midnight in the time zone set right under Daily summary in the Posts table (UTC unless you choose another, for example Europe/London or Asia/Dubai). The airline has no other time zone setting, so this one only decides when the summaries go out.
Connect your Discord server
Connecting the server lets the Vaeroly bot give linked pilots your airline's pilot ID as their nickname.
- Add the Vaeroly bot to your server with the link in Discord server. If there is no link, ask the platform administrator for it. The link asks for these permissions: View Channels, Send Messages and Embed Links (for posts in the channels you pick), Manage Nicknames, Manage Roles and Create Invite, plus Kick Members when Also remove them from the Discord server is on. A bot added before these options came needs the link opened again to get the new permissions (Discord keeps the bot's messages and roles).
- In your server, type
/setup. Only members with Discord's Manage Server permission can use it. - Press the button in the reply. Log in to Vaeroly if asked.
- Pick your airline on the Connect a Discord server page.
Discord server now shows Connected and the server's name. One Discord server belongs to one airline. Picking an airline that already has a server replaces that server.
/setup button only works for a short while. If it has expired, type /setup again.Let pilots link their accounts
Pilots type /link in your server and press the button. They log in to Vaeroly and confirm, and their nickname changes to their pilot ID.
To make this easier, type /linkpanel in a channel such as #verify. The bot posts a message with a Link my account button that stays there.
Pilots can also link Discord from their Profile page.
Nickname format and role
In Members you can set:
- Nickname format: it must contain
{code}(the pilot ID).{name}is the pilot's name. The default is{code} | {name}. Discord allows 32 characters at most, so the name is shortened if needed. - Role for linked pilots (optional): once the bot is connected, pick the role from the list. Roles with permissions can't be picked, because every linked pilot gets this role. If the list can't be shown, paste the role's ID instead: in Discord, go to Server Settings → Roles, right-click the role and choose Copy Role ID.
Press Save. With Update nicknames automatically on (the default, also in Members), pilots who have already linked get the new nickname in the background. Otherwise press Update all nicknames now.
For nicknames and roles to work, the bot's role must be above your pilots' roles in Server Settings → Roles. A bot can never rename the server owner.
Roles by rank
If your airline has turned on Discord roles by rank (under Staff → Airline settings → Optional features), you can pick a Discord role for each rank on Staff → Operations → Ranks. Linked pilots get the role of their current rank, and it changes when they are promoted. Pilots who leave or are suspended lose the airline's roles and their pilot-ID nickname. The bot needs Discord's Manage Roles permission, and its own role must be above the rank roles.
Let the bot make the roles. Instead of creating the roles in Discord and picking them by hand, press Create and arrange roles in Discord in the Sync roles with Discord card on Staff → Operations → Ranks. You need the Ranks and Discord connection permissions.
- A preview shows what will happen in your server: the roles that will be created (one for each rank without a role, named after the rank), renamed, moved, and left alone. Nothing changes yet.
- Press Confirm and apply in Discord. The bot reads your server again first. If something changed in Discord since the preview, you see the new preview and confirm again.
- The bot creates the missing roles and arranges all the rank roles as one block directly below its own role, highest rank at the top. Roles you already picked for a rank are kept, not copied. A picked role that was deleted in Discord gets a new one.
- Linked pilots then get the role of their rank, in the background.
After the first sync, your rank changes follow in Discord by themselves: a renamed rank renames its role, a new rank gets a role in the right place, and changed requirements reorder the roles. When you delete a rank, you choose whether to leave its role in the server (the default) or delete it too. Each sync is listed in the Activity log.
Options in the same card (they apply at the next sync, after the preview):
- Roles for staff: none, one Staff role, or one role for each staff role (named after its title). Linked staff get them, and lose them when they stop being staff. Staff roles sit at the top of the block.
- Show rank roles separately in the member list: Discord lists members under their rank.
- Give each role its rank's colour: gold, silver or white, from the rank's insignia colour.
Before changing anything, the bot checks that it has Manage Roles (or Administrator) and that its own role is above every rank role. If not, it changes nothing and tells you what to fix, for example "Move the Vaeroly role above your rank roles in Server Settings › Roles, then try again." It also stops before your server would pass Discord's limit of 250 roles. If Discord stops it part-way, the page lists what was done and what wasn't.
The bot never touches @everyone, roles Discord manages (other bots, the booster role, integrations and linked roles), roles above its own, or roles that aren't a rank's or staff role. It never gives a role any permissions: new roles have none, and it only changes a role's name, colour and display. Set what each role may do in Discord yourself.
The roles map, hub roles and one pilot's roles
A linked pilot gets three kinds of role: the role for linked pilots (in Members), their rank's role (with Discord roles by rank on) and their hub's role. The bot only gives a role that is picked for it. It never chooses a role by its name: a Discord role called "WZZ Captain" isn't given to your Captains until it is picked for the Captain rank.
The Roles card on the Community tab shows them in three lists, each with its own count (All mapped, or how many are without a role):
- Role for linked pilots: the role picked in Members (change it there).
- Rank roles: the role picked for each rank on Staff → Operations → Ranks. When Discord roles by rank is off, the list says so.
- Hub roles: pick a role for each hub and press Save hub roles. A pilot who moves to another hub gets the new hub's role and loses the old one.
Role for ACARS testers (in Members, optional): linked pilots whose account a platform administrator marks as an ACARS tester get this role, and lose it when the mark is removed or they leave. It only goes from Vaeroly to Discord: giving someone the role in Discord unlocks nothing on Vaeroly.
When a Discord role is named like a rank or hub without a role (case, emoji and a prefix such as your ICAO code are ignored, so "WZZ Captain" or "🛫 captain" matches Captain, and "EGGW Crew" matches the hub EGGW), the list suggests it. Use the matching roles under the rank list or the hub list picks that list's suggestions at once. Then press Re-sync now in Members so pilots who already linked get them.
Under each list, Show these roles separately in Discord's member list turns on Discord's "Display role members separately from online members" for every role in that list, once, when you press it; Stop showing them separately turns it off. Only the roles mapped in that list change, and the list marks each one that is shown separately.
To see one pilot's roles, open the pilot on Staff → Pilots and press Discord roles: check and sync. The page lists the roles Vaeroly expects them to hold, which they hold, which can't be given and why (for example the role is above the bot's role), the roles that aren't set up for them, and their nickname. Sync now gives that pilot their nickname and roles straight away (once a minute).
Roles Vaeroly doesn't give, such as a tester or event role, are never taken away.
Channels by rank
To open a channel only to some ranks, use the rank roles:
- In Discord, open the channel's Edit Channel → Permissions.
- Under Roles/Members, pick @everyone and turn View Channel off (the red ✕).
- Add the rank's role and turn View Channel on (the green ✓). Add the roles of higher ranks too if they should see it.
Vaeroly never changes your channels itself. To check the setup, press Check channels by rank in the Discord box on Staff → Operations → Ranks. The page lists the channels each rank's role opens. It warns about rank channels everyone can see anyway, and about rank roles above the bot's role (the bot can't give those to pilots). It also lists the channels the bot can't see. That's fine for private channels, as the bot only needs to manage roles.
The bot in your server: joining, re-sync and health check
Joining and Re-sync now are in Members, and Check connection in Discord server, on the Community tab of Staff → Airline settings → Settings, once a server is connected. You need the Discord connection permission. In Discord, /resync and /healthcheck need Discord's Manage Server (or Administrator) permission; the bot checks it itself each time. Every command only works on the airline connected to the server it's typed in.
Roles when a linked pilot joins
Tick Give roles when a linked pilot joins and press Save (it's off until you turn it on). When someone joins your server:
- A linked pilot of your airline gets their pilot-ID nickname, the role for linked pilots and their rank's role straight away, in one go.
- Someone linked to Vaeroly who isn't your pilot gets a short note with the link to apply to your airline. An applicant waiting for approval is told their roles come once they're approved.
- Someone who hasn't linked yet gets a short note pointing to the Link my account button (or
/link).
Where the note goes:
- With Send the note as a direct message ticked, the bot sends it as a direct message.
- Otherwise, if you picked a Join notice channel, the bot posts it there and mentions the member. The list shows only the channels where the bot can post.
- With neither, there's no note. Linked pilots still get their roles.
Each pilot who joins and gets their roles is listed in the Activity log, and in the staff channel when you picked one in Staff log (below).
PIREP decisions by direct message
Tick Send pilots their PIREP decisions as a direct message and press Save (it's off until you turn it on). When staff accept, reject or invalidate a flight, change a decision, or your airline's rules reject a flight on filing, a linked pilot gets a direct message from the bot with the decision, staff's notes and a link to the PIREP. It's written in the pilot's language.
Pilots who aren't linked, or who closed direct messages from your server, don't get it. The PIREP page and its notification still show the decision, and the email goes as usual when your airline sends one.
Re-sync
Re-sync now (or /resync in Discord) puts back the nickname and roles of every linked pilot in your server, for example after someone changed roles by hand.
- Tick Dry run (report only, change nothing) (or type
/resync dry_run:True) to see what would change first. - A real re-sync can run once an hour: every airline shares the Vaeroly bot, and Discord slows down a bot that changes many members too often. Before that, you see for example "Re-sync was run 12 minutes ago; try again in 48 minutes." If you changed the roles map since the last re-sync (picked or matched a role for linked pilots, a rank or a hub), you can run it again after 5 minutes. A dry run can run once a minute.
- To fix one pilot without waiting, open them under Staff → Pilots, press Discord roles: check and sync, then Sync now (once a minute per pilot).
- It runs in the background. On the site, reload the page after a minute or two to see the report. In Discord, the bot answers with the report when it's done.
The report lists who was changed, who was already correct, and who couldn't be changed and why: not in the server, the server owner (no bot can rename them), their highest role is above the bot's role, a rank role is above the bot's role (the bot leaves that role alone), or the bot doesn't have Manage Nicknames or Manage Roles. Every re-sync is listed in the Activity log, and its result in the staff channel when you picked one.
Check connection
Check connection (or /healthcheck in Discord) checks, in order:
- The bot is online (Discord accepts its token).
- Your server is connected and the bot is a member of it.
- The bot has Manage Roles and Manage Nicknames.
- The bot's role is above every rank role, and no role picked for a rank was deleted in Discord.
- The bot can post (View Channel, Send Messages and Embed Links) in the join notice channel, the staff channel for bot messages and every bot channel picked in the Posts table.
- The bot has Kick Members, when Also remove them from the Discord server is on.
- With Give roles when a linked pilot joins on, the platform's join listener has been heard from in the last few minutes.
- When the last successful sync was.
Each problem comes with what to do, for example "Move the Vaeroly role above your rank roles in Server Settings › Roles, then try again."
/ping
Anyone in your server can type /ping. The bot answers "Pong!" with its response time and the airline this server is linked to.
One server, one airline
A Discord server belongs to one airline. Sharing one server between several airlines isn't possible. It would need a server linked to many airlines, a separate set of roles for each airline, a way to say which airline a command such as /resync is about, and a rule for nicknames when a pilot flies for more than one of them.
Staff log and member options
Staff log appears once your server is connected; the other options below are in Members. Every change is listed in the Activity log.
Staff channel for bot messages
Pick a channel (one only staff can read) and the bot posts there what it did in your server: the nicknames and roles it changed, pilots removed from the server, the permission errors it hit (for example a missing Manage Nicknames), the results of Update all nicknames now, of role syncs and of re-syncs, linked pilots joining the server and getting their roles, and pilots linking or unlinking Discord. Lines that come together are sent as one message. Pick None to stop it.
Nicknames follow names and pilot IDs
With Update nicknames automatically on, a pilot's nickname changes straight after their name or pilot number changes, after a new Nickname format, and after a new airline ICAO code (then for every linked pilot, in small batches, with one line in the Activity log). The nickname always keeps the whole pilot ID; only the name is shortened to stay within Discord's 32 characters.
When a pilot leaves
When a pilot leaves, is removed from the airline (Remove from the airline on their pilot page) or deletes their account, the bot takes back the airline's roles and their pilot-ID nickname. Suspended pilots lose the roles too, and so does a pilot who unlinks Discord or links another Discord account.
Tick Also remove them from the Discord server to also remove (kick) those pilots from your server. It is off by default.
The bot never removes the server owner, airline staff, members with Administrator, Manage Server, Kick Members or Ban Members, or members whose highest role is above the bot's. Suspended pilots are never removed. It needs the Kick Members permission: without it, it does the usual clean-up and says why in the Activity log and the staff channel. Each removal (or why it didn't happen) is listed in the Activity log.
Discord's limits
When Discord asks the bot to slow down, it waits and tries again. Large runs (every pilot's nickname) go in small batches in the background, and one airline's problem never holds up another's.
Disconnect the server
Press Disconnect server in Discord server. Channel posts through the webhook are not affected.