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:
- A Discord server where you have Administrator permissions
- A Google Sheet — this is where all your data lives. One sheet per alliance, shared with the bot's service account (details below)
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.
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
Core Setup
Run /setup in your leadership channel to get started. This covers the essentials that every feature depends on.
What it asks for:
- Member role — the role all alliance members have. Used to gate the survey.
- Leadership role — the elevated role for alliance leadership. Required to use most commands.
- Leadership channel — the private channel where commands are used and drafts appear.
- Timezone — your alliance's local timezone. Used for all event times, reminders, and Desert Storm/Canyon Storm time displays throughout the bot.
- Google Sheet ID — paste the ID from your sheet's URL.
- Sheet sharing — a guided step to share your sheet with the bot's service account.
Once complete, the bot will list all the available feature setup commands so you know what to configure next.
Tip: You can run
/setupagain at any time to update any of these settings.
/setup shows your current answers and lets you edit only what's changed.
/view_configuration 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.
📣 Event Announcements — /setup_events
What to create in your sheet: Nothing required for this feature.
Run /setup_events to configure your events. The wizard first asks for settings that apply to all events:
- Draft channel — where leadership sees the draft before it goes public
- Announcement channel — where the final approved announcement posts
- Draft posting time — when the draft is posted each event day
- 5-minute warning — whether the bot auto-posts a warning before events start
You'll then see your event list with options to add, edit, or remove events. For each event you add:
- Event name (e.g.
Plague Marauder (AE),Zombie Siege) - Default time — when this event usually starts, in your timezone
- Schedule — repeating cycle (with anchor date and interval) or manual
- Announcement blurb — the message posted when this event fires, using
{time}and{server_time}as placeholders
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).
Run /setup_train to configure the train schedule. The wizard walks through 8 steps:
- Schedule tab — which tab in your sheet stores the train schedule
- Blurb generation — whether you want the bot to generate a ChatGPT prompt each day. If no, steps 3–6 are skipped.
- Themes — a list of themes leadership can choose from (e.g.
Birthday, Milestone, Welcome) - Tones — a list of tone options (e.g.
Default, More casual, More intense) - Default tone — which tone is pre-selected
- 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. - Reminders — whether the bot should post a reminder when someone is assigned the train, and if so, which channel and what time
- 💎 Train DM body — for Premium guilds with Member Roster 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.
Day-to-day use:
- Use
/trainto manage the schedule — buttons for Add, Update, Generate Prompt, and Clear - At your configured reminder time, the bot posts a reminder in your chosen channel. If blurb generation is enabled, a button lets you pull up the ChatGPT prompt instantly
🎂 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).
Run /setup_birthdays to configure birthday tracking. The wizard walks through 9 steps:
- Enable birthday tracking — opt in or skip the feature entirely
- Sheet tab — which tab contains birthday data
- Name column — the column letter containing member names (e.g.
A) - Birthday column — the column letter containing birthdays (e.g.
B) - Train integration — whether birthdays are automatically added to the train schedule. If no, steps 6–7 are skipped.
- Birthday placement — exact birthday only, or allow 1 day before/after if the birthday is taken
- Train schedule lookahead — how many days in advance to look ahead (default
14) - Birthday reminders — whether the bot posts a birthday message in Discord, and if so, which channel and what time
- 💎 Birthday DM body — for Premium guilds with Member Roster 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. Use /train_addbirthdays to trigger the check on demand if you need a birthday added sooner.
⚔️ Desert Storm — /setup_desertstorm
What to create in your sheet: A tab for Desert Storm assignments (e.g. DS Assignments).
Run /setup_desertstorm to configure Desert Storm. The wizard walks through 7 steps:
- Sheet tab — the bot manages the data structure here automatically, no formatting needed
- Teams — whether you run Team A & B, Team A only, or Team B only
- Log channel — where participation log summaries are posted after each event
- Post channel — where the finished mail is posted when leadership clicks Post & Copy at the end of
/desertstorm_draft - 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
- 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: sheet tab to write rows to, roster source (tab + name column + optional alias column + first data row), and a questions builder. Free tier supports up to 3 questions across
Text,Yes/No,Numeric, andRoster namestypes. 💎 Premium unlocks unlimited questions plusSingle-select,Multi-select, andDate. - 💎 Reminder DM body — when leadership runs
/desertstorm_remind, 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 Roster Sync.
Available placeholders in your template:
{alliance_name}— your alliance name{zones}— zone assignments block{subs}— substitute members{time}— event time (auto-filled when drafting)
Day-to-day use:
- Use
/desertstorm_draftto generate a mail draft. The flow is Pick Team → Pick Time → Mail Template (Use as-is or Edit) → Preview. Editing pastes the assignment block back to the bot; the parsed assignments are saved as next week's default but the mail itself is not posted yet. - At the preview step, click ✅ Looks Good — Post & Copy to post the mail to your configured post channel and get a copyable code block back in leadership.
- After the event, run
/desertstorm_participationto walk through your configured participation questions. The flow always asks for the date first, then steps through each question you defined in setup. The summary auto-posts to your log channel. - Use
/desertstorm_log [date]to look up past log entries — Premium gets unlimited lookback, free tier sees the 4 most recent.
🏜️ Canyon Storm — /setup_canyonstorm
What to create in your sheet: A tab for Canyon Storm assignments (e.g. CS Assignments).
Run /setup_canyonstorm — the setup is identical to Desert Storm above (7 steps including Post Channel, optional participation tracking, and an optional 💎 Premium reminder DM body). 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:
/canyonstorm_draft— generate a Canyon Storm mail draft (Team → Time → Template → Preview, then Post & Copy)/canyonstorm_participation— walk through your configured participation questions for the week/canyonstorm_log [date]— look up past log entries
📋 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).
Run /setup_survey to configure the default survey:
- Survey channel — where the survey button is posted for members to access
- Notification channel — where leadership is notified when a member submits
- Stats tab — updated with each submission (one row per member)
- History tab — a timestamped record of every submission
- Intro message — the message members see before starting the survey
- 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:
- Text — the member types a value, with an optional help text hint
- Dropdown — the member picks from a list of options you define (up to 25)
- Numeric — a number, with a configurable scale so members can type natural shorthand (
301for 301M THP,43.27for 43.27M squad power) or paste the full in-game value (304,743,912) — both work either way
💎 Premium adds two more question types — Multi-select (pick multiple options) and Date (formatted entry with strptime validation) — and 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 — when Premium is active, the command renders a list of every configured survey along with Add / Edit / 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:
- Run
/survey_postto post the answer button. Premium guilds with multiple surveys are prompted to pick which one - Members click 📋 Answer, complete the survey in a private thread, and their data is saved automatically
- Leadership sees a notification embed in the notification channel for each submission
/survey_remindis a hub command — pick Send now to fire a reminder immediately, or Manage scheduled reminders to set up a recurring daily/weekly reminder for any survey. Free tier delivers via channel post; 💎 Premium adds DM-via-Member-Roster delivery.
📈 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.
Run /setup_growth to configure growth tracking:
- Enable — opt in to growth tracking
- Source tab — which tab contains your member data
- Data start row — which row your data starts on (usually row 2, after a header)
- Name column — the column letter containing member names
- 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→ column E,THP→ column I) - Growth tab — where snapshots are written. Created automatically if it doesn't exist.
- 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–20%), Low (5–10%), None (0–5%), or Decline (< 0%) — and written to a separate Growth Breakdown sheet tab. Click 📊 See most recent Breakdown on /growth to see who is climbing and who is stalled at a glance.
Day-to-day use:
- Snapshots run automatically on your configured schedule
- Use
/growthto take a manual snapshot at any time. The status embed shows when the next scheduled snapshot will fire and offers a one-click 📸 Run Snapshot Now button if you'd rather start tracking from today. - The 📊 See most recent Breakdown button on
/growthrenders the latest transition as an ephemeral embed grouped by metric and bucket. Read-only on free tier; auto-post + customisable thresholds and labels on Premium (see below).
💎 Growth Breakdown Customisation — /setup_growth_breakdown
Free for the read-only button; Premium for the auto-post and customisation. The bucket classification itself runs on every tier — the 📊 See most recent Breakdown button on /growth reads the breakdown tab for any guild with growth tracking enabled. This wizard configures the Premium layer on top of that.
Run /setup_growth_breakdown to configure:
- Breakdown tab — which tab in your sheet holds the breakdown data (default
Growth Breakdown) - Auto-post — yes/no. If yes, pick a channel where the bot posts the breakdown after every snapshot
- 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
- Thresholds — keep the defaults (Increased ≥ 20%, Steady ≥ 10%, Low ≥ 5%, None ≥ 0%, Decline < 0%) or customise. Applies to every metric
- 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.
Free for every alliance. Run /setup_shiny_tasks to configure a daily auto-post listing every Last War server in your transfer-eligible window that has shiny tasks today:
- Enable — opt in to the daily post
- Announcement channel — where the post lands each day
- Server range — the minimum and maximum server numbers you can transfer to / from. Only servers within this window appear in the post
- Post time — when the announcement fires each day, in your timezone
- Message template — keep the default or customise. Use
{servers}as the placeholder for the server list
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 Roster Sync — /setup_members
What to create in your sheet: Nothing — the bot creates the roster tab if it doesn't already exist (or overwrites it on each sync if it does).
Premium-only. Powers every DM-based feature in the bot: birthday DMs, train assignment DMs, /desertstorm_remind / /canyonstorm_remind, /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.
Run /setup_members to configure the sync:
- Roster tab — which sheet tab the roster is written to. The bot completely overwrites this tab on each sync, so use a tab that's only used for the roster. Created automatically if it doesn't exist.
- 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. - 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
/sync_members.
An initial sync runs at the end of the wizard so you can immediately use the DM-based features.
Day-to-day use:
- If auto-sync is on, no day-to-day work — the roster stays current as members come and go.
- Use
/sync_membersto manually rebuild the roster sheet now (e.g. after a bulk role change, or if auto-sync was off and you've made changes).
📦 Data Portability — /export_config and /import_config
What to create in your sheet: Nothing.
Free for every alliance. 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.
Exporting:
- Run
/export_configin the source server. The bot shows a multi-select of every category that has saved data — core setup, events, DS, CS, train, birthday, growth, surveys, shiny tasks, member roster. Categories with no saved data don't appear - Pick the categories you want to export, then confirm
- 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:
- Run
/import_config file:<the JSON file>in the destination server - The bot validates the file, shows a preview of which categories are about to land, and asks you to confirm
- 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
/setupafterwards - 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)
- 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.