Operations

Notes and audit log

How to add internal notes on customers and what the audit trail covers.

Internal notes

Every customer profile has a Notes section at the bottom. Notes are staff-authored free-text annotations that are only visible inside the ops dashboard — they are never shown to customers.

Adding a note:

  1. Open a customer profile
  2. Type in the note box at the bottom
  3. Click Add

Notes appear in reverse-chronological order. Each note shows the author's email and timestamp.

Notes are stored in the ops database — separate from the core product database. They persist across deployments and are not affected by customer data operations.

Adding a note is an audited action — it is logged to the access log alongside the customer view.

Audit log

Ops → Audit

The audit log records every time a staff member views a customer profile or adds a note. This provides accountability for access to sensitive customer data.

Column Value
When Time of access (relative + hover for exact)
Staff Email of the staff member
Action view_customer or add_note
Target Tenant ID (clickable link to profile)

What is NOT logged:

  • Navigating to overview, revenue, credits, or growth pages
  • Performing a customer search (only the detail view is logged)

Log limits: The audit page shows the last 200 entries. The ops DB retains all entries (no automatic deletion). There is no current retention policy — oldest entries must be manually managed.

Platform metrics pages

Overview

Live aggregated snapshot of platform KPIs — workspaces, users, MRR, credits, consumption. All reads are live (no rollup cache).

Note: At high transaction volumes the credit consumption queries (30-day window) can be slow. If the overview page times out, the rollup cron needs to be re-enabled first.

Revenue

MRR breakdown by plan, active trials (with end dates), past-due subscriptions, and the last 20 cancellations. Useful for billing health checks and sales reporting.

MRR calculation:

  • Monthly plans: priceMonthlyInr × subscribers
  • Yearly plans: priceYearlyInr / 12 × subscribers
  • All values in paise (divide by 100 for INR)

Credits

Platform-wide credit usage with a 7/30/90-day toggle:

  • Total credits across all tenant wallets
  • Spend by service (which product is consuming most)
  • Top 20 consumers by net spend

Net spend formula correctly accounts for the hold/capture/void ledger — held-but-voided credits do not count toward consumption.

Growth

User signup and workspace creation trends (daily chart), waitlist snapshot, and feedback inbox.

The waitlist and feedback data is optional — if the relevant tables don't exist in the core DB (e.g., staging), those sections will be empty with no error shown.

Performance note

All metric pages use live queries against the core database. The rollup cron (which would pre-compute daily snapshots) is currently disabled due to the Cloudflare account 5-cron limit.

If queries become slow at scale, the fix is:

  1. Free a cron slot on the account (remove or merge another cron)
  2. Uncomment [triggers] in apps/internal-api/wrangler.toml
  3. Add the index: CREATE INDEX CONCURRENTLY credit_tx_created_at_debit_idx ON credit_transactions (created_at) WHERE amount < 0
  4. Deploy — the Worker will populate rollup tables nightly and reads will be instant

Staff access management

Staff access is controlled by two things:

  1. Cloudflare Access — which emails can pass the Zero Trust gate (managed in Cloudflare dashboard → Zero Trust → Access → Applications)
  2. STAFF_EMAILS env var on the Worker — secondary allowlist (requires Worker redeploy to change)

Both must allow the email. Removing someone from either one immediately revokes access.

To add a staff member:

  1. Add their email to the Cloudflare Access policy
  2. Add their email to STAFF_EMAILS (requires wrangler secret put or bulk update + redeploy)

To revoke access:

  1. Remove from Cloudflare Access policy — this is instant and sufficient; no redeploy needed
  2. (Optional) Also remove from STAFF_EMAILS for clean hygiene
Internal Ops · OperationsEdit on GitHub