Skip to content
Coritan Docs

The staff console

The console and staff API your team uses to look after customers, servers, billing and support, each member within their role.

View as Markdown

The staff console is where your team looks after customers from day to day: their accounts, servers and services, invoices and refunds, and their support conversations. Every member of your organization can sign in to it, and their role decides what they see and change. When Coritan serves your storefront's site, the console is part of it at /staff/ on your storefront domain; if you build your own storefront, the same staff routes of the Organization API are there for your team's tools.

The console opens on the Desk. A sidebar, a top bar, a search with commands, keyboard shortcuts and saved views then get you to any page and back. The same tools work on every list and every page.

A list shows its rows first, and the tiles and counts above it fill in a moment later. Rows are current when the page asks for them. A figure that counts a whole directory, such as every customer, order or invoice of your brand, is worked out once for your whole team and can be a little old. Each page gives its figures' usual age. On the first screen after the console has been quiet for a while, a figure can be older than that, by up to 30 minutes for the slowest, and it catches up within a few seconds.

The Desk is the console's home page, at /staff. Press g then h from anywhere to reach it. It shows what needs a person first, worst first, and every row opens its record.

The page greets you by first name. "Updated 3m ago" beside the refresh button says how old the numbers are. The counts read again every minute while the tab is visible. The counts for your brand as a whole, such as the Desk's tiles and the counts beside sidebar items, are normally no more than 20 seconds old, and on the first screen after a quiet spell they can be up to 200 seconds old. The numbers that are yours, such as the bell and the tickets assigned to you, are always current. The audience switch at the top of the sidebar (Paying, Everyone or Free) sets which customers every number on the page covers.

Part What it shows Who sees it
A callout above the tiles Names anything late: tickets past their first-reply target, servers that need attention, orders stuck for over an hour, invoices whose automatic retries all failed. Each item follows the role of the page it opens.
Needs attention A tile for each queue that needs a person, described below. Each tile follows its page.
Waiting for a first reply and My tickets The ticket queue in the order the Take next button hands tickets out, and the tickets on your name. Tier 1 support or higher
How the brand is doing Six figures for Today, 7 days or 30 days, each set against the period before. Billing
Stuck orders and Recent orders Paid orders not built yet, and the newest orders. Every role
Patterns to review The open abuse patterns, and the ones blocked automatically whose block has not lifted. The panel is there only while there is one. Tier 3 support or higher
Latest across the brand One feed of orders, staff actions, notices and fired alerts, newest first. Every role, with the limits below
Latest alerts The five newest alerts, unread ones in bold, and a button that opens Alerts. Every role
Keyboard A card of the keys that matter most. Every role

The tiles are in order of need: red tiles with work in them first, then amber ones, then the quiet ones. A tile at zero turns dashed and muted, so only the tiles that need someone are loud. Each tile opens the list behind it, already filtered.

Tile Opens Lowest role Red when
Tickets waiting The inbox Tier 1 support The oldest ticket has waited over an hour. Otherwise amber.
Past SLA The open tickets that are late Tier 1 support Always, while above zero.
Refunds waiting Refunds Tier 3 support Never. Amber.
Overdue invoices Invoices that are overdue Tier 3 support An invoice has used every automatic retry. Otherwise amber.
Stuck orders Orders that are stuck Read-only Never. Amber.
Servers to check Servers that need attention Tier 2 support Always, while above zero.
Abuse patterns Abuse Tier 3 support Never. Amber.
Community reports Moderation Read-only Never. Amber. Chat reports show as "more in chat" for Tier 1 support or higher.

The two ticket panels sit side by side, so the queue is on the first screen. Waiting for a first reply shows "Live" with a dot while the console follows the inbox. When the link drops it shows "Reconnecting", and the page reads the queue again every 8 seconds. In My tickets, the Take next button claims the ticket at the front of the queue and opens it. It stays off while nobody is waiting, and at your claim limit it stays off and says how many tickets you hold. Below Tier 1 support, a note says that tickets open for the support tiers and higher.

In How the brand is doing, Today is set against yesterday, 7 days against the 7 days before, and 30 days against the 30 days before. The choice stays in the address as range. Each tile shows an arrow and a percentage, green when the change is better and red when it is worse. A rise in refunds or in the first reply time counts as worse. Net revenue, Payments, Refunds, New customers and Orders placed also draw a small line of the period. Money in a second currency is named under the tile and never added in. A tile opens Analytics for the same period, set against the one before.

In the feed, admins and owners read every staff action. Tier 1 support and higher read their own actions, and Tier 3 support and higher also see notices. The link under the feed opens Activity for an admin, and your own actions for everyone else.

Select the cross on the Keyboard card to hide it. It stays hidden on this browser until you choose "Show the welcome card again" under My account, Appearance.

The sidebar, the top bar and the bell

Section titled The sidebar, the top bar and the bell

The sidebar groups the pages by the work. A page that has a lowest role is not shown to a role below it. The Inbox shows to every role but opens tickets for Tier 1 support or higher, and a Read-only member reads a note that says so. A number beside a page comes from the operations summary: open tickets, servers that need attention, refund requests waiting, unread alerts, orders that need a person, unpaid invoices and open community reports. Press g, then the key in the table, within a second to open a page.

Group Page Key Shown from
Operations Home h Read-only
Operations Inbox i Read-only
Operations Servers s Tier 2 support
Operations Refunds r Tier 3 support
Operations Activity a Tier 1 support
Operations Live w Tier 1 support
Operations Alerts x Read-only
Billing Orders o Read-only
Billing Invoices v Tier 3 support
Billing Payments p Billing
Billing Coupons u Billing
People Customers c Read-only
People Abuse b Tier 3 support
People Email l Read-only
People Team t Read-only
Community Moderation d Read-only
Community Chat k Tier 1 support
Community Notices n Read-only
Insight Analytics y Billing
Insight Marketing f Billing
Brand Settings e Admin

Your name at the foot of the sidebar opens My account (g then m), and the sign-out button is beside it. Collapse sidebar folds the sidebar to icons, and Expand sidebar opens it again; the choice stays on this browser. Between 1024 and 1279 pixels wide the sidebar folds on its own until you choose. On a phone the sidebar is a drawer behind the menu button.

The top bar holds the search button, a Storefront link that opens your site in a new tab, the bell and your avatar, which opens My account. The bell shows how many alerts you have not read, "9+" above nine and nothing at zero. It opens Alerts. The bell holds fired alerts only. News about the work, such as a new ticket or a refund request, reaches you through push notifications and the Desk's feed, as Manage the staff team and console settings explains.

Press Ctrl K (Cmd K on a Mac) anywhere, or select the search button in the top bar. On a page that has no search box of its own, / opens it too. Press the same keys again to close it, or press Esc. The search loads in the background a moment after the page settles, so it can take a moment to open only right after a page loads. If it could not load, the console says so, and the next press tries again. When trying again cannot work, the message tells you to reload the page.

With nothing typed, the search shows the pages you opened last, the records you opened last, the commands and every page you may open. As you type, it scores the pages by name and keyword ("tickets" finds the Inbox), adds your recent records, and after a short pause asks the console search for customers, orders, servers, invoices, tickets and coupons. Search across the console says what each one matches. On a large store a word that many customers, orders or invoices match lists the newest matches, paying customers first, so type more of the address, name or number to find an older one. Use the arrow keys to move and Enter to open the highlighted result. When nothing matches, Enter searches the customer directory for what you typed.

A few forms open a record straight away:

  • #1842 opens the ticket with that number.
  • An invoice number, such as letters followed by digits, finds that invoice.
  • A server UUID opens that server.
  • A bare number offers the ticket, customer, order and invoice that carry it.

A prefix narrows the search to one kind of record. Type it before the words.

Prefix Searches Lowest role
ticket: Tickets, by number or subject Tier 1 support
inv: Invoices, by number Tier 3 support
server: Servers, by hostname or server UUID Read-only
email: Customers, by email address Read-only
ip: Customers, by the IP address they signed up from. It needs the whole address. Read-only

Type > to list commands only. A command also shows among the pages when its words match what you typed. A role that cannot use a command is not offered it.

Command What it does Lowest role
Open the live view Opens Live. Tier 1 support
Open alerts Opens Alerts. Read-only
Open the refunds waiting Opens Refunds. Tier 3 support
Open overdue invoices Opens Invoices filtered to the overdue ones. Tier 3 support
Open servers needing attention Opens Servers filtered to the ones that need attention. Tier 2 support
New notice Opens Notices with the new notice form open. Tier 3 support
New coupon Opens Coupons with the new coupon form open. Billing
Take the next ticket Claims the ticket at the front of the queue and opens it. Tier 1 support
Compact density or Comfortable density Switches the table density to the other one. Read-only

Press ? anywhere to open "Shortcuts and the console map", which lists every key and shows how the console is organised. Like the search, it loads in the background after the page settles. The keys wait while you type in a field and while a dialog is open.

Keys What they do
Ctrl K or Cmd K Search the console.
/ Focus the list's search box, or open the search.
? Show the shortcuts.
Esc Close a dialog, drawer or menu.
g then a letter Go to a page, as the sidebar table above lists.
j and k In the first table on a page, move down and up a row.
Enter Open the active row as a quick view, or as its own page where it has no quick view.
o Open the active row's own page.
x Tick the active row, in a table that has a tick column.

A quick view shows a record beside the list, so you keep your place. Select a row, or press Enter on the active one. The drawer shows the record's facts, its lists and its links, and a button such as Open customer goes to the full page. Hold Cmd or Ctrl while you select a row, or use the middle button, to open the full page in a new tab.

Quick view Lowest role
Customers and orders Read-only
Tickets Tier 1 support
Servers Tier 2 support
Invoices, coupons and refund requests Tier 3 support

Below that role a row stays a plain link and the record opens as before.

A saved view keeps a list's filters under a name. Customers, Servers, Orders, Invoices, the Inbox, Refunds, Coupons and Activity each have a Views menu beside their filters.

  • The menu lists Built in views, My views and views Shared with the team. Choose one to put its filters on the list. They go into the address, so the list can also be sent as a link.
  • Save this view… keeps what the list shows now. Give it a name of up to 80 characters. Tick Share with the team to show it to everyone, which needs Tier 3 support or higher. Tick Pin as a tab to show it as a button beside the menu.
  • Manage views… renames, pins, shares and deletes your own views.
  • A view keeps filters and leaves out the page number. A pinned view that you share shows as a button for everyone on the team.
  • Only the person who saved a view changes or deletes it. Every role can save views for themselves, Read-only included.
  • You can keep 50 views for each list, and a name is used once for each list.

My account, Saved views lists every view you saved and opens, renames, pins or deletes it.

Analytics, Reports and Activity set their period with one picker. It has a button for the period, a button for what it is set against, and a Swap the two ranges button between them. Activity has no comparison.

Presets for the period, in the order the picker lists them: Today, Yesterday, This week, Last week, This month, Last month, Year to date, All time, Last 7 days, Last 14 days, Last 30 days, Last 90 days, Quarter to date, Last year, Last 12 months and Custom range. Weeks run Monday to Sunday.

Presets for the comparison: Previous period, Same days last week, Same days last month, Same days last year, Custom dates and No comparison. Previous period is the same number of days just before the period. A whole calendar month, or a month so far, is set against the month before it. All time has no comparison.

A custom range opens a calendar of two months, one on a phone, with weeks from Monday and no days in the future. Choose the first and last day, then Apply.

  • A period is at most 366 days. All time asks for the last 366 days and the page says so.
  • The presets pick their days from your browser's calendar. Analytics and Reports then count each day in the time zone of your brand's settings, and Activity counts days in UTC.
  • The period is in the address as range, from, to, compare, cfrom and cto, so a link carries it.
  • A page starts on the last preset you chose in this browser, or on Last 30 days against the Previous period the first time. Custom dates are never remembered.

Density sets how much room a table row takes. Comfortable is the default. Compact trims the padding of every row, so more of a list fits on screen. Change it under My account, Appearance, Density, or with the density command in the search. The choice stays on this browser.

A page your role cannot open is left out of the sidebar, the search and every link. If someone opens its address anyway, the page shows its header and a note that names the roles that can open it, and asks the API for nothing.

On a page you can open, a control your role cannot use stays where it is, dimmed, with a tip that names the role it needs, such as "Needs billing or higher". A role that sees a figure but not what stands behind it sees plain text where others see a link. Organization roles and permissions lists the lowest role for each area.

Analytics, at /staff/insights (g then y), is for billing or higher. A lower role who opens its address reads a note that names the roles that can.

Pick a period at the top of the page. Six figures lead: Net revenue, Payments, Refunds, New customers, Orders placed and First reply. Each shows its change against the comparison, a small line of the period and a link to the list it counts. The page then charts Revenue, Orders and Support by day, week or month, whichever fits the period, and draws the comparison dashed. Under them are Support speed (First reply, Resolution and Within SLA), Refunds, Churn, Revenue by product, Tickets by department, Right now (Recurring revenue, Active services and Outstanding invoices, which ignore the period), Storefront visitors and Acquisition. Acquisition says where visits, sign-ups and orders came from, with the return on your ad spend; Read the acquisition report explains each panel. Every figure, chart point and bar opens the list it counts, so you can check a number.

The page reads every amount in one currency, the one with the most payments in the period, and never adds money across currencies.

  • Build a report… opens the report builder for the same period.
  • Export CSV downloads the daily figures of the period as insights-<from>-to-<to>.csv. It counts towards the limit of 12 exports an hour.

The report builder, at /staff/insights/reports, is for billing or higher. It reads as a sentence: "Show a figure by a split as a chart", and a "top" count for a split by category. The builder offers only the pairs the API accepts.

Figure Splits it takes
Net revenue, Payments, Refunds Day, Week, Month, Product type, Plan, Payment method, Coupon, Customer type
New customers Day, Week, Month, Customer type, and the attribution splits below
Orders placed, Orders failed Day, Week, Month, Product type, Plan, Location, Coupon, Customer type
Net revenue, Payments, Refunds, Orders placed and New customers Also the attribution splits: Channel, First channel, Source, Medium, Campaign, Landing page, Device, Heard about us and Coupon campaign. They read each order's attribution record, and an order with none falls in the group Unknown.
Visits, Conversion rate Day, Week, Month, Channel, Source, Medium, Campaign, Landing page, Device. Conversion rate is paid orders over visits, shown as a percentage such as 3.42%.
Tickets opened, Median first reply Day, Week, Month, Department
Active services Product type, Plan, Location, Customer type. It is what is active now, so it has no comparison and no line.

A split by Day, Week or Month draws a Line, Bars or Table only. A split by a category draws Bars, Ranked bars or Table only, for the top 5, 10, 20 or 50 groups. Under the chart, the table lists the figures with their total, and each row opens the list it counts. Export CSV downloads that table as report-<figure>-by-<split>-<from>-to-<to>.csv. The whole builder is in the address, so a link sends a colleague the same report.

The panel Saved reports keeps reports under a name.

  • Save as new… asks for a Name. Share with the team shows the report to everyone and needs Tier 3 support or higher, which every role that can open the builder has.
  • Mail it sends the report on a schedule: Off, Daily at 07:00 or Weekly on Monday at 07:00, in your brand's time. Send it to takes up to 20 addresses, and only billing or higher can receive a report.
  • A mailed report covers the same number of days each time, ending the day before. The email shows the top 12 rows and attaches a CSV of up to 500.
  • Load puts a saved report on the builder. Update… replaces it with the report on screen, and Delete… removes it. Only the person who saved a report changes it.

Activity, at /staff/activity (g then a), reads the organization's audit log, newest first. It is for Tier 1 support or higher.

  • Admins and owners read the whole log. A switch between Everyone and Mine narrows it to their own actions.
  • Every other role reads their own actions, on a page titled My activity. They read the rest through the Activity tab of a customer, an order or a server.
  • Chips above the list name each area of the log with how many entries it holds, biggest first. Choose one to narrow the list. The counts leave out the area and action filters, so the other chips keep their numbers. With no other filter on, an admin's counts and the list of actions in the Action choice are normally no more than a minute old, and up to 10 minutes old on the first screen after a quiet spell. The list of entries is always current.
  • The filters are a search for an action word or a record number, a period without a comparison, the Record, the Action and, for Admins, Who. A Views menu keeps them, with Money moves and Support sessions built in.
  • A row that names a customer, an order, an invoice or a server opens a quick view of it.
  • Export CSV downloads the filtered log. Only admins and owners can use it.

The organization's tabs in the Coritan dashboard are where owners and admins set the organization up: its settings, members, API keys, products and prices, payouts, DNS, mail, integrations and webhooks. Organizations lists them. Both places use the same roles and read the same customers, services and invoices, so a change made in one shows in the other. The support inbox, the tools for customers' servers, refund requests, coupons, notices, alerts and community moderation are in the staff console only.

  • Each area needs a role. Organization roles and permissions lists the lowest role for each, and a call below it answers 403 with Support access required, Tier 2 support access required, Billing access required or Admin access required.
  • Actions that move money, end things or open a customer's account also need a step-up in the last 10 minutes, as Sign in to the staff console explains.
  • The console works only while your organization is active. For any other status every staff route answers 404 Organization not found.
  • Actions that are easy to repeat by mistake have hourly limits for each member, such as 30 credit changes or 12 exports an hour. Past a limit the route answers 429 with rate_limited, the action it counts and retry_after_seconds, and sends a Retry-After header.
  • Each member keeps up to 50 saved views for each list.

The console's pages call the Organization API under https://api.coritan.com/api/v1/orgs/{org_slug}/staff/, and the support inbox calls /chat/staff/. Your own tools can call the same routes as a member, with either credential in Authorization: Bearer:

  • A console session from staff sign-in, which starts with ost_. Only a console session can make a step-up, so use one for the actions that need it.
  • The member's Coritan access token, $CORITAN_TOKEN in the examples on other pages. It reaches every staff route except those actions.

A Coritan account that is not a member gets 403 Not a member of this organization. The examples below use $STAFF_TOKEN for either credential.

Find the reference for each area

Section titled Find the reference for each area

The API reference lists every staff route with its parameters and answers:

Area Reference
Sign-in, two-factor authentication and sessions Staff sign-in
The operations summary, search, orders and refund requests Staff operations
Activity and insights Staff insight
Saved views Staff views
Alerts and the bell Staff alerts
Game network deliveries Staff network
Push notifications Staff push
Email digests Staff digest
Customers Customers in the staff console
Invoices Invoices in the staff console
Transactions, disputes and failed charges Staff billing
Customer services Services in the staff console
Coupons Staff coupons
Servers Servers in the staff console
The support inbox Staff support and your server access
The team Staff team and the assignee list
Brand settings Settings in the staff console and console API keys
Notices Staff notices
Community moderation Staff community

Any member can read the counts behind the console's home page:

Shell
curl "https://api.coritan.com/api/v1/orgs/acme/staff/ops-summary?audience=paid" \
  -H "Authorization: Bearer $STAFF_TOKEN"
Field What it counts
open_tickets Conversations that are open, in progress, or waiting on your team or the customer.
sla_breached Of those, the ones still waiting on your team for a first reply past its target. A conversation waiting on the customer or on hold is not counted (Support inbox).
assigned_to_me Open conversations assigned to you.
pending_refunds Refund requests waiting for a decision.
unpaid_invoices Invoices with the status unpaid, and in unpaid_invoices_24h the ones raised in the last 24 hours.
dunning_failing Unpaid or overdue invoices whose automatic charge attempts have run out.
pending_services Orders that are pending or failed and are not waiting for their invoice to be paid.
orders_24h Orders placed in the last 24 hours.
customers Customer accounts, and in signups_24h the ones created in the last 24 hours. Placeholders for forum authors moved from your old site are not accounts and are not counted.
servers_attention Servers whose install failed, that are being moved, or that have been installing for more than 180 seconds.
community_open Forum reports, guide proposals, comments and guide reports waiting for a moderator.
chat_reports_open Community chat messages with an open report.
unread_alerts Fired alerts your role can read, that you have not opened, from the last 30 days. It is your own count, and it is the number on the bell.
audience_counts Paid and free totals of customers (accounts only), orders, invoices and tickets.

The counts of your brand as a whole (every field except assigned_to_me and unread_alerts) are the same for every member. They are normally no more than 20 seconds old, and audience_counts no more than 60 seconds. The first request after a quiet spell can show numbers up to 200 seconds old for the first group and 10 minutes old for audience_counts. assigned_to_me and unread_alerts are read on every call.

audience is paid, free or all, the default. A paid customer holds at least one service that is not on your free tier; everyone else, including a customer with no services, is free. A service is on the free tier when its product is a free tier or when the server that belongs to it sleeps when nobody plays. The server linked to the service decides on its own, and a $0 promotion does not make a service free. It narrows open_tickets, sla_breached, the unpaid invoice counts, pending_services, orders_24h and customers, and the other counts cover everyone. The console's lists take the same parameter and put paid customers first.

Shell
curl "https://api.coritan.com/api/v1/orgs/acme/staff/search?q=alex%40example.com" \
  -H "Authorization: Bearer $STAFF_TOKEN"

q takes 1–200 characters, and audience works as above. Any member can search, and the answer groups what matched:

Group Matches on At most
customers Email, first or last name, username, company, or the customer's ID 20
invoices Part of the invoice number 10
services Part of the hostname 10
servers Part of the server's UUID, when q has 8 characters or more 10
tickets Part of the subject, or the ticket number such as #1042 10
coupons Part of the code, for Tier 3 support and above; empty for other roles 6

Customers, invoices, services and servers carry is_free, and paid customers come first. The answer is always current. Customers, invoices and services list paying ones first, then the newest first. The search reads the newest 300 paying matches and the newest 300 others of each kind (for invoices, the highest numbers), so a paying match is listed however many newer matches do not pay, and a very broad q lists the newest matches, not every match. Under paid or free only that group is read. Tickets are listed newest activity first, inside the audience. Accounts whose address or username starts with q are read first, and when 20 or more start with it the other columns are not searched. A q with an @ is matched against email addresses only. A q that is a whole server UUID also finds every service whose record names it. The search prefixes of the console, such as ticket:, are not part of the API: the console removes the prefix and sends the words after it as q, except ip:, which it sends to GET /staff/customers instead.

The activity routes read the organization's audit log, newest first:

Shell
curl "https://api.coritan.com/api/v1/orgs/acme/staff/activity?customer_id=812&since=2026-09-01&limit=50" \
  -H "Authorization: Bearer $STAFF_TOKEN"
Parameter What it keeps
customer_id Entries about the customer and about any of their services.
service_id Entries about one customer service.
server_uuid Entries about one server.
actor_id Entries made by one person. For a member, it is the user_id that GET /staff/auth/me answers.
action Actions whose name starts with this, such as customer. or invoice.marked_paid.
resource_type Entries about one kind of record, such as customer.
since and until Dates in UTC, such as 2026-09-01. Both days are included.
q Part of an action name, or a record's ID.
limit and offset 1–200 entries a page, 50 by default.

Each entry has id, at, action, actor_type, actor_id, actor_name, resource_type, resource_id, details and ip_address. What a role may read:

  • Owners and admins read the whole log.
  • Tier 3 support and billing must pass customer_id, service_id, server_uuid or their own actor_id, or the route answers 403 Name a customer, order or server; the whole log is for org admins.
  • Tiers 1 and 2 must pass their own actor_id, or it answers 403 Your own actions are the part of the log your tier may read.
  • Read-only members get 403 Support access required.

GET /staff/activity/actions lists the action names that occur, with a count for each, most frequent first and at most 100. Below Tier 3 it lists only your own.

GET /staff/activity/facets takes the same filters and follows the same role rules. It answers the entries it matches by area, for the chips above the console's list:

JSON
{
  "areas": [
    {"key": "customer", "label": "Customer", "count": 41, "prefix": "customer."},
    {"key": "invoice", "label": "Invoice", "count": 17, "prefix": "invoice."}
  ],
  "total": 58
}

An area is the text of an action before its first dot, biggest first. prefix is the action value that narrows GET /staff/activity to the area. total is the sum of the counts.

GET /staff/activity/export.csv takes the same filters and downloads the log as CSV. It is for owners and admins. It carries at most 50,000 entries, newest first, with the columns time, action, actor_type, actor_id, actor_name, resource_type, resource_id, details and ip_address. Times are UTC in ISO 8601, such as 2026-09-28T12:00:00Z. A text that a spreadsheet would run as a formula starts with an apostrophe. It counts towards the 12 exports an hour that every staff export shares.

Billing, admin and owner members can read how the organization is doing over a period, in whole days of the brand's time zone, and set it against another period:

Shell
curl "https://api.coritan.com/api/v1/orgs/acme/staff/insights?from=2026-09-01&to=2026-09-30&compare=previous" \
  -H "Authorization: Bearer $STAFF_TOKEN"
Parameter What it sets
days The last this many days, ending today. 7–365, and 30 by default. Ignored when from or to is given.
from and to The first and last day, YYYY-MM-DD, both included. to is today when left out, and from is days days back from it. A period is at most 366 days.
compare What to set the period against: previous (the same number of days just before it, and the prior month for a calendar month), week, month or year (the same days that much earlier), custom or none. none when left out.
compare_from and compare_to The days of the comparison for custom. Naming both without compare is the same as custom.

A word that is not one of those, a period over 366 days, a period that ends before it starts, or custom without both days answers 422 and says what to change. The brand's time zone is the timezone of its settings, so a day starts and ends at its local midnight, and a day with a clock change is 23 or 25 hours long.

The answer has these keys:

  • period: from, to, days and bucket, the grain a chart groups by. bucket is hour up to 2 days, day up to 92, week up to 220 and month beyond.
  • compare: the from and to of the other period, or null without a comparison.
  • totals and previous_totals: payments, refunds (money handed back, as a positive amount), net, orders_placed, orders_failed, new_customers, tickets_opened, median_first_reply_seconds, mrr, active_services, currency and by_currency. previous_totals is null without a comparison. mrr is what is recurring now, so it is null for a period that ended before today and in previous_totals.
  • series lists the days, and each daily list below follows it, whatever the bucket.
  • revenue: payments and refunds per day with their totals, net, mrr (the prices of active services as a monthly figure), active_services, the unpaid and overdue invoices in outstanding_count and outstanding_total, and in by_product the 12 products that brought in the most on paid invoices. Refunds are negative amounts here, and net is the payments plus them.
  • orders: orders placed, failed and ended per day.
  • customers: new customer accounts per day. Placeholders for moved forum authors are not counted.
  • support: conversations opened per day, how many closed, first_response_median_seconds, resolution_median_seconds, sla_compliance_percent and a count by_department.

Money is never added across currencies. totals.currency is the currency with the most payments in the period, every money figure is in it, and totals.by_currency lists each currency with its payments, refunds and net.

GET /staff/insights/export.csv takes days, from and to and downloads one row a day, with the columns day, payments, refunds, payment_count, refund_count, orders_placed, orders_failed, services_ended, new_customers and tickets_opened. It counts towards the limit of 12 exports an hour.

GET /staff/insights/report/registry lists what a report can count and split by. Each metric has its key, label, format (money, count or duration in seconds), description and the dimensions it takes, and history is false for a figure that is the state now. Each dimension has its key, label, kind (time or category) and bucket. The metrics are net_revenue, payments, refunds, new_customers, orders_placed, orders_failed, active_services, tickets_opened and median_first_reply. The dimensions are day, week, month, product, plan, location, gateway, coupon, department and customer_type.

Shell
curl "https://api.coritan.com/api/v1/orgs/acme/staff/insights/report?metric=net_revenue&dimension=plan&from=2026-09-01&to=2026-09-30&compare=previous&limit=10" \
  -H "Authorization: Bearer $STAFF_TOKEN"

The route needs billing or higher and takes metric, dimension, the period words of GET /staff/insights (the last 30 days when left out) and limit, 1–50 and 10 by default, for a split by category. A split by time answers every bucket and ignores limit. A metric that does not suit the dimension answers 422 and names the dimensions it takes.

JSON
{
  "metric": {"key": "net_revenue", "label": "Net revenue", "format": "money"},
  "dimension": {"key": "plan", "label": "Plan", "bucket": null},
  "rows": [
    {"key": "Paper", "label": "Paper", "value": "1840.00", "previous": "1522.00",
     "filter": {"path": "/staff/orders", "query": {"plan": "Paper"}}}
  ],
  "total": "2610.00",
  "previous_total": "2195.00",
  "currency": "USD"
}

The answer also has period, compare, series (the figure over the period by its bucket, each point with key, x, label, value, previous and filter) and currencies. filter is the console list behind a row or a point, as a path and a query, so a page can link every number to what it counts. When there is more than one currency, currency is the one with the most money, every figure is in it, and a row's by_currency carries the rest. truncated is true when a median read only the newest 20,000 tickets. active_services has no previous and no series.

A saved view keeps the filters of one list under a name. The entity is customers, servers, orders, invoices, inbox, refunds, coupons, activity or report, and query holds exactly what the console keeps in the address for that list, without paging, as at most 40 text or number values.

Shell
curl -X POST https://api.coritan.com/api/v1/orgs/acme/staff/views \
  -H "Authorization: Bearer $STAFF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"entity": "customers", "name": "Past due this month", "query": {"segment": "past_due"}, "shared": false, "pinned": true}'
Route What it does
GET /staff/views Lists the views you can use, your own first and then every view the team shared, each group by name. entity narrows it to one list. Any member can read them.
POST /staff/views Saves a view and answers 201 with it. Any member can save one for themselves, Read-only included.
PATCH /staff/views/{view_id} Changes name, query, shared, pinned, schedule or recipients of a view you saved.
DELETE /staff/views/{view_id} Deletes a view you saved.

A view is id, entity, name, query, shared, pinned, mine, owner_name, schedule, recipients, created_at and updated_at.

  • name takes 1–80 characters and is used once for each list and member. A repeat answers 409.
  • shared needs Tier 3 support or higher, or the route answers 403.
  • schedule (daily or weekly) and recipients (up to 20 addresses) are for report views only, and setting either needs billing or higher. A schedule needs at least one recipient. The recipients of a report you did not save show to billing or higher only.
  • A member keeps 50 views for each list. The 51st answers 409.
  • Only the person who saved a view can change or delete it. Another member's view answers 404: with Only the person who saved a view can change it. when it is shared, and with View not found. when it is private.

API operations on this page

MethodPathWhat it does
GET/api/v1/orgs/{org_slug}/staff/ops-summaryThe numbers on the console's badges and the desk, for one audience view
GET/api/v1/orgs/{org_slug}/staff/insightsMoney, orders, customers and support over a period, by day, and set against another period
GET/api/v1/orgs/{org_slug}/staff/insights/acquisitionAcquisition report
GET/api/v1/orgs/{org_slug}/staff/insights/export.csvStaff insights export
GET/api/v1/orgs/{org_slug}/staff/insights/reportOne figure split by one dimension over a period, against another period
GET/api/v1/orgs/{org_slug}/staff/insights/report/registryWhat the report builder can count and split by
GET/api/v1/orgs/{org_slug}/staff/searchSearch accounts, invoices, orders, servers, tickets and coupons from one box
GET/api/v1/orgs/{org_slug}/staff/activityThe org's audit log, newest first
GET/api/v1/orgs/{org_slug}/staff/activity/actionsStaff activity actions
GET/api/v1/orgs/{org_slug}/staff/activity/export.csvThe filtered audit log as a CSV, newest first
GET/api/v1/orgs/{org_slug}/staff/activity/facetsCounts of the log's entries by area, for the chips above the list
GET/api/v1/orgs/{org_slug}/staff/viewsList the saved views you can use: your own, then every view the team shared
POST/api/v1/orgs/{org_slug}/staff/viewsSave the filters of a list under a name
PATCH/api/v1/orgs/{org_slug}/staff/views/{view_id}Change a view you saved: its name, filters, sharing, pin, schedule or recipients
DELETE/api/v1/orgs/{org_slug}/staff/views/{view_id}Delete a view you saved