Bank (Slash)¶
Live integration with your Slash bank account. Card swipes, deposits, and withdrawals show up in your treasurer channel within seconds via webhook. The bot also keeps a local Mongo mirror of every transaction so analytics queries are fast.
/balance¶
Current Slash account balance(s).
Usage: /balance
For debit accounts, shows one balance. For charge cards, shows both cash and credit balances.
Output: non-ephemeral. Includes account name, last 4 of account number, available + posted amounts, and the timestamp Slash computed them at.
/spending¶
Outflows for a window, MCC-categorized.
Usage: /spending [window]
| Argument | Required | Description |
|---|---|---|
window |
no | Past 7 days / Past 30 days / Current semester / Year to date (default: month) |
Output: total out, net change, breakdown by MCC category (Food, Gas, Restaurants, Bars, Utilities, etc.). Categories come from the bot's MCC mapping.
/income¶
Inflows for the same window options as /spending.
Usage: /income [window]
/card_spending¶
Card-only outflows.
Usage: /card_spending [window] [card_id]
| Argument | Required | Description |
|---|---|---|
window |
no | Same as /spending |
card_id |
no | Slash card ID (omit for all cards) |
/charges¶
Browse card transactions with a tap-to-drill-down dropdown.
Usage: /charges [window] [purchased_by] [category] [unreceipted]
| Argument | Required | Description |
|---|---|---|
window |
no | Past 7 days / Past 30 days / Current semester |
purchased_by |
no | Filter to charges marked as purchased by this brother |
category |
no | Filter by MCC category (e.g. "Food", "Gas") |
unreceipted |
no | true to show only charges still missing a receipt |
Output: paginated embed with prev/next buttons. Each row shows amount, merchant, category, 📎 (receipt attached) or ✏️ (annotated) markers. Below the embed: a select menu listing the same 10 charges — pick one to see the drill-down view (full detail, receipt image inline if attached).
The drill-down also sends a follow-up plain-text message containing just the txn ID so you can copy-paste it on mobile without fighting the embed format.
/txn¶
Full detail for a single Slash transaction.
Usage: /txn <transaction_id>
If the transaction isn't yet in the local mirror, the bot fetches it live from Slash and caches it.
Output: ephemeral. Shows amount, status, MCC category, location (city/state/zip/country), card holder, both Slash's memo and our memo, purchased-by, receipt.
/annotate_txn¶
Add a memo and/or "purchased by" to a Slash transaction. The memo is also pushed to the Slash dashboard's note field via PATCH /transaction/{id}/note.
Usage: /annotate_txn <transaction_id> [memo] [purchased_by] [purchased_by_freeform]
| Argument | Required | Description |
|---|---|---|
transaction_id |
yes | Slash transaction ID |
memo |
no | Free-text context |
purchased_by |
no | Mention a brother who actually made the purchase |
purchased_by_freeform |
no | Freeform name if not a brother (e.g. "national chapter rep") |
At least one of memo / purchased_by / purchased_by_freeform must be supplied.
Why "purchased by" matters: the cardholder ≠ purchaser sometimes. Joe might use the treasurer's card to buy event supplies. The card record alone misses that — purchased_by makes it explicit.
You can also annotate via the [✏️ Add Details] button on a live txn card (modal opens with current values pre-filled).
/list_cards¶
Live list of Slash cards (fetched from Slash) and which brothers they're linked to.
Usage: /list_cards
Each card shows its full ID in a code block (copyable for /link_card), nickname, last 4, status, holder, and link target.
/link_card¶
Link a Slash card to a Discord brother. After linking, every transaction on that card attributes to that holder in /charges views.
Usage: /link_card <card_id> <member> <label>
| Argument | Required | Description |
|---|---|---|
card_id |
yes | Slash card ID (from /list_cards) |
member |
yes | Brother holding the card |
label |
yes | Human label (e.g. "Treasurer's debit") |
/unlink_card¶
Remove the brother-link on a card.
Usage: /unlink_card <card_id>
Future transactions on that card will show as unlinked until re-linked.
/sync¶
Manual catch-up of Slash transactions into the local mirror. Useful when:
- Webhook deliveries failed (Slash flipped to
disabled/backing-off) - Bootstrapping a fresh install
- Confirming nothing was missed before generating an
/export_bank
Usage: /sync [days]
| Argument | Required | Description |
|---|---|---|
days |
no | How far back to fetch (default: since last sync; max 365) |
Live transaction cards (automatic)¶
Every card swipe, ACH deposit/withdrawal, wire, or RTP fires a webhook from Slash. Within ~3 seconds the bot posts a card in your treasurer channel:
- 💳 — normal card outflow
- 💵 — inflow (deposit, donation, refund)
- 🚨 — outflow over
ALERT_THRESHOLD_CENTS - 🚫 — declined
- 🗑️ — card closed
- 🆕 — new card issued
- 🔄 — card status updated
Outflow cards have [✏️ Add Details] and [📎 Attach Receipt] buttons. When the transaction status changes (pending → posted), the bot edits the same message in place — no duplicate posts.