Organizations
| Name | Slug | Members | Seats | Status | Expires | Actions |
|---|
Users
| Name | Role | Org | Status | Last Login | Actions |
|---|
Invites
| Org | Role | Status | Expires | Created | Actions |
|---|
Trial Links
Share a single link on LinkedIn, WhatsApp, or email to let anyone sign up for a time-limited trial account. Trial users land in the shared Trial org with viewer-only access.
| Created | Uses | Expires | Status | Actions |
|---|
Analytics
Logins by user
Who's actually using it, how often, from where. Trial users get a chip; device column is the (OS · browser) mix seen across their sessions; acquisition is where they came from (newsletter / direct / referrer).
| User | Org | Logins | Page views | Last login | Devices | From |
|---|
Org adoption
Per-organisation activity. lonely seat = paid for >1 user but only one has logged in. no logins = seat exists but nobody's ever signed in. Trial orgs flagged with a chip.
| Org | Members | Active | Logins | Page views | Last activity | Flags |
|---|
Acquisition
Where sessions came from. Built from the ref= URL param on newsletter links,
UTM tags on share URLs, and the bare HTTP Referer host as a fallback.
| Source | Sessions | Users |
|---|
Top pages
| Page | Views |
|---|
Raw user activity (legacy)
| User | Page Views | Sessions | Last Active |
|---|
Corpus
Inventory counters for the entity-event graph. These were moved off the front-of-house FSI dashboard so it reads as an editorial intelligence brief rather than a bulk-extract preview.
Billing
Stripe wiring status. Set STRIPE_SECRET_KEY + STRIPE_WEBHOOK_SECRET,
point the Stripe Dashboard webhook at /api/billing/webhook, then bind each
plan's Stripe price below. Prices & amounts live in Stripe — here you set the
price binding, trial length, and what happens when a trial ends.
Plans & packaging
A plan becomes self-serve sellable once it's active and has a Stripe price ID. Trial days > 0 starts every self-serve checkout with a free trial; auto-renew converts to paid at trial end (card required), cancel ends with no charge.
Offer links (marketing)
Build a shareable link encoding a deal — fixed seats, trial length, and whether a card is required at sign-up. Paste it into outreach. A cold prospect gets a brand-new workspace; a signed-in customer can apply it to theirs. e.g. "5 seats, 14-day trial, auto-bill" vs "10 seats, 30-day trial, no card".
Firm priorities
Curate which of the ~41k FCA firms are in scope. target_tier1 + target_tier2
appear in the newsletter and refresh weekly; passive is the default for unknown firms;
excluded is dropped from the pipelines entirely. Manual overrides always win over
auto-rules. The DB is now the source of truth — target_firms.json is a bootstrap seed
only; use Export for snapshots, version control, or restoring a fresh instance.
Backfill from curated list
Reads data/target_firms.json and stamps every matching firm with the right tier. Idempotent. Skips rows where you've set a manual override.
Bulk exclude
Mark a set of firms as excluded so they stop appearing in the newsletter and refresh queues. Always shows a preview first.
compliance,other.
Triage queue — biggest untriaged firms first
Firms with no priority row (or computed status of passive) ordered by headcount.
Click a button to mark each one in place. The list refreshes after every action so you can rip
through the long tail.
| Firm | HC | Events | Mark as |
|---|
Manual overrides
Firms where you've manually set include / exclude. These always win over the auto-rules.
| Firm | Status | Override | Reason | Updated |
|---|
Backups
Daily Postgres operational dump (04:00 UTC) and weekly DuckDB snapshot (Mondays 04:15 UTC).
Both are GPG-encrypted on the server and rsync'd to the Synology NAS, which
POSTs to /api/backups/checkin after each successful pull.
A green pulled badge means the off-site copy is fresh; red means the
server has the encrypted dump but the NAS hasn't fetched it yet. Read-only view.
Recent runs — newest first
| Type | Started | Status | Size | Duration | Pulled off-site | Notes |
|---|
Errors
Every server-side 5xx and every client-side JS error lands here, regardless of whether the Discord webhook succeeded. The Discord column shows whether an alert was scheduled (yes = sent or deduped; no = no webhook configured or scheduling failed). Top errors lets you spot the single hot loop causing most of the noise. Auto-pruned after 90 days.
Top errors (by count)
| Source | Exception | Sample | Count | Users | First seen | Last seen |
|---|
Recent (newest first)
| When | Src | Exception | Where | User | Discord |
|---|
Control
FCA Pipeline
Search FCA for curated target list (250+)
Search FCA register A-Z (resumable)
Pull controlled functions for discovered firms
Full career history via /Individuals/{IRN}/CF
Entity resolution (Splink) to merge duplicates
SCA Pipeline (UAE Securities & Commodities Authority)
~279 licensed companies + employees, board members, finfluencers. No API key required.
FCA Firm Search
Person Search & Enrich
Schedules & Runs
Dagster UI →ready.