Hatke Studio

Hatke License Server

Vendor management portal — sign in to continue
Sign in with ADMIN_EMAIL and the server's ADMIN_PASSWORD (or ADMIN_TOKEN / ADMIN_API_KEY). In production the published default password is refused — set a strong ADMIN_PASSWORD before going live. The ERP's public validation endpoints stay open; only management actions require this login.
Support desk operator (tickets only)
Operators see ONLY the ticket queue — no licenses, keys, payments, SMTP secrets or audit trail. Created by the admin on the Email Identities tab.

Support desk

TicketWhenLicenseFromSubjectStatus
Loading…
Hatke Studio

Hatke License Server

Access control for Hatke ERP — keys · tenants · payments · piracy kill-switch
checking…
Operations
Customers
Commerce — manage what you sell
Control — ERP control plane
Support desk
Logs
Total licenses
–
Active (live)
–
Expired
–
Revoked
–

+ Generate / Issue a license key

Payment confirmation — auto-issue key

Check if a key is live

Licenses

LicenseCustomerAgencyTierSeats DomainExpiresStatusBound / heartbeatActions
Loading…

Public key (set as LICENSE_PUBLIC_KEY on the ERP)

–
Copy this into the ERP's LICENSE_PUBLIC_KEY. Keys issued here verify against it.

Plan management

Plans
–
Active in checkout
–
Hidden
–
Monthly price range
–
Catalog sync
–

This catalog is the single source of truth: every ERP workspace prices from the signed snapshot served at /api/catalog and re-syncs within the hour. Edits apply at runtime — no redeploy.

PlanSlugMonthlyAnnualSeatsProjectsTierFlagsStatusActions
Loading…
Edit changes every field — prices, seats, tier, feature flags — and applies to new quotes instantly. To replace a plan, edit it in place, or create the new one and deactivate the old. Deactivating hides it from checkout without touching existing licenses.

Offers & coupons

Offers
–
Running now
–
Total redemptions
–

Coupons are validated server-side at order time — the ERP checkout only displays them. Scope an offer to specific plans or cycles; inactive or out-of-window offers are hidden from every buyer automatically.

CodeValueApplies toWindowCapsUsedStatusActions
Loading…
The edit form shows a live discounted-price preview per plan before you save. Deactivate to stop a coupon without deleting its redemption history.

Operations overview

Licenses (live)
–
Workspaces live
–
Suspended
–
Piracy flags
–
Revenue (collected)
–
MRR (paid cohort)
–
Watchdog (dead)
–
Keys pending delivery
–
Manual payments
–
SMTP
–

Attention

Loading…
Pulls every tab's data into one screen: license lifecycle counts, workspace liveness from the fleet probe, control-plane suspensions, revenue and the ops inbox state. Anything needing a decision (expired keys, dead heartbeats, pending payments) is listed under Attention.

ERP Control

Licenses
–
Suspended
–
With overrides
–
Pending commands
–

SUSPEND is the reversible kill-switch: the ERP gates with a signed SUSPENDED verdict on its next phone-home (data + remaining paid time are preserved) and RESUME restores service with no buyer-side action. Feature/seat overrides ride the signed verdict too — no key reissue needed. QUEUED commands are delivered exactly once and executed vendor-signed inside the ERP.

License / agencyDomainTierStateControl stateActions
Loading…
The control file lives in config/control.json next to licenses.json. Every mutation lands in the Audit Trail tab with the operator's IP.

Email Logs

WhenToSubjectResult
Loading…
Every outbound send attempt (keys, receipts, renewal reminders, dunning, tickets, announcements) — including failures with the full SMTP error. Config/email-delivery.log keeps the last 1,000 entries. The banner above shows live SMTP health; press “Send test email” to verify now.

Support Tickets

TicketWhenLicenseFromSubjectStatus
Loading…
Buyers file tickets from their ERP (Settings → License → Contact support) or POST /api/support/ticket with their license key. Every reply emails the buyer in the branded template; the heartbeat watchdog + SMTP health banner keep problems detectable before buyers report them.

📣 Announcements

Branded template, sequential sends (SMTP-friendly), full result + audit entry. Buyers without an email on file are skipped and counted. “Anyone” sends to the addresses you type; “Custom HTML” drops your markup into the branded shell (logo + footer kept).

Email identities — multi-purpose SMTP

Routing — which mailbox sends what

PurposeProfileFrom headerVerifiedSource
Loading…
noreply = automated buyer mail (keys, receipts, reminders, dunning, key re-send) · support = ticket ack/reply AND the inbound poller's mailbox · admin = internal team alerts. No profile for a purpose → the legacy EMAIL_SMTP_* env profile sends it, so nothing changes until you add one.

SMTP profiles

ProfileHostLoginIMAPStatus
Loading…

Inbound support mail

checking…
The poller reads the support profile's IMAP settings (the “Receiving (IMAP)” block in its form — or SUPPORT_IMAP_* env). A buyer reply containing a ticket id reopens that ticket; fresh mail becomes a new ticket with an auto-ack, and the team gets the internal alert.

Support operators

NameEmailStatusLast login
Loading…
Operators sign in on the login screen (“Support desk operator”) and can ONLY see and answer tickets — never licenses, keys, payments, broadcasts, SMTP passwords or the audit trail. Disable or delete one and their access dies on their very next click.

Key re-send requests (public two-step flow)

WhenEmailLicenseStatusConfirmed
Loading…
Buyers who lost the delivery email call POST /api/support/key-resend → a 6-digit code is emailed (noreply profile) → they confirm with the code → the key email is re-sent. Codes expire in 15 minutes, max 3 requests/hour/email, 5 wrong attempts burn the code. Responses never reveal whether an email is a customer (anti-enumeration).

Audit Trail

WhenActionIPDetail
Loading…
Every admin mutation (issue / revoke / renew / suspend / overrides / catalog edits / manual-payment approvals) plus the heartbeat-watchdog state transitions. Config/admin-audit.jsonl keeps the last 1,000 entries.
Orders
–
Paid
–
Revenue (collected)
–
MRR (paid cohort)
–
Keys delivered
–
Keys pending
–

Orders by plan

–

Checkout orders

OrderPlanAmountStatusKey delivery BuyerDomainCreatedPaid
Loading…
Key delivery shows whether the HSK key was minted for a PAID order (via the ERP verify call or a gateway webhook) or is still pending. Use the eye button on the Licenses tab to reveal a full key.

Payments hub

Every rupee in one ledger — gateway, plan and rail. Buyers who paid by UPI / QR / bank transfer land here with their transaction reference. Verify against your statement, then Approve to mint + email the license key, or Reject.

Collected
–
Pending approval
–
Auto vs manual
–
Live gateways
–

Collect directly — UPI / QR / BANK

Scan to pay (UPI intent)
Configure a UPI ID on the gateways tab
Loading rails…
The QR encodes a UPI intent with the amount and payee filled in — the buyer scans it in any UPI app. The order id travels in the intent, so the UTR they submit can be matched back here. Rendered on this server: a third-party QR image service would learn the payee and the amount of every sale.

Collected by gateway

Gateway / railSettlesOrdersPaidCollected
Loading…

Collected by plan

PlanOrdersPaidCollected
Loading…

Every payment

OrderSourcePlanAmountStatusTxn refBuyerPaidActions
Loading…

Payment gateways

Turn each gateway on, paste its merchant credentials, and tick the plans it is offered for. Secrets are never sent back to this page — a saved field shows only a mask, and re-saving the form with the mask in place leaves the stored secret untouched.

Loading…
A gateway is live when it is enabled and has whatever its mode needs. Only Auto gateways mint a key with nobody in the loop; Hosted and Manual ones need a webhook or your confirmation, and the label says so.

Heartbeat Watchdog

Flags every ACTIVE license whose ERP stopped phone-homing. Thresholds scale with the ERP poll cadence (LICENSE_POLL_INTERVAL_MINUTES, default 30): warn >2x, stale >4x, dead >8x. State changes are audit-logged to config/admin-audit.jsonl.

OK
–
Warn (>2x)
–
Stale (>4x)
–
Dead (>8x)
–
LicenseCustomerAgencyTierDomainLast heartbeatSilentState
Loading…
Tenants
–
Live / active
–
Trial
–
Paid payments
–
Revenue (collected)
–
Keys delivered
–

Registered workspaces — central registry

Company / contactPlanStatusDomain Registered (activation)Last syncLive since LicensePayments
Loading…
Every workspace the ERP registers lands here (POST /api/v1/subscribers/register). Registered = activation time; the first deployment heartbeat flips the tenant LIVE. Paid checkouts attach payment rows; the minted HSK key is linked on delivery. Revoke its key on the Licenses tab to cut off access (piracy kill-switch).
Deployments
–
Workspaces live
–
Piracy flags
–
No ERP control
–

Fleet — deployed ERP instances (super admin)

One row per issued key. Workspace data comes live from each ERP through the vendor control channel. RESET deletes that domain workspace so the buyer can re-register fresh — the key and its domain binding are NEVER reset. DEACTIVATE removes the key and hard-locks the app (piracy kill-switch).

License / tierDomainWorkspace (live from ERP)HeartbeatSignalsActions
Loading…
Piracy signals: DOMAIN_MISMATCH = key running on a host it is not bound to · SURFACES n = key seen on n distinct machines in 24h (auto-revokes past the limit) · DEAD = no heartbeat beyond 8x poll cadence · NO-ERP = the ERP is unreachable or its LICENSE_ADMIN_TOKEN is missing/mismatched.
Hatke Studio — vendor license server. All mutations are Ed25519-signed; the ERP verifies every verdict with this public key.