Admin & manager manual
Operating the platform — who does what, where it lives, how each flow actually works.
Admin vs manager
| admin | Full access: settings, users, pricing, payouts, all order and translator operations. |
|---|---|
| manager | Day-to-day ops: orders, translators, content, entrance passages, promo codes. Cannot change app settings or users. |
| translator | Not covered here — see the translator manual. |
| customer | Not covered here — see the customer manual. |
Access & 2FA
Admin and manager accounts must enroll TOTP two-factor authentication before they can open any admin page. The login endpoint refuses to issue a token without a valid totp_code once 2FA is turned on.
Enroll from /account/profile → Two-factor authentication. Scan the QR code with Authy, 1Password, Google Authenticator, etc., then confirm with the 6-digit code. Keep the recovery secret in a password manager.
X-Requires-2FA-Setup: true. The UI's access-denied screen catches it; the API returns structured JSON.Dashboard
/admin/dashboard — KPI tiles (today's revenue, open orders, unassigned, translators awaiting review, SLA risk). Click any tile to jump into the filtered list.
Orders
/admin/orders is the operational hub:
- Filters — status chips across the top, text search by order number or customer email, date range.
- Row actions — open order, download source, override page count.
- Order detail at
/admin/orders/<id>shows messages, status history, files, and the operational action bar.
Assigning & releasing
Direct assignment
On the order detail page pick a translator from the dropdown (filtered to active translators with the matching pair) and click Assign. The translator gets a notification and the order moves to Assigned.
Release to marketplace (v2)
If you don't want to pick manually, click Release to marketplace. Only paid, unassigned orders are eligible. Translators with a matching pair see the order in their marketplace and the first to claim wins (row-locked so two can't grab it simultaneously). Releasing creates an audit entry with the admin's id.
Translators
/admin/translators lists all translator accounts with their onboarding status. Click a row to review:
- Profile card — bio, rates, payout method, agreement acceptance date.
- Language pairs — declared pairs.
- Entrance test — if a passage was assigned, the source and the translator's answer appear side-by-side.
- Review — Approve flips status to active; Reject writes manager notes the translator can see and status becomes rejected. They can address the notes and resubmit.
Entrance passages
/admin/entrance-passages manages the source-text library used for entrance tests.
- Create — pair + title + source text. Word count is computed automatically.
- Enable / Disable — inactive passages aren't auto-assigned on new translator submissions.
- Delete — existing translator tests keep a reference via the foreign key with
ON DELETE SET NULLso they aren't lost.
When a translator submits their profile, the first active passage matching any of their pairs is auto-assigned with a 24-hour deadline.
Catalog & content
- /admin/languages — supported languages. Inactive languages disappear from the calculator, catalog and sitemap.
- /admin/document-types — document types shown in the order wizard and listed on
/services. - /admin/content — FAQ items and testimonials by locale.
Pricing & promo codes
/admin/pricing — per-pair overrides. The base rate lives in app settings; per-pair rows override it.
/admin/promo-codes — percentage or fixed discount, single-use or usage cap, valid-until date. Discounts apply to the subtotal only (never to Rush / Expedited surcharges).
Payouts
/admin/payouts lists per-translator payouts.
- Create payout — pick a translator, choose a period; the system sums pages from completed orders in that window and multiplies by the translator's rate-per-page.
- Mark paid — used when you paid outside the system (manual bank transfer, Wise, etc.). Store a reference id in the payout record.
- Transfer via Connect (v2) — see the v2 section.
v2 flows (vendor-blocked)
Three integrations are scaffolded, with simulated outputs until vendor credentials are wired.
Hard copy shipping — Shippo
- Order must have
hard_copy = true. PUT /admin/orders/<id>/shippingstores the recipient address.POST /admin/orders/<id>/purchase-shipping-labelcalls the adapter. In dev it returns aSIM…tracking code; whenSHIPPO_API_KEYis set it'll hit the real vendor.
Notarization — Proof.com
- Order must have
notarization = true. POST /admin/orders/<id>/notarizewith the signer email creates a notary session.- The translator/signer gets the hosted
signer_url; completion arrives back viaPOST /webhooks/proof. GET /admin/orders/<id>/notary-sessionshows the current state.
Stripe Connect payouts
- Translator clicks Onboard with Stripe Connect on their profile.
- Profile gets a
stripe_account_id(simulated until Stripe approves the platform). - On a pending payout, admin hits
POST /admin/payouts/<id>/transferto push funds to the Connect balance.
is_configured() first; in production, if a key isn't set the endpoint still returns 200 with simulated: true — convenient for staging, but make sure production env vars are set before going live.Reports
/admin/reports — revenue by day, orders by status, per-translator output. Hit the JSON export button for further analysis in a spreadsheet.
Settings (admin only)
/admin/settings — app-level knobs stored in the app_settings table: base page rate, Rush/Expedited multipliers, page-count fallback, email sender.
Audit log
Every mutating admin action is persisted to audit_logs (actor id, path, method, summary of the diff). Use the database query panel in settings or the /admin/reports page for quick spot-checks.