Setup Guide

Everything you need to get LW Alliance Helper running in your server, from inviting the bot to configuring each individual feature. New here? Start at Before You Start and work down, or jump to a specific feature setup if you've already done the basics.


Before You Start

You'll need:

That's it. No coding, no Google Cloud setup. Just a sheet and a Discord server.


Inviting the Bot

Use the provided button to invite the bot to your server. When prompted, select your server from the dropdown and click Authorise.

Once the bot has joined, you'll see it appear in your member list. It won't do anything until you run /setup.

Invite to Server


Setting Up Your Google Sheet

Before running /setup, create a new Google Sheet. You don't need to add any tabs or columns yet. The bot will tell you what to create as you go through each feature's setup.

The one thing you need to do upfront is share your sheet with the bot's service account so it can read and write data. You'll be prompted to do this during /setup with a direct link to your sheet's sharing settings and the exact email address to use.

Set the permission to Editor when sharing.

๐Ÿ—‚๏ธ Your Sheet is where your alliance's data lives. Every piece of alliance data (power scores, growth snapshots, train history, participation logs, member roster) is written to your Sheet, on your Google account. The bot doesn't keep its own copy. If you ever stop using the bot, revoke the service-account share and you keep everything. See Where Your Data Lives for details.

Keep your Sheet ID handy. You can find it in your sheet's URL: https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID_HERE/edit


The Setup Hub

Everything starts at /setup. The first time you run it, the bot walks you through Core Setup (the essentials every feature depends on). After that, /setup opens a hub where you can pick any feature to add, edit, or disable, plus a few housekeeping buttons:

The hub is open to anyone with the leadership role or Discord Administrator permission, so a server owner can get a new install configured even before holding the leadership role themselves.

Core Setup

On a brand-new install, /setup jumps straight into Core Setup. It covers the essentials every feature depends on:

  1. Member role: the role all alliance members have. Used to gate the survey.
  2. Leadership role: the elevated role for alliance leadership. Required to use most commands.
  3. Leadership channel: the private channel where commands are used and drafts appear.
  4. Timezone: your alliance's local timezone. Used for all event times, reminders, and Desert Storm/Canyon Storm time displays throughout the bot.
  5. Google Sheet ID: paste the ID from your sheet's URL.
  6. Sheet sharing: a guided step to share your sheet with the bot's service account.

Once complete, the bot drops you on the hub so you can pick whichever feature wizard to run next.

Tip: You can run /setup again at any time to re-open the hub and edit any saved setting. Every wizard shows your current answer and lets you Keep current or change it.

The bot's edit prompt when /setup is re-run on an already-configured server, showing the existing settings and Edit/No-changes buttons
Re-running a wizard shows your current answers and lets you edit only what's changed.
The View Configuration embed showing every wizard's saved settings (Core, Events, Train, Birthdays) in a single panel
Click "View Configuration" on the /setup hub any time to see every wizard's saved answers in one place.

Feature Setup

Each feature is configured independently. Set up only what you need. Features you don't configure simply won't be active. Open /setup and click the button for whichever feature you want to add or change.

๐Ÿ“ฃ Event Announcements

/setup โ†’ "๐Ÿ“ฃ Events" for shared settings ยท /events for the per-event hub

What to create in your sheet: Nothing required for this feature.

Open /setup and click "๐Ÿ“ฃ Events" to configure the four settings that apply to every event:

Once those four are saved, run /events to manage individual events. The hub shows your current event list plus a button grid:

For each event you create, the wizard asks for:

Example blurb: Plague Marauder (AE) at {time} ({server_time} Server Time). Make sure to have offline participation checked!


๐Ÿš‚ Train Schedule

/setup โ†’ "๐Ÿš‚ Train"

What to create in your sheet: A tab for your train schedule (e.g. Train Schedule).

Open /setup and click "๐Ÿš‚ Train". The wizard walks through 9 steps:

  1. Schedule tab: which tab in your sheet stores the train schedule
  2. Blurb generation: whether you want the bot to generate a ChatGPT prompt each day. If no, steps 3 through 6 are skipped.
  3. Themes: a list of themes leadership can choose from (e.g. Birthday, Milestone, Welcome)
  4. Tones: a list of tone options (e.g. Default, More casual, More intense)
  5. Default tone: which tone is pre-selected
  6. Prompt templates: saved ChatGPT prompts using {name}, {theme}, {tone}, and {notes} as placeholders. Free tier keeps a single "Default"; ๐Ÿ’Ž Premium can save up to 10 named templates and pick the default.
  7. Reminders: whether the bot should post a reminder when someone is assigned the train, and if so, which channel and what time
  8. ๐Ÿ’Ž Train DM body: for Premium guilds with Member Sync, the bot also DMs the assigned member directly when their train day comes up. You can customise that DM's wording with {name} as a placeholder, or use the bot's default. Free guilds can configure this now; it just won't fire until you upgrade.
  9. Conductor Rotation (optional): turn on automatic conductor drafting, or skip it to keep the classic add-by-hand schedule. If you turn it on, sub-steps cover your roster source (which tab and name column the conductor pool comes from on the free tier, or ๐Ÿ’Ž your synced Member Roster), the rotation post channel, post time, weekly draft day, whether to also post the day's conductor publicly, and ๐Ÿ’Ž optional role-scoped days. See the dedicated section below for what rotation does day to day.

Day-to-day use:

๐Ÿ” Conductor Rotation (optional)

Turn on Conductor Rotation in train setup and the bot drafts each day's conductor for you instead of you assigning by hand. It picks fairly: members who have driven fewest come first, ties broken by who drove longest ago, then a stable daily random pick so the same name doesn't always win a tie. The conductor pool comes from a roster tab you point it at; on the free tier that's just a name column, with no Discord IDs needed.


๐ŸŽ‚ Birthdays

/setup โ†’ "๐ŸŽ‚ Birthdays"

What to create in your sheet: A tab containing your member roster with name and birthday columns (e.g. Birthdays, or your existing member tab).

Open /setup and click "๐ŸŽ‚ Birthdays". The wizard walks through 9 steps:

  1. Enable birthday tracking: opt in or skip the feature entirely
  2. Sheet tab: which tab contains birthday data
  3. Name column: the column letter containing member names (e.g. A)
  4. Birthday column: the column letter containing birthdays (e.g. B)
  5. Train integration: whether birthdays are automatically added to the train schedule. If no, steps 6 and 7 are skipped.
  6. Birthday placement: exact birthday only, or allow 1 day before/after if the birthday is taken
  7. Train schedule lookahead: how many days in advance to look ahead (default 14)
  8. Birthday reminders: whether the bot posts a birthday message in Discord, and if so, which channel and what time
  9. ๐Ÿ’Ž Birthday DM body: for Premium guilds with Member Sync (and a Discord ID column wired up in the birthday sheet), the bot also DMs the member directly with a personal note. Customise that DM's wording with {name} as a placeholder, or use the bot's default. Free guilds can configure now; it just won't fire until you upgrade.

Birthday messages say: ๐ŸŽ‚ Today is [name]'s birthday!

If train integration is on, birthdays auto-populate the train schedule once per day, just after server-time midnight. To trigger the check on demand when you've just added a birthday, open /train and click "๐ŸŽ‚ Run birthday check" (classic mode).


๐Ÿค Profession Buddy System

/setup โ†’ "๐Ÿค Buddy System" for configuration ยท /buddy for the hub

What to create in your sheet: A tab listing each member's profession (War Leader or Engineer). The bot reads it; you don't need a particular layout beyond a name column and a profession column.

Pair your War Leaders with Engineers so everyone knows who repairs for whom. Members look up their buddy any time. Open /setup and click "๐Ÿค Buddy System". The wizard walks through 7 steps:

  1. Enable: turn the Buddy System on or off
  2. Buddy list tab: which tab in your sheet holds professions and pairings
  3. Engineer doubling: whether one War Leader can be assigned two Engineers when Engineers outnumber War Leaders
  4. Scarcity priority: when Engineers are scarce, who gets one first, your strongest War Leaders or alphabetical order
  5. Reliability ranking (optional): keep a 1-5 score column in your sheet and the bot pairs your most reliable Engineers with your strongest War Leaders. Sub-step 5a points the bot at the tab and column holding the scores (Keep current / Use default / pick your own).
  6. Leadership alerts: an optional channel where the bot posts a heads-up when pairings change
  7. ๐Ÿ’Ž Buddy DMs: for Premium guilds with Member Sync, the bot DMs members when their buddy changes. Customise the wording with {name}, {buddy}, and {buddy_role} placeholders, or use the default. Free guilds can configure now; it just won't fire until you upgrade.

Day-to-day use:


โš”๏ธ Desert Storm

/setup โ†’ "โš”๏ธ Desert Storm"

What to create in your sheet: A tab for Desert Storm assignments (e.g. DS Assignments). If you opt in to the Premium storm workflow, the bot will also create sign-up, roster, and attendance tabs automatically.

Open /setup and click "โš”๏ธ Desert Storm". The wizard walks through 8 steps, plus an optional ๐Ÿ’Ž Premium add-on flow described below:

  1. Sheet tab: the bot manages the data structure here automatically, no formatting needed. Defaults to your Member Sync roster tab when Member Sync is configured, so storm and roster reads share the same source.
  2. Teams: whether you run Team A & B, Team A only, or Team B only
  3. Team time slots: pin which game-defined time slot each team runs at. Both teams can share a slot. The saved default carries the common case, and the "๐Ÿ“ฃ Post sign-up poll" button opens a one-week override step so leadership can swap the mapping without touching setup.
  4. Log channel: where participation log summaries are posted after each event
  5. Post channel: where the finished mail is posted when leadership clicks "โœ… Looks Good: Post & Copy" on the Generate mail flow
  6. Mail template: if you run both teams, choose one template for both or separate templates per team. A default template is provided; use it as-is or paste your own.
  7. Participation tracking (optional): opt in to log each event's participation. You define the questions yourself and where the bot reads member names from. Sub-steps cover the sheet tab to write rows to, the roster source (tab + name column + the shared Alias Column + first data row), a preset-template picker (3 free + 3 ๐Ÿ’Ž Premium ready-made question sets), and a questions builder. Free tier supports up to 3 questions across Text, Yes/No, Numeric, Roster names, and Roster multi-select (manual). ๐Ÿ’Ž Premium unlocks unlimited questions plus Single-select, Multi-select, Date, Derived count (counts past events per member), and the Discord-poll auto-prefill variant of Roster multi-select. Per-member question types feed a separate <DS|CS> Member Log tab keyed by (event date, member) that powers the Trends Viewer.
  8. ๐Ÿ’Ž Reminder DM body: when leadership clicks "๐Ÿ”” Send DM reminder to roster" on the /desertstorm hub, the bot DMs every roster member this message. Customise it with {name} as a placeholder, or use the bot's default. Stored separately for DS and CS so each event type can have its own copy. Free guilds can configure now; it just won't fire until you have Premium + Member Sync.

Available placeholders in your mail template:

๐Ÿ’Ž Premium storm workflow (optional add-on)

If your alliance has Premium, the Desert Storm wizard offers an opt-in to the full sign-up & roster workflow. Picking yes adds a short sub-flow that asks:

Once enabled, the /desertstorm hub lights up extra buttons: "๐Ÿ‘๏ธ View sign-ups + set up teams" (officer view with the roster builder and Auto-fill button), "๐Ÿ“‹ Record attendance", "๐Ÿ” View trends across events" (Per-Member Log queries), "๐Ÿ“œ View past rosters", plus "๐Ÿงฎ Manage strategy presets" and "๐Ÿ‘ค Manage member rules" for setting per-zone power floors and per-member roles. "Approve & Post" produces both an image-rendered team roster and the in-game mail text, posts to your post channel, and DMs each rostered member their personal assignment.

Day-to-day use:


๐Ÿœ๏ธ Canyon Storm

/setup โ†’ "๐Ÿœ๏ธ Canyon Storm"

What to create in your sheet: A tab for Canyon Storm assignments (e.g. CS Assignments). The Premium storm workflow also creates sign-up, roster, and attendance tabs automatically if you opt in.

Open /setup and click "๐Ÿœ๏ธ Canyon Storm". The setup is identical to Desert Storm above (8 steps including Team Time Slots, Post Channel, optional participation tracking with preset templates, and an optional ๐Ÿ’Ž Premium reminder DM body). It also offers the same ๐Ÿ’Ž Premium storm workflow opt-in: sign-up channel, auto-schedule, sheet tabs for sign-ups, rosters, and attendance, Power Data Source, and per-member assignment DM templates.

Canyon Storm event times vary by server, so the bot doesn't bake in a fixed schedule. Your alliance's storm times come from your own calendar.

Day-to-day use:


๐Ÿ“‹ Survey

/setup โ†’ "๐Ÿ“‹ Survey"

What to create in your sheet: Two tabs, one for current member stats (e.g. Squad Powers) and one for submission history (e.g. Survey History).

Open /setup and click "๐Ÿ“‹ Survey" to configure the default survey:

  1. Survey channel: where the survey button is posted for members to access
  2. Notification channel: where leadership is notified when a member submits
  3. Stats tab: updated with each submission (one row per member)
  4. History tab: a timestamped record of every submission
  5. Intro message: the message members see before starting the survey
  6. Questions: choose from the default Last War question set, edit individual questions, or build your own from scratch

The question builder supports three question types on the free tier:

๐Ÿ’Ž Premium adds two more question types: Multi-select (pick multiple options) and Date (formatted entry with strptime validation). It also unlocks min/max bounds on numeric questions for input validation.

๐Ÿ’Ž Multi-survey (Premium): alliances can configure more than one survey, each with its own questions, channel, intro, notification target, and reminder body. Manage everything from /survey overview. When Premium is active, the command renders a list of every configured survey along with "Add", "Edit", and "Remove" buttons. Adding asks for a display name and routes through the same setup wizard; editing covers both the default survey and any extras; remove deletes an extra (the default can't be removed).

Day-to-day use:


๐Ÿ“ˆ Growth Tracking

/setup โ†’ "๐Ÿ“ˆ Growth"

What to create in your sheet: A tab for your member roster (can be the same tab used by the survey, or any other tab). The bot will create the growth output tab and the breakdown tab automatically if they don't exist.

Open /setup and click "๐Ÿ“ˆ Growth":

  1. Enable: opt in to growth tracking
  2. Source tab: which tab contains your member data
  3. Data start row: which row your data starts on (usually row 2, after a header)
  4. Name column: the column letter containing member names
  5. Metrics: which columns to snapshot, each with a label and column letter. You can track as many as you want (e.g. 1st Squad Power in column E, THP in column I)
  6. Growth tab: where snapshots are written. Created automatically if it doesn't exist.
  7. Snapshot schedule: monthly on a specific day, or every X days

The growth tab will have a column per metric per snapshot period so you can see how each metric changed over time. From the second snapshot onward, every member's percent change is also classified into one of five buckets: Increased (โ‰ฅ 20%), Steady (10 to 20%), Low (5 to 10%), None (0 to 5%), or Decline (< 0%). The classification is written to a separate Growth Breakdown sheet tab. Use /growth breakdown (or click "๐Ÿ“Š See most recent Breakdown" on /growth overview) to see who is climbing and who is stalled at a glance.

Day-to-day use:


๐Ÿ’Ž Growth Breakdown Customisation

/setup โ†’ "๐Ÿ“Š Growth Breakdown"

Free for the read-only view; Premium for the auto-post and customisation. The bucket classification itself runs on every tier. /growth breakdown (and the matching button on /growth overview) reads the breakdown tab for any guild with growth tracking enabled. This wizard configures the Premium layer on top of that.

Open /setup and click "๐Ÿ“Š Growth Breakdown" to configure:

  1. Breakdown tab: which tab in your sheet holds the breakdown data (default Growth Breakdown)
  2. Auto-post: yes or no. If yes, pick a channel where the bot posts the breakdown after every snapshot.
  3. Bucket filter: which buckets fire the auto-post (e.g. only Decline + None if you only want to hear about stalled members). Empty filter posts every bucket.
  4. Thresholds: keep the defaults (Increased โ‰ฅ 20%, Steady โ‰ฅ 10%, Low โ‰ฅ 5%, None โ‰ฅ 0%, Decline < 0%) or customise. Applies to every metric.
  5. Labels: keep the defaults or rename buckets to your alliance's voice (e.g. Crushing It, Stalled, Going Backwards)

Threshold changes only affect future transitions. Historical breakdown columns are frozen at the values that were in effect when they were written, so you can change your standards without rewriting your history.


๐ŸŒŸ Shiny Tasks

/setup โ†’ "๐ŸŒŸ Shiny Tasks"

What to create in your sheet: Nothing. This feature has no sheet integration.

Open /setup and click "๐ŸŒŸ Shiny Tasks" to configure a daily auto-post listing every Last War server in your transfer-eligible window that has shiny tasks today. The wizard walks through 6 steps:

  1. Enable: opt in to the daily post
  2. Announcement channel: where the post lands each day
  3. Server range: the minimum and maximum server numbers you can transfer to or from. Only servers within this window appear in the post.
  4. Post time: when the announcement fires each day, in your timezone
  5. Message template: keep the default or customise. Use {servers} as the placeholder for the server list.
  6. Confirm & save: a final review embed shows your settings; click confirm to save and the first post will fire at the next configured time

The 3-day shiny-task cycle is derived from each server's creation date, so the same server is listed on the same day every cycle and the bot doesn't need to track which day of the cycle you're on.


๐Ÿ’Ž Member Sync

/setup โ†’ "๐Ÿ‘ฅ Member Sync"

What to create in your sheet: Nothing. The bot creates the roster tab if it doesn't already exist, and syncs into it without overwriting any columns you maintain alongside the bot-managed ones.

Premium-only. Powers every DM-based feature in the bot: birthday DMs, train assignment DMs, the storm hub's "๐Ÿ”” Send DM reminder to roster" button, the post-Approve per-member assignment DMs, /survey remind via DM-via-roster, and auto-mention in train reminders. Without it those features either silently no-op or fall back to channel posts.

Open /setup and click "๐Ÿ‘ฅ Member Sync". The wizard walks through 3 steps:

  1. Roster tab: which sheet tab the roster is written to. The bot syncs Discord ID, display name, and (optional) presence into its own columns and refuses to overwrite any column your alliance already maintains alongside them. Created automatically if it doesn't exist.
  2. Filter by member role?: if you have a member role configured in /setup, you can limit the roster to just members holding that role. Pick "No" to include every (non-bot) member of the server.
  3. Auto-sync?: whether the bot should automatically re-sync when someone joins, leaves, or changes roles. Recommended on; pick "No" if you'd rather control sync timing yourself with /members sync.

An initial sync runs at the end of the wizard so you can immediately use the DM-based features. The sync preview surfaces a presence column so you can see at a glance which roster members are currently in the Discord server.

Day-to-day use:


๐Ÿ” Transfer Management ๐Ÿ’Ž

/setup โ†’ "๐Ÿ” Transfers" for configuration ยท /transfers for the hub

What to create in your sheet: Nothing new. Point the bot at the recruiting sheet you already use. The only column it needs is the applicant's in-game name; everything else is optional. If you turn on decision write-back, the bot can add its own status columns for you.

Premium-only. Transfer Management watches your recruiting sheet and brings the moments that matter into Discord, so a promising applicant never slips through. You keep working in your sheet exactly as you do today; the bot reads it on a schedule and posts when something changes. Open /setup and click "๐Ÿ” Transfers" to run the wizard:

  1. Your recruiting sheet: tell the bot which sheet and tab to watch (paste the sheet link or ID).
  2. Column mapping: the bot reads your header row and auto-suggests which columns are the name, any extra identity columns, the status columns to watch, and the columns to show in notices. Only the name column is required, so the mapping works on whatever layout your sheet already uses.
  3. Notification channel and style: where notices post, and whether you want one message per applicant or a single batched digest each check.
  4. New-applicant filter (optional): only get pinged for applicants who meet your bar, for example a power or tier threshold across one or more columns.
  5. Optional sources: connect a server-wide sheet and/or an intake-form sheet, and the bot auto-copies matching rows (by your filter) into your own sheet so they surface as new applicants.
  6. In-game message templates: customise the apply / confirm / decline messages the bot drafts with placeholders, or use the defaults.
  7. Decisions (optional): set up Want / Confirm / Decline (or your own status), and the bot adds the columns to your sheet and writes your choice back when you click the button on a notice.

โš ๏ธ Server-wide sheets: if you connect a shared sheet owned by someone else, the bot's service account needs read access to it, so coordinate with whoever owns it. The bot only ever writes to your own recruiting sheet, never to a shared one.

Day-to-day use:


๐Ÿ“ฆ Data Portability

/config export  ·  /config import

What to create in your sheet: Nothing.

Move your bot config to a new Discord server (or snapshot it as a backup you can restore later) without recreating every wizard answer by hand. Your alliance's data always lives in your own Google Sheet either way; these commands carry the bot-side wizard answers (templates, channels, schedules, custom questions) alongside it.

Use /config overview in either server to see what's saved on this side and pointers into export and import.

Exporting:

  1. Run /config export in the source server. The bot shows a multi-select of every category that has saved data, including core setup, events, DS, CS, train, birthday, growth, surveys, shiny tasks, and member roster. Categories with no saved data don't appear.
  2. Pick the categories you want to export, then confirm.
  3. The bot DMs you a JSON file with the saved config from those categories. Keep it private: it contains your sheet ID and your old channel/role IDs.

Importing:

  1. Run /config import file:<the JSON file> in the destination server.
  2. The bot validates the file, shows a preview of which categories are about to land, and asks you to confirm.
  3. You'll be prompted to handle the source server's Google Sheet ID: use it as-is, keep the destination's existing sheet ID, type a different one, or skip and run /setup afterwards.
  4. The bot walks a remap wizard for every channel and role referenced in the export. Each prompt lists what the old channel or role was used for so you know what you're remapping. Three options per prompt: "Pick new" (Discord channel or role select), "Keep current" (leave the destination's existing value), or "Skip" (clear the field).
  5. The bot applies the imported config per category and shows a summary embed naming what landed and what was skipped.

Same-guild re-imports still walk the remap wizard, handy if you revamped your server's channels or roles. If a category fails to apply (malformed value, unexpected schema), the others still land and the result embed tells you which one to fix in the JSON and re-run.


All set? Head back to the Day-to-Day Quick Reference on the home page or browse the full Commands list.