Admin Accounts
Username Last Login Created Actions
Loading...
Login History (last 50)
AdminIP AddressResultDate / Time
Loading...
Change Your Password
Registration Requests
Submitted Discord Name Plex / Emby / Jellyfin PayPal Email Invited By Status Actions
Loading...
Audit Log
Date / Time Admin Action Target Detail
Loading...
Settings
Branding & Identity

Customise the app for your server. These values appear in the UI, DM footers, and payment references.

Users are told to include {prefix} {discord_id} with their payment. Leave blank to hide this field.
User Lookup Portal

Users can check their own subscription status at /lookup. Set a password to enable the portal — leave blank to keep the current password unchanged.

Open Portal ↗
Discord DM Reminders

Automatically DMs users on Discord at 7 days and 2 days before their subscription expires. Requires a Discord Bot token and the user's Discord User ID (snowflake) set on their profile.

Found in Discord Developer Portal → Your App → General Information → Public Key. Required for the /myid slash command.

Discord Webhook Notifications

Sends a daily Discord alert listing users whose subscriptions expire within the threshold. Alerts fire automatically once per day. Use "Send Now" to trigger immediately.

Database Backup & Export

The system automatically saves a .db + .csv + .xlsx snapshot every 3 days to the backups/ folder on the host. JJtopia User Backup Database.xlsx is also kept up-to-date automatically whenever users are added, edited, or payments are logged. Use the buttons below for an on-demand download.

Import Users from XLSX

Import users from a StreamVault backup XLSX (Users sheet) or the original JJtopia XLSX (Main / Shine sheets). Replace All wipes existing users first.

DM Message Templates

Customise the message body sent to users. Leave blank to use the default text.
Expiry reminder placeholders: {name} {days} {expiry} {urgency}
Payment confirmation placeholders: {name} {expiry} {months}

Registration Form

Control whether the public /register form accepts new requests. The form can be auto-disabled if too many submissions arrive in a short window — a webhook alert will fire and registrations will be paused until you re-enable them.

submissions per hour
Audit Log Maintenance

Remove old audit log entries to keep the database tidy. Current entries:

Payment Notifications Maintenance

Remove old confirmed and dismissed payment notifications. Pending notifications are never pruned. Current resolved:

Help & Documentation
Public Portals
/register
New subscriber sign-up form. Requests go into the Registrations tab for admin review. Toggle open/closed from Settings. Share the URL — append ?invited_by=DiscordName to pre-fill the referral field.
/lookup
Subscribers check their own status — expiry date, days remaining, active services. Password-protected (set in Settings → Portal & Lookup). Linked accounts and payer accounts are shown together.
/pay
Displays configured payment links (PayPal, Revolut, etc.) and the payment reference format. Subscribers include the reference in their payment so you can match it to their account.
/update
Fallback self-service portal where subscribers can enter their Discord snowflake ID themselves. Use this if the /myid bot command isn't set up.
/report
Read-only subscriber report. Requires admin login — any admin account can access it. Includes a live searchable table and a Spreadsheet view rendering the current XLSX. Safe to share the URL with other admins who don't need full app access.
User Status Reference
Active
Expiry is more than 7 days away. No action needed.
Expiring
Expiry is within the next 7 days. DM reminders are sent at 7 days and 2 days before expiry.
Expired
Expiry date has passed. Use the filter buttons to isolate these users.
User Fields Explained
Discord ID — Primary identifier / display name. Shown everywhere in the app and used in DM messages as {name}. Usually the subscriber's Discord username.
Discord User ID — The numeric snowflake ID (e.g. 123456789012345678). Required for automated DM reminders. Subscribers set this via the /myid bot command or the /update portal.
Plex / Emby / Jellyfin ID — Streaming service usernames. Purely informational — used to identify the subscriber on each platform.
PayPal ID — PayPal email address. Used to match incoming payments to accounts.
Monthly Rate — The subscriber's monthly fee. Used to calculate payment amounts when logging a payment.
Payment TypeManual (you log payments yourself) or Auto (future use). Purely a label.
Notes — Freetext field. Fully searchable. The approval note and invited-by info from registrations are stored here.
Payer — Links this account to a "parent" payer. When you log a payment for the payer, you can optionally extend all linked accounts at the same time. Linked accounts are shown collapsed under the payer row.
Payments & Expiry
Logging a payment extends the subscriber's expiry by the number of months you specify. The base date is the current expiry (if it's in the future) or today (if already expired). Payment amount is automatically calculated as rate × months.
The quick extend buttons in the users table (+1m / +3m / +6m) log a payment instantly with no confirmation. Click the user's name to open the full payment modal if you need to set a specific date or amount.
When a payer is extended, a pop-up lets you select which linked accounts extend at the same time — all in a single transaction so nothing is missed.
Discord Bot Commands
/myid
Subscriber types this in Discord to register their snowflake ID. StreamVault responds with a confirmation. Required for DM reminders to work.
/senddm
Sends the subscriber a test DM using their registered snowflake ID. Lets them verify that reminders will reach them before their next expiry.
/lookup
Subscriber checks their subscription status directly in Discord. Returns expiry date, days remaining, and a link to the lookup portal.
/pay
Returns the subscriber's personalised payment reference and a link to the /pay portal with all configured payment methods.
/register
Sends the inviter a registration link for a new subscriber, with the inviter's name pre-filled in the referral field. Use this to invite someone to sign up via the web form.
DM Template Placeholders
Edit templates from Settings → DM Messages. Leave blank to use the built-in default. Supported placeholders:
{name}Discord ID (the subscriber's display name)
{days}Days until expiry (expiry reminders only)
{expiry}Expiry date formatted as DD/MM/YYYY
{months}Number of months paid (payment confirmation only)
Example: Hey {name} 👋 Your sub expires in {days} days ({expiry}). Renew at: https://your-site.com/pay
Backup & Export
Live XLSX — Regenerated automatically on every user or payment change. Always up to date. The backup container syncs this to Google Drive hourly via rclone.
Full Backup — Every 3 days: SQLite database (.db), CSV, and XLSX snapshots are saved to ./backups/ and uploaded to Google Drive. The last 10 backups are kept.
Manual Export — Download a CSV or XLSX snapshot any time from Settings → Data & Backup.
Drive badge — The "Drive Synced" badge in the app header shows the last rclone sync time. Hover for details. Turns red on error.
rclone setup — Place your rclone.conf in ./config/rclone.conf. The remote name defaults to google (set RCLONE_REMOTE in docker-compose if different).
Settings Reference
Webhook URL — Discord incoming webhook. Used for daily expiry alerts, registration notifications, spam alerts, and login alerts.
Bot Token — Discord bot token for sending DMs. Needed for /myid, /senddm, /lookup, /pay, /register commands and automated expiry reminders.
Bot Application ID + Public Key — Required to verify incoming slash command payloads from Discord. Found in the Discord Developer Portal under your application.
Org Name — Shown in the app logo, DM messages, and Discord embeds. E.g. "Anisvr".
Lookup URL — The full URL to your /lookup portal. Included in DM reminder messages so subscribers can check their status. Leave blank to auto-detect.
Payment Reference Prefix — Prefix used in payment references (e.g. "TripFund"). Subscribers include this plus their name when sending payment.
Payment Links — Up to 5 payment methods shown on the /pay page and sent via /pay bot command. Supports PayPal, Revolut, Ko-fi, Stripe, etc.
Portal Password — Password for the /lookup and /update portals. Shared with subscribers.
Registrations open — Toggle the public /register form on or off. The form auto-disables if submissions exceed the spam threshold in an hour.
Default Monthly Rate — Pre-fills the rate field in the approve-registration modal. Set to your standard subscription price.
Subscription Manager
Version 2.5.0
Created By
inzi
Built for
Features
👥 User Management
Add, edit, delete subscribers. Search across all ID fields including payer notes. Sortable columns, pagination, bulk actions.
💳 Payment Tracking
Log payments per user, automatically extends expiry. Full payment history per subscriber.
🎬 Service Management
Create and manage streaming services (Emby, Plex, Jellyfin, etc.) with custom icons and colours.
🔔 Discord Webhook Alerts
Daily automated alerts to a Discord channel listing expiring and expired subscribers. Rich embed format.
💬 Discord DM Reminders
Automated DMs to subscribers at 7 days and 2 days before expiry. Includes payment link and customisable payment reference. Fully configurable templates.
🔍 User Lookup Portal
Password-protected public portal at /lookup — users can check their own subscription status.
💾 Backup & Export
Auto-backup every 3 days (.db + .csv + .xlsx). Live XLSX stays synced on every change. Google Drive upload via rclone (hourly live file + 3-day full backup). Drive Synced status badge in the header.
🛡️ Admin Management
Multiple admin accounts with forced password change on first login, password reset with generator, and audit logging.
📋 Audit Log
Full history of all admin actions — user changes, payments, logins, exports, and settings updates. Includes before/after expiry on payment entries. Prunable from Settings.
📱 Mobile Responsive
Fully responsive design — admin panel and lookup portal work on phones and tablets.
🤖 Discord /myid Command
Subscribers type /myid in Discord to automatically register their snowflake ID for DM reminders. Self-update portal at /update as a fallback.
📨 /senddm Test Command
Subscribers type /senddm in Discord to receive a test DM and verify expiry reminders will reach them. Matches by username and display name.
🗂 Backup Log
Every backup and rclone sync event is recorded in the database with status and detail. Visible in Audit → Backup Log. Auto-pruned after 30 days.
🗑 Bulk Delete Expired
One-click removal of users expired more than a chosen number of days ago. Threshold selector from 0 to 90 days.
📂 In-App XLSX Import
Upload and import users from a StreamVault backup XLSX directly from Settings. Add-missing or full-replace mode.
🎨 Multi-Server Branding
Fully configurable org name, payment reference prefix, and lookup URL. Deploy the same app for multiple Discord servers with no code changes.
🔐 Security Hardening
Account lockout after 5 failed attempts (15 min). Failed login logging. Discord webhook alert on every admin login. Stricter rate limiting. 12-char minimum passwords.
📊 Subscriber Report
Read-only report at /report — admin login required, live searchable/filterable table. Spreadsheet View renders the live XLSX in-browser with search. Accessible to any admin account without giving full app access.
✏️ DM Template Editor
Customise the expiry reminder and payment confirmation DM body text from Settings. Supports {name}, {days}, {expiry}, {months} placeholders.
💳 /pay Command & Payment Page
Discord /pay command sends users a personalised payment reference and link to the public /pay page. Multiple payment links (PayPal, Revolut, Ko-fi, etc.) configurable in Settings.
📋 Registration Requests
Public /register form for new subscriber sign-ups. Discord /register command for inviting non-Discord users. Admin approval queue with one-click approve/reject, webhook notifications, and DM confirmation. Tracks who invited each subscriber. Auto-disables with webhook alert on spam.
Changelog
v2.5.0
Security hardening and performance pass. Frontend XSS: all dynamic innerHTML across 10+ render functions now uses escHtml(), including attribute-safe escaping of quotes. Onclick injection vectors fixed — inline event handlers now only receive integer IDs and look up data from in-memory arrays. Users endpoint N+1 query replaced with 5 batch queries (constant DB round-trips regardless of user count). Rate limiter memory leak fixed — empty IP buckets now cleaned up. CORS origin locked to ALLOWED_ORIGIN env var. SECRET_KEY now warns on startup if unset (ephemeral key used). Input validation added to create/update user routes (expiry must be valid ISO date, rate must be non-negative). 36 redundant per-route auth checks removed (handled by before_request hook). org_name XSS fixed across all public pages (/register, /lookup, /pay, /update). Help tab added to admin panel.
v2.4.2
Registration improvements: Registrations tab now auto-refreshes on click and polls every 30 seconds for new requests. Reject flow replaced with a modal that captures an optional reason — stored in the database, included in the Discord DM, and shown in the audit log. Approve modal gains an optional Note field. New History tab shows all approved/declined registrations with reviewed-by, reviewed-at, and reason/note columns.
v2.4.1
Fix /lookup and /update portals not reflecting username changes made in the admin app. Lookup now searches linked accounts via the payer_id FK (so renaming a payer is immediately reflected). /update portal now also searches emby_id, plex_id, and jellyfin_id — matching lookup portal behaviour.
v2.4.0
Registration system: public /register form for new subscriber sign-ups, Discord /register slash command for inviting non-Discord users, admin Registrations tab with approve/reject queue, webhook alerts on new requests, DM notifications on approve/reject, "Invited by" tracked in user notes for searchability. /pay slash command + public /pay payment page with configurable payment links (PayPal, Revolut, Ko-fi, Stripe, etc.) managed from Settings. Registration form on/off toggle in Settings with configurable spam threshold — auto-disables and fires a webhook alert if submissions exceed the hourly limit. Version badge added to dashboard header.
v2.2.1
Settings and Audit log pages now centred with constrained max-width — no more left-aligned cards or over-stretched tables on wide screens. Temp file cleanup after export/backup downloads. Payment expiry preview in the payment modal. Unsaved indicator on Settings cards. Audit log pagination (50/page). Webhook URL validation.
v2.2.0
Subscriber Report (/report) now requires admin login instead of the portal password — any admin account can access it directly. rclone Docker config fix (apk creates rclone.conf as a directory; Dockerfile now removes it so the bind mount works correctly).
v2.1.0
Backup log: every backup and rclone sync event recorded in the database, visible in Audit → Backup Log, auto-pruned at 30 days. Drive Synced/Drive Sync Error badge in the admin header with hover tooltip. /senddm command registered and fixed (global_name fallback, removed JJtopia default). XLSX spreadsheet search on /report. /paid slash command removed.
v2.0.0
Multi-server deployment with full branding configuration (org name, payment ref, lookup URL). Security hardening: account lockout, failed login tracking, Discord webhook login alerts, stricter rate limiting, 12-char password minimum. Subscriber Report page (/report). Google Drive backup via rclone (hourly live XLSX + 3-day full sync). Dynamic XLSX filename from org name. Clickable Discord ID opens payment history. SQLite WAL mode + indexes for performance. Search debounce.
v1.9.0
Bulk delete expired users (threshold selector). In-app XLSX import (add or replace mode). DM message template editor for expiry reminders and payment confirmations. Notes search highlight. Admin login history. Backup CSV/XLSX now includes Discord User ID for full recovery.
v1.8.0
/paid command with optional target (for payers managing multiple accounts) and amount. /senddm test DM command. Admin payment notification bell with confirm/dismiss. Mobile toast fix.
v1.7.0
/myid Discord slash command — subscribers self-register their snowflake ID for DM reminders. Self-update portal at /update as fallback. Auto-match script to bulk-populate snowflake IDs from server member list.
v1.6.0
Save confirmation on user edits, removed native confirm() from extend buttons for browser compatibility, audit log prune tool in Settings, before→after expiry detail in payment audit entries.
v1.5.0
Discord DM reminders (7 & 2 day), payment link & TripBeerFund reference, pretty embed format, JJtopia Backup XLSX live-sync, About tab.
v1.4.0
Sortable columns, pagination, bulk extend, styled confirm modals, CSV/XLSX export with payment history, admin password generator.
v1.3.0
User lookup portal (/lookup) with password protection, security hardening, Cloudflare tunnel compatibility, rate limiting.
v1.2.0
Mobile responsive design, admin management, forced password change, audit log, Discord webhook rich embeds, manual DB backup.
v1.1.0
Payment tracking, service management, expiry status dashboard, Discord webhook alerts, bulk user import from XLSX.
v1.0.0
Initial release. User management, subscription tracking, expiry dates, services, admin login.
0 selected | Extend:
Payment Notifications