Handle billing in the staff console
Work with invoices, refunds, payments, disputes, orders, coupons, reports and the activity log from the staff console.
The billing pages of the staff console hold the money side of your storefront. /staff/invoices lists what your customers owe and have paid, /staff/payments shows every payment with the charges that failed and the chargebacks, /staff/refunds holds the refunds customers ask for, /staff/orders lists every order as a list or a board, and /staff/coupons the codes your checkout accepts. /staff/insights and /staff/insights/reports read the figures, and /staff/activity records who did what. From an invoice or an order, your team takes payment, gives refunds, and changes or ends the customer's service.
Before you begin
Section titled Before you beginAny member can read orders; invoices start at Tier 3 support. Below Tier 3, a customer's Billing tab and an order's page still list their invoices, but the invoices do not open. On these pages each role can do everything the roles below it can, and the other tasks need:
| Task | Lowest role | Step-up |
|---|---|---|
| Read and download invoices, and read refund requests, coupons and service notes | Tier 3 support | No |
| Suspend a service or lift its suspension, cancel it, retry a stuck order, add a service note | Tier 3 support | No |
| Raise, edit or resend an invoice | Billing | No |
| Cancel an unpaid invoice | Billing | Yes |
| Charge a saved payment method, mark an invoice paid, refund an invoice | Billing | Yes |
| Approve or decline a refund request | Billing | Yes |
| Read payments, failed charges and disputes, and export payments or invoices | Billing | No |
| Read analytics, build reports, save them, share them and mail them | Billing | No |
| Change a service's plan or its next due date | Billing | No |
| Turn coupons on or off, and create or change a coupon | Billing | No |
| Read the whole activity log, and export it | Admin | No |
| Terminate a service | Admin | Yes |
A step-up is a fresh password or authenticator code, which lasts 10 minutes; Sign in to the staff console explains it.
A control your role cannot use stays on the page, dimmed, and names the role it needs, such as Needs billing or higher. A page your role cannot read, such as Payments below Billing, shows its title and one line that says who can open it. What a role cannot use explains it. The console's saved views, quick view and period picker work on every list here.
Find an invoice
Section titled Find an invoice- Open
/staff/invoices. - Search by invoice number or ID, or by the customer's email, name, username or company.
- Narrow the list to one status, or to the invoices that are due:
unpaidandoverduetogether. The Status choice lists Any status, Due, Unpaid, Overdue, Paid, Refunded and Canceled. You can also keep only the invoices of paying customers, or only those of free ones, with the audience switch. The tiles above the list count every invoice of your brand. They are normally no more than 30 seconds old, and up to 5 minutes old on the first screen after a quiet spell. The list is always current.
Invoices for paid services come first, then the newest. An invoice's page shows its lines with the service each one pays for, the customer and their credit balance, up to 20 payments and refunds, and any plan change the invoice pays for. While the invoice is open, the page also shows the automatic charge schedule behind it and whether the customer has a saved payment method. Manage customer invoices says what each status means.
Raise an invoice by hand
Section titled Raise an invoice by handRaise an invoice for a setup fee, an add-on or a correction, or several of them on one invoice:
- On
/staff/invoices, choose New invoice and choose the customer. The same button is on a customer's Billing tab. - To list it with an order's invoices, choose the order.
- Add a line for each thing you charge, up to 50: a description of up to 500 characters, a quantity and the price of one. Each line comes to its quantity times its price, rounded to the currency's smallest unit, such as the cent. Add any tax as an amount for the whole invoice. The invoice is in the customer's currency.
- Choose how many days the customer has to pay, 0–365 (7 unless you change it), and add notes of up to 2,000 characters if you need them.
The invoice starts unpaid, and we email it to the customer unless you turn that off. An invoice for nothing is never emailed.
Take payment for an invoice
Section titled Take payment for an invoiceWhile an invoice is open, we charge the customer's saved payment method on a schedule until it is paid, and the invoice's page shows the next attempt and the last error. To act sooner, open the invoice and use its menu or the Mark paid button:
- Charge saved method: we charge the saved payment method at once, as the next automatic attempt would. Nothing is charged when the customer turned automatic payment off or a payment is still settling. When the bank wants the customer to confirm the payment, ask them to pay the invoice from their account.
- Send invoice: we email the invoice again, or the overdue notice once it is past its due date. Nothing about the invoice changes.
- Mark paid, when the customer paid you another way, such as by bank transfer. The invoice becomes
paidfor its full amount, and its services renew as they would after any payment. Coritan did not receive this money, so it is not part of a payout. - Download PDF saves the document the customer sees.
Each member may charge each invoice 30 times an hour, and mark 60 invoices paid an hour. An invoice that was cancelled or refunded cannot be marked paid: raise a new invoice if the customer owes the money again.
Change or cancel an invoice
Section titled Change or cancel an invoice- Choose Edit in the Details panel to change the notes, or move the due date of an open invoice. An
overdueinvoice whose due date moves into the future isunpaidagain. - Choose Cancel invoice in the menu to cancel an invoice nobody should pay. Nothing is owed on it afterwards, and an upgrade it was paying for is called off. Wallet credit the customer put towards it goes back to their wallet, and the console says how much. A paid invoice is refunded instead. An invoice partly paid through a payment gateway cannot be cancelled, since a cancelled invoice cannot keep that money: let the customer pay the rest, or mark it paid, then refund what they paid.
Refund an invoice
Section titled Refund an invoiceRefund a paid invoice when your team decides to: a goodwill gesture, a duplicate charge or a mistake. The refund dialog works on the invoice, with the amount, where the money goes and why.
- Open the paid invoice and choose Refund in its menu. The menu shows the most that can still go back. The dialog's title names the invoice, and its subtitle says how much can still be refunded.
- Under How much, choose Everything left, or An amount and enter it. The amount cannot be more than what is left and takes at most two decimal places. A line under it reads the refund back, such as
12.50 USD. - Under where the money goes, choose Back to the payment method, which the card or account that paid gets back and which shows in 5 to 10 business days, or To the wallet, which lands on the customer's wallet at once, for their next invoice. The first choice is dimmed when nothing was paid through a gateway.
- Write a reason of 5–500 characters, or pick Duplicate charge, Goodwill, Service not delivered or Customer request to fill one in. The reason stays on the refund and in the activity log.
- Choose the Refund button, which names the amount, then confirm it is you if the console asks. For a refund to the payment method the dialog also asks you to type the invoice number, because the gateway cannot take it back once it is sent.
The dialog says what the refund does to the service. A refund of the whole invoice ends every service it paid for at once. A partial refund leaves the service running.
Your team can refund a service that ended for breaking your terms, which a customer cannot ask for. No refund covers a cryptocurrency payment, an invoice that is not paid, or one already refunded. A payment made from the customer's wallet, or an invoice your team marked paid, can only go back as credit.
We email the customer a confirmation when the refund goes through. Each member may make 30 refunds an hour.
Decide a refund request
Section titled Decide a refund requestCustomers ask for refunds from their account, and each request waits on /staff/refunds, oldest first. Tier 3 support can read them; a billing member, an admin or the owner decides. Below Billing the Approve button stays on the page, dimmed, and a line says that owners, admins and billing staff decide refunds.
The page opens on five figures: To decide, Oldest wait, Failed, Approved and Declined. Each links to what it counts, and To decide, Oldest wait and Failed rest quietly at zero. The strip above the table switches between To decide, Approved, Declined, Failed, Withdrawn and All, each with its count. Search by invoice number, by the customer's email, name or company, or by the service's hostname. The Views menu holds To decide, Failed at the gateway and Declined. The list shows 25 requests a page.
- Open
/staff/refundsand choose a request. A drawer opens, and the request stays in the address, so you can send it to a colleague. - Read the request: the customer's reason, which is one of Not delivered / not working, Duplicate or accidental charge, Extended downtime, Not as described or Other, with anything they wrote. The facts name the invoice and the service, when the customer asked, and which payment window applies: New subscription · 24h, or Renewal · 48h, with the hours since payment and whether that is inside or outside. They also say how the invoice was paid, and whether the money can go back to the payment method.
- Read the warnings, which appear when they apply: the request is outside the refund window, the invoice was paid from the wallet or marked paid by staff so only wallet credit is possible, or the wallet has taken cryptocurrency deposits so credit stays in the wallet.
- Read About the customer, which holds their lifetime payments, what they were refunded, open disputes, how many requests they made earlier with the last few listed, and accounts that look related.
- Choose Refund to the payment method or Credit the wallet. The first is dimmed when the payment cannot go back to the gateway. Add a Note to the customer if you like. When you approve it is optional. To decline, write the reason in it, or in the dialog that follows.
- Choose the button at the bottom, which names the amount: Refund or Credit, or choose Decline. Confirm it is you if the console asks. A confirmation names the amount and the invoice and says where the money goes. A decline asks for a reason of 5–1,000 characters when the note holds fewer than 5.
An approval tells you how much went back and where, what the invoice's status is now, and whether the refund ended the service. We email the customer your decision, with your reason when you decline it. When the payment gateway declines an approved refund, the request becomes failed with the gateway's words, and nothing is refunded. A decided request opens in the same drawer, read only, with who decided, when, and the note.
Follow payments, failed charges and disputes
Section titled Follow payments, failed charges and disputes/staff/payments is for billing members, admins and the owner, and has three tabs: Transactions, Dunning and Disputes. Each tab has its own figures and filters in the address, and Refresh in the header reloads the open tab.
- Transactions lists every payment, refund, chargeback and change to a wallet, newest first. The figures above it cover the last 30 days, in each currency the money moved in: Payments, Refunds, Wallet credits and Wallet deductions, plus Chargebacks when there were any. A kind of payment made in two currencies shows two totals joined by
+, never one converted sum. Search by the gateway's reference, the note, or a payment or invoice ID. Filter by Type (Payments, Refunds, Wallet credits, Wallet deductions or Chargebacks) and by Payment method (Stripe, PayPal, Bank transfer, Wallet or Manual). A link from a customer's page can also filter by that customer. Export CSV saves the transactions the list shows, up to 20,000 rows. - Dunning lists the open invoices our automatic charges are working on, the next attempt first. Its figures are Retrying, Given up, Paused and Owed, and the strip switches between All, Retrying, Given up and Paused. Each row shows the invoice with its due day and the last error, the customer, the state, the attempts made out of the most the job makes, what the invoice still owes in its own currency, and the next attempt. A schedule that ran out of attempts or time shows as given up: charge the invoice yourself when the customer has fixed their card, or ask them to pay.
- Disputes lists the chargebacks customers opened with their bank. Its figures are Needs response, Under review, Won and Lost, and the strip filters by them. Each row shows the reason, the gateway, its reference and the invoice, the customer, the status, the amount, and when evidence is due. That badge turns red under 48 hours and reads Overdue once the date has passed. A row opens a read only drawer with the amount, reason, evidence state, deadline, the invoice and the customer, and a button that opens the invoice. Follow payment disputes explains how a dispute is answered.
A row on Transactions or Dunning opens a quick view of its invoice. A billing member can also download the invoices as CSV, up to 20,000 rows each. Exports count towards a limit of 12 an hour for each member.
Look after an order
Section titled Look after an order/staff/orders lists an order for each service a customer bought. The switch in the header chooses List or Board, and the choice is in the address.
The six figures above both views are All orders, Pending, Provisioning, Failed, Active and Suspended. Each is a filter on the list, and the ones that need a person rest quietly at zero. The figures count every order of your brand. They are normally no more than 30 seconds old, and up to 5 minutes old on the first screen after a quiet spell. The list below them is always current.
The list
Section titled The listSearch by hostname, customer, product or order ID. The Status choice holds Any status, Stuck, Pending, Provisioning, Failed, Active, Suspended, Canceled and Terminated, and the Plan choice holds the plans the list has shown. The Views menu holds Stuck in setup, Install failed, Waiting for payment, Suspended and Board. The Columns menu adds Term, Built, Server and Channel, the channel of the last visit before the order. A row opens a quick view of the order, and Enter, o, j, k and x work as on every list. A row's menu holds Open order, Open customer and, from Tier 2 support, Open server. The Status column adds waiting in red for an order that has waited, and the Placed column leaves the table on a narrow page.
The list also takes the filters a report's links send, each as a word in the address: channel, first_channel, source, medium, campaign, device, heard_about and coupon_campaign, such as /staff/orders?channel=paid_search. Each shows as a chip you can remove, and an order with no attribution record matches none of them. A channel or first_channel outside the ten channels in Channels answers an error that names the allowed words.
An order's page shows the customer with their credit balance, up to 20 invoices, and the server behind the order once it has one. It also has the two cards described under Where an order came from.
An order is stuck when it is pending, provisioning or failed while it is paid for, or was never invoiced; the stuck filter lists these. An order waiting for its invoice to be paid is not stuck: we build it when the invoice is paid.
To build a stuck order, retry it from its page with Provision now or Retry provisioning. It must not have a server yet or a build already queued. Each member may retry an order 8 times in 10 minutes.
The board
Section titled The boardBoard shows the same orders in the six stages a person works through them. A stage's title opens the list filtered to exactly its orders, and its count is the number of orders the list then shows.
| Column | What it holds |
|---|---|
| Waiting for payment | Orders that are pending or provisioning with an invoice nobody has paid. Nothing is built until it is. |
| Provisioning | Orders that are pending or provisioning and paid for, or never invoiced, and not built yet. |
| Install failed | Orders with the status failed. |
| Active, last 7 days | Orders that went live in the last 7 days. |
| Suspended | Orders that are suspended, whenever they were. |
| Canceled, last 7 days | Orders cancelled or terminated in the last 7 days. |
The counts of the columns are normally no more than 15 seconds old, and up to 150 seconds old on the first screen after a quiet spell. The cards are always current. A column shows its 30 newest orders and a link, such as 12 more in the list, to the rest. A card shows the hostname, the order number and plan, the customer, the price and when it was placed, and a line when the server's own state differs from the order's. A card in Provisioning that has waited more than 30 minutes carries a red Late pill. Select a card for the quick view, or its title for the order's page. Install failed has a button, Retry this order or Retry all, followed by the count, that queues provisioning again for the orders shown. It asks first, runs them one after another, does not charge anyone again, and refuses an order that is waiting on an unpaid invoice. Below Tier 3 support the button is dimmed.
Where an order came from
Section titled Where an order came fromUnder the Customer card, an order's page has an Attribution card. It reads the record we wrote when the order was placed (What an order records). Every member who opens the page reads it.
| Fact | What it says |
|---|---|
| First touch and Last touch | The channel of each visit as a pill, its source and medium, and under them the campaign, the page the visitor landed on and the day. When the two are the same, one line says "First and last touch". |
| Click IDs | The ad network each click ID names, such as Google Ads, with the ID cut short and a button that copies the whole of it. "None" when the visit carried none. |
| Heard about | The buyer's answer to "How did you first hear about us?" and the words they wrote when they chose Other. "No answer" until they give one. |
| Coupon | The code the order used and the campaign the code had then. |
| Affiliate code | The affiliate or referral code the browser held, when it held one. |
| Device | The kind of device and the country. |
| Consent | Whether the visitor allowed analytics and marketing, whether that was their choice or their region's default, and a line when Global Privacy Control was on. |
| Buyer | New customer, when they had no earlier paid invoice, or Returning customer, with "free order" added for an order with a total of zero. |
| Address | None kept, kept in full for 30 days, or cut to its network, such as 203.0.113.0. The card never shows the address itself. |
| Recorded | The day we wrote the record. |
Orders from this channel, at the foot of the card, opens the order list for the channel of the last touch. An order your team placed, a renewal, and an order from before we recorded attribution have no record, and the card says "No source recorded".
Admins and the owner also see a Conversions card under Invoices. It lists what each ad platform was sent for the invoice that started the order, or for the newest invoice when the order has no record: the platform, the event (Purchase, Renewal, Upgrade, Free server, Refund or Chargeback), its status (Sent, Skipped or Failed) and when. Under the platform's name, a Skipped or Failed row says why, such as that the buyer did not allow marketing cookies. When nothing was sent, the card says "Nothing was sent for this order" and has a button to the Marketing settings, where each platform is turned on. Every other role sees no Conversions card.
Change a customer's service
Section titled Change a customer's serviceOpen the order to act on the service behind it. Suspending, lifting a suspension and terminating a server are also in the server's quick view, from a customer's Servers tab, the server list or the Activity page (Servers). Each member can suspend 120 services an hour, lift 120 suspensions an hour and terminate 30 services an hour.
- Suspend it, with a reason of up to 300 characters. The customer sees it on the service and in the email we send, so say what they need to fix. Lifting the suspension brings the service back, emails the customer, and calls off a deletion your team scheduled with the suspension.
- Cancel it for the customer, now or at the end of the term, as their own cancel button would. The preview shows the credit for unused time the customer gets, if any, and we take a snapshot of a server first unless you say not to. When your storefront sells a free plan, cancelling a server moves it onto that plan instead of ending it.
- As an admin, terminate it for abuse, for fraud, or after a refund. The service ends now with no credit for unused time, we keep a snapshot, and your reason of 3–500 characters stays on the record. We email the customer only when you choose to.
- Move it to another plan with the same billing cycle. An upgrade raises an invoice for the difference over the rest of the term, and the plan changes when the customer pays it. A downgrade may credit their wallet with the difference. You can call off an upgrade that is waiting for payment.
- Move its next due date, with a reason of 3–500 characters: later as a goodwill gesture, or sooner to correct a mistake. The date cannot be in the past, and a service that has ended keeps its date.
- Add a note of up to 8,000 characters for your team. The order shows the newest 100.
Offer coupon codes
Section titled Offer coupon codesCoupons are off until a billing member turns them on at /staff/coupons. While they are off, the checkout shows no code field and refuses every code. A callout says so, with a button to turn them on, and Turn coupons off stops them again without deleting a code.
The page opens on six figures: All codes, Live, Paused, Expired, Revenue · 90 days and Discounted · 90 days. A code that is live but not started yet shows as Scheduled. The Status choice lists Any status, Live, Paused and Expired, search takes a code or a description, and the Views menu holds Live codes, Paused and Expired.
- Choose New coupon. The palette's New coupon command opens the same editor through
/staff/coupons?new=1. Billing members only. - Choose Percent off, or Fixed amount off, which is a set sum in one currency. A sentence at the top reads the coupon back as you fill it in.
- Under Code, enter 2–40 letters, digits,
-and_. We store it in capitals, and customers can type it in either case. A Description is for your team and is never shown to customers. - Under Code, you can also give the coupon a Campaign of up to 80 characters, such as
summer-launch. It is optional. Every order that uses the code copies the campaign, so reports can group those orders (Coupon campaigns). Clear the field to remove it. - Under Discount, enter the percentage, up to 100, or the amount, with its three letter currency code.
- Under Applies to products, tick the products it works on, or tick none for every product.
- Under Limits and dates, set Total uses, Valid from and Valid until. Blank means unlimited, now and open-ended, and the last day counts. Under Rules, set Uses per customer: 1 unless you change it, or 0 for no limit.
- Choose Create coupon. When you close the editor with changes that are not saved, it asks first.
A coupon comes off the first invoice of an order, before tax, and the order renews at its plan's price. The editor says so instead of offering a switch. A customer can also use a code when they move a server to a bigger plan: it comes off the upgrade invoice, and the use is counted once that invoice is paid, so an upgrade left unpaid uses nothing up. A fixed amount takes nothing off an order in another currency. A coupon expires once it reaches its number of uses. Once a coupon exists, its code, kind and currency are fixed; Edit coupon in a row's menu changes the rest.
A link to any page of your storefront that ends in ?coupon=CODE (or ?code=CODE) fills the coupon field at checkout and shows the discount. The storefront keeps the code for the visit and for 7 days. It never replaces a code the customer typed, and Remove clears it. A code is 2 to 40 letters, digits, hyphens or underscores.
Each row's menu has See redemptions, Edit coupon, Pause coupon or Resume coupon, and Expire coupon. Pausing is reversible. Expiring is for good and asks first. See redemptions opens a drawer with each use: the customer, the invoice, its status, the amount it took off, the channel of the visit before the order and the campaign the code had then, and when it was used.
The table shows what each code earned over the last 90 days:
| Column | What it counts |
|---|---|
| Used | Uses so far, out of the total when there is a limit. |
| Revenue | What customers paid on the invoices that used the code, with the discount already off. |
| Discount cost | What the code took off. |
| Campaign | The campaign the code belongs to. It is off until you pick it in the Columns menu. |
| Orders | Orders that used the code. It is off until you pick it in the Columns menu. |
| New customers | Customers who signed up in the last 90 days and used the code. It is off until you pick it in the Columns menu. |
Money is in the currency most used. The two figures at the top total them over every code.
Read the analytics
Section titled Read the analytics/staff/insights reads money, orders, customers, support and visitors over a period, against another period, for Billing and up. The staff console describes the page and its figures, and Choose a period the picker. Every figure, chart point and bar opens the list it counts. Export CSV saves the daily figures of the period, and Build a report opens the builder below for the same period.
Read the acquisition report
Section titled Read the acquisition reportThe Acquisition section, under Storefront visitors, says where visits, sign-ups and orders came from over the same period (How customers and orders are attributed). It follows the period picker. It compares with the days just before the period, or with nothing when the picker says No comparison. Orders count by the last touch, revenue is without tax, and the figures are in one currency at a time. When the period has orders in more than one currency, a switch under the heading picks which; money is never added across currencies.
Six figures lead: Visits, Sign-ups, Orders, New customers, Revenue and Conversion rate, which is paid orders over visits. Each shows its change against the comparison. Orders are paid and not free, and a new customer is one whose first paid order it is. Under them:
| Panel | What it holds |
|---|---|
| Channels | Each channel by the last touch, with its share of the orders, visits, sign-ups, orders, new customers and revenue. |
| First touch | Orders by the channel that first brought the buyer. |
| First touch to last touch | How buyers moved from one channel to another, with orders and revenue for each pair. |
| Sources | Each source and medium, such as google / cpc, with its channel, visits, orders, new customers and revenue. |
| Campaigns | Each campaign name, with its source and medium, visits, orders and revenue. |
| Landing pages | The first page of a visit, without its query or language prefix, with visits, sign-ups, orders and revenue. |
| Devices | Orders by desktop, mobile and tablet, with visits and revenue. |
| Click ID coverage | The share of orders that carry an ad network's click ID, and how many came from each network. |
| How customers heard about us | The answers buyers gave after ordering, with each one's share of the orders. |
| Return on ad spend | Each ad platform's spend, orders, new customers, cost per new customer and return, which is revenue divided by spend. |
Each list shows its top 10 rows, and the figures above them count every row. A row that counts orders opens the order list for those orders in the same period, so you can check the number. Landing pages and Return on ad spend have no list to open. A row with no spend shows — for the cost per new customer and the return. Return on ad spend appears once you have connected an ad platform or added spend by hand; until then a line points at the Marketing settings.
Visits come from the visit tracker, which keeps a visit for 180 days. When the period starts before that, a note says "Visits are partial before 180 days ago". Every list says what happens next when it is empty, such as "Orders appear here once a visitor buys".
Build and mail reports
Section titled Build and mail reports/staff/insights/reports, the Reports page, shows one figure split the way you choose, for Billing and up. It reads as a sentence: Show a figure by a split as a chart, and, for a split into groups, top 5, 10, 20 or 50. Build a report lists which splits each figure takes.
| Part | Choices |
|---|---|
| Figure | Net revenue, Payments, Refunds, New customers, Orders placed, Orders failed, Active services, Tickets opened, Median first reply, Visits and Conversion rate. |
| Split by | Day, Week, Month, Product type, Plan, Location, Payment method, Coupon, Department, Customer type, Channel, First channel, Source, Medium, Campaign, Landing page, Device, Heard about us and Coupon campaign. Each figure offers only the splits that make sense for it. |
| Chart | Line or Bars for a split by time. Ranked bars or Bars for a split into groups. Table only for either. |
Pick the period and what to compare it with in the period bar. The attribution splits (Channel to Coupon campaign) read each order's attribution record, and an order with none falls in the group Unknown. Visits and Conversion rate split by time, Channel, Source, Medium, Campaign, Landing page or Device. Conversion rate is a percentage, shown as 3.42%, and Export CSV writes it as a percent too. A report never covers more than 366 days. Under the chart, the table lists each row with its value and, when you compare, the previous value and the change. Every row and every chart point opens the list it counts, such as the orders of one plan. Export CSV saves the table on screen. A report with money in more than one currency says so, reads one currency in the chart and table, and lists each currency in its total.
The whole report is in the address, so you can send it to a colleague. Saved reports, beside it, keep it under a name:
- Choose Save as new, and name the report.
- Tick Share with the team so everyone can open it. Only you change it.
- Under Mail it, choose Off, Daily at 07:00 or Weekly on Monday at 07:00, in your brand's time zone.
- Under Send it to, list up to 20 addresses. Choosing a schedule fills in your own address first. Only billing members, admins and the owner can receive a report.
- Choose Save report.
A mailed report holds the top 12 rows and the CSV, and covers the same number of days again each time, ending the day before. A shared report's addresses show only to its owner and to billing members. Load puts a saved report on the builder, and the menu beside it has Update, to replace it with what is on screen, and Delete. You keep up to 50 views for each list, and a name is unique among yours.
Read the activity log
Section titled Read the activity log/staff/activity records who did what: every staff action made through the console and every change a customer makes to their own account. Tier 1 support and up open it. An admin reads all of it. Everyone else reads their own actions, on a page titled My activity, and reads the rest through the Activity tab of a customer, an order or a server. The staff console describes the page from the console's side.
- Search by an action word or a record number, and pick a period with the period picker. Activity has no comparison.
- Choose an area under the toolbar: Everything, or one of the areas with its count, biggest first. An area is the first word of an action, such as
Customerforcustomer.suspended. The counts keep the other filters, so the other areas stay visible. - Narrow further by Record (Customers, Orders, Invoices, Servers, Team or Refunds) and Action. An admin can also choose Everyone or Mine, and pick a person under Who.
- Choose an entry to open it: who, when, the record, what changed and where it came from.
The Views menu holds Money moves and Support sessions. Export CSV saves the log as filtered, up to 50,000 entries newest first, with times in UTC. It needs an admin, and is dimmed with Needs admin or higher for everyone else. The audit log page describes the same record for the whole organization.
Result
Section titled ResultEach change shows on the invoice, order or coupon at once. The customer gets the emails described above, and the audit log records who did what.
Troubleshooting
Section titled TroubleshootingInvoice is paid; only an unpaid or overdue invoice can be charged- Only an open invoice can be charged or resent. A paid invoice needs nothing more.
No saved payment method to charge; the customer pays by hand or adds one.- The customer has no saved payment method. Ask them to pay the invoice from their account.
Customer authentication required. Ask the customer to complete the payment.- The bank wants the customer to confirm this payment. Ask them to pay the invoice from their account.
A paid invoice is refunded, not cancelled- Refund the invoice instead.
Invoice is already cancelled- Someone on your team cancelled it first, or it was refunded (
Invoice is already refunded). Nothing is owed on it. 5.00 USD of invoice INV-1042 was paid through a payment gateway, and a cancelled invoice cannot keep it. Let the customer pay the rest, or mark it paid, then refund what they paid.- Part of the invoice was paid by card or another gateway, and only a paid invoice can be refunded. Let the customer pay the rest, or mark it paid, then refund it.
Invoice INV-1042 was cancelled, so it cannot be marked paid. Raise a new invoice if the customer still owes the money.- A cancelled or refunded invoice stays closed. Raise a new invoice for what the customer owes.
This invoice carries a pending plan change in its notes; they cannot be edited until it is paid or cancelled.- The invoice pays for an upgrade, and its notes hold that change. Wait until the customer pays it, or cancel the invoice to call off the upgrade.
Only an open invoice can have its due date moved- Only a
draft,unpaidoroverdueinvoice has a due date to move. Only 20.0000 has been paid on this invoice- You tried to refund more than the customer paid. Refund at most the amount it names.
A refund request is already pending on this invoice; decide that one first- The customer has asked for a refund of this invoice. Decide their request on
/staff/refunds. This payment cannot be sent back to its payment method; approve it as wallet credit instead- The customer paid from their wallet, your team marked the invoice paid, or the gateway cannot refund. Refund it as wallet credit.
Cryptocurrency payments are not refundable in any form; see the Refund Policy.- We never refund a cryptocurrency payment, as money or as credit.
Give the customer a reason; it goes in the email- A decline needs a reason of at least 5 characters.
This request has already been decided- Someone on your team approved or declined the request first, or the customer withdrew it.
Plan changes must keep the current billing cycle- Choose a plan with the same billing cycle. The plan options list only those.
The due date cannot be in the past- Choose today or a later day.
Service already cancelled- The service is terminated, or waiting to be.
This order already has a server; open it instead- The order has been built. Open its server from the order's page.
That code already exists- Codes are unique within your organization, whatever their case. Choose another.
Only the person who saved a view can change it.- A saved report belongs to the member who saved it. Save your own copy with Save as new.
A scheduled report needs at least one recipient- Name at least one address under Send it to, or set Mail it to Off.
Related
Section titled Related- Manage customer invoices from the dashboard's Billing tab
- Follow payment disputes
- Build the customer account area, where customers pay and ask for refunds
- Look after customers in the staff console
With the API
Section titled With the APIThese routes live under https://api.coritan.com/api/v1/orgs/{org_slug}/staff/, and take a console session or a member's access token as The staff console explains. The reference lists them in these groups:
| Area | Reference |
|---|---|
| Invoices | Invoices in the staff console |
| Payments, failed charges and disputes | Staff billing |
| Orders and refund requests | Staff operations |
| The orders board | Staff orders |
| Services | Services in the staff console |
| Coupons | Staff coupons |
| Reports and activity | Staff insight |
| Saved views and scheduled reports | Staff views |
A missing invoice answers 404 Invoice not found, and a missing order or service 404 Order not found.
List invoices
Section titled List invoicescurl "https://api.coritan.com/api/v1/orgs/acme/staff/invoices?status_filter=due&audience=paid&limit=50" \
-H "Authorization: Bearer $STAFF_TOKEN"
q takes up to 200 characters, customer_id one customer, limit 1–200 (50 by default) and offset. status_filter is a status, or due for unpaid and overdue together. audience is paid, free or all: an invoice is paid when a line bills a service outside your free tier, and an invoice with no service follows its customer. The answer is a list of invoices, each with invoice_number, status, subtotal, tax, total, amount_paid, amount_remaining, currency, due_date, paid_at, customer and is_free.
GET /staff/invoices/stats answers all, due and one count per status, under the same audience. It is normally no more than 30 seconds old, and up to 5 minutes old on the first request after a quiet spell. GET /staff/invoices/{invoice_id} answers the invoice, its items, up to 20 transactions, the customer, any plan_change, the charge_schedule and payment_method_available. GET /staff/invoices/{invoice_id}/pdf downloads the PDF the customer sees.
Raise an invoice
Section titled Raise an invoicecurl -X POST https://api.coritan.com/api/v1/orgs/acme/staff/invoices \
-H "Authorization: Bearer $STAFF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"customer_id": 812, "lines": [{"description": "Setup of a custom modpack", "unit_price": "25.00"}, {"description": "Extra backup slot", "quantity": "2", "unit_price": "1.50"}], "due_days": 14}'
Send customer_id and 1–50 lines, each with a description of 1–500 characters, a unit_price above zero and a quantity above zero (1 by default, up to 100,000), both to four decimal places. A line's service_id ties it to one of the customer's orders. Each line comes to its quantity times its unit price, rounded half up to the currency's smallest unit; a line that rounds to nothing answers 422. An older client may still send one line as a description, an amount and a service_id instead of lines, but not both. tax is an amount and defaults to 0, currency to the customer's, due_days to 7 (0–365), and send_email to true. notes takes up to 2,000 characters. It answers 201 with the id, invoice_number, status, subtotal, tax, total, currency, due_date and the number of lines.
PATCH /staff/invoices/{invoice_id} takes notes and due_date. POST /staff/invoices/{invoice_id}/cancel takes an optional reason of up to 500 characters, needs a step-up for an unpaid or overdue invoice, and answers the id, the status and credit_returned: the amount and currency of the wallet credit that went back to the customer, or null. When a payment gateway paid part of the invoice it answers 409 and nothing changes.
Take payment
Section titled Take paymentPOST /staff/invoices/{invoice_id}/charge charges the saved payment method and answers the outcome in status: succeeded, pending, requires_action, failed with an error_message, skipped with a reason of auto_pay_disabled or payment_settling, or no_method. POST /staff/invoices/{invoice_id}/send answers whether the email was sent and its template, invoice_created or invoice_overdue.
curl -X POST https://api.coritan.com/api/v1/orgs/acme/staff/invoices/3051/mark-paid \
-H "Authorization: Bearer $STAFF_TOKEN"
{"message": "Invoice marked as paid"}
Refund a paid invoice
Section titled Refund a paid invoicecurl -X POST https://api.coritan.com/api/v1/orgs/acme/staff/invoices/3051/refund \
-H "Authorization: Bearer $STAFF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"amount": "10.00", "reason": "Charged twice for the same month", "to": "gateway_refund"}'
amount is up to what the customer paid and has at most two decimal places, and reason takes 5–500 characters. to is gateway_refund (the default) or wallet_credit. The answer has the request we recorded and the outcome: status is approved with the amount refunded and any service_status, or failed with the gateway's error. A refund the policy refuses answers 400 with the reason.
Decide refund requests
Section titled Decide refund requestscurl "https://api.coritan.com/api/v1/orgs/acme/staff/refund-requests?status=pending" \
-H "Authorization: Bearer $STAFF_TOKEN"
status is pending (the default), approved, rejected, withdrawn, failed or all; the console calls a rejected request Declined. q takes up to 200 characters and searches as the console does, limit takes 1–200 (50 by default) and offset pages on. The answer has the pending count, which is the whole queue still to decide whatever the search, the requests in items, oldest first, and can_decide, which says whether you may decide them. With with_total=true it adds total, the requests the status and search match, with limit, offset and counts: all and each status, for the same search. Each request carries its eligibility, with in_window, flags and blockers. GET /staff/refund-requests/{request_id} answers one request, which is how a link to a request on another page opens.
curl -X POST https://api.coritan.com/api/v1/orgs/acme/staff/refund-requests/77/approve \
-H "Authorization: Bearer $STAFF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"resolution": "wallet_credit", "note": "Credited as the renewal was outside the window"}'
resolution is gateway_refund (the default) or wallet_credit, and note takes up to 2,000 characters. The answer is the request with the outcome: its status, the amount refunded and its currency, the invoice's invoice_status after the refund, and service_ended, which is true when the refund ended the services the invoice paid for. POST /staff/refund-requests/{request_id}/reject takes a note of 5–2,000 characters, which goes in the customer's email. A missing request answers 404 Refund request not found.
Read payments, failed charges and disputes
Section titled Read payments, failed charges and disputescurl "https://api.coritan.com/api/v1/orgs/acme/staff/transactions?type=refund&since=2026-09-01" \
-H "Authorization: Bearer $STAFF_TOKEN"
type is payment, refund, chargeback, credit_add or credit_deduct; any other answers 400 Unknown transaction type. gateway takes a gateway's name, customer_id one customer, q up to 120 characters, since and until dates, limit 1–200 (50 by default) and offset. GET /staff/transactions/stats?days=30 counts and totals each type over 1–365 days. Each type in by_type has its count and by_currency, a count and total for each currency it moved in; total and currency are filled only when it moved in one currency, and total is null when it moved in several. currencies lists every currency that moved.
GET /staff/dunning lists the charge schedules of open invoices, the next attempt first, each with status, attempt_count, max_attempts, next_attempt_at, give_up_at and last_error, and the invoice and customer. status narrows the list to active, exhausted (every retry failed) or paused schedules; gave_up is read as exhausted. GET /staff/dunning/stats answers the counts and what the invoices still owe in owed_by_currency. GET /staff/disputes takes limit and offset, and answers each dispute with its customer and invoice_number.
GET /staff/transactions/export.csv takes type, gateway, customer_id, q, since and until, as the list does. GET /staff/invoices/export.csv takes status, since and until: here the filter is status, where the list takes status_filter.
Work with orders and services
Section titled Work with orders and servicescurl "https://api.coritan.com/api/v1/orgs/acme/staff/orders?status_filter=stuck" \
-H "Authorization: Bearer $STAFF_TOKEN"
status_filter is an order status (pending, provisioning, active, suspended, cancelled, terminated or failed), all, stuck, or a column of the orders board: pending_payment, building (paid for and being built), install_failed, active_recent, suspended or canceled_recent. A board word lists exactly the orders in that column, and any other word lists nothing. plan is a product's exact name, product a kind of product such as container or vps (letter case does not matter), and product_id one product. created_after and created_before are days, YYYY-MM-DD, in your brand's time zone and both count; a created_after later than created_before answers 422. q, customer_id, audience, limit and offset work as they do for invoices. Each order has hostname, status, billing_cycle, amount, next_due_date, server_uuid, waiting_seconds, unpaid, which is true while its invoice waits for payment, and channel, the marketing channel of the visit that placed it as {key, label}, or null when no storefront order started it. GET /staff/orders/stats counts each status and stuck, normally no more than 30 seconds old, and GET /staff/orders/{service_id} answers the order, the customer, up to 20 invoices, the server and attribution: where the buyer came from, or null (What an order records).
GET /staff/orders/board takes audience and answers columns, each with a key, a label, a count for the whole column and up to 30 newest items in the shape the list answers. Its keys are pending_payment, provisioning, install_failed, active_recent, suspended and canceled_recent, and recent_days is 7. Any member may read it. The counts equal what the list and GET /staff/orders/stats show for the same audience, to within the age each is allowed (normally 15 seconds for the board's counts and 30 for the stats, and 150 seconds and 5 minutes on the first request after a quiet spell): provisioning plus install_failed is the list's stuck count. The items are read on every call.
POST /staff/services/{service_id}/retry-provision answers status provisioning and the job_id. The service actions are POST routes on /staff/services/{service_id}:
| Route | Body | What it does |
|---|---|---|
/suspend |
reason up to 300 characters, notify (default true) |
Suspends the service. |
/unsuspend |
None | Lifts the suspension, and answers deletion_cancelled. |
/cancel |
immediate (default false), reason up to 500 characters, keep_snapshot (default true) |
Cancels as the customer would. GET /cancel-preview?immediate=true quotes the credit first. |
/terminate |
reason of 3–500 characters, notify_customer (default false) |
Ends the service now, with no credit. Needs an admin who stepped up in the last 10 minutes, and answers 403 reauth_required otherwise. |
/change-plan |
org_pricing_id |
Moves the service to that plan. GET /plan-options lists the plans it can move to, and GET /plan-preview?org_pricing_id= quotes the change. |
/cancel-plan-change |
None | Calls off an upgrade waiting for payment. |
/notes |
body of 1–8,000 characters |
Adds a note and answers 201. GET /notes lists them, newest first. |
PATCH /staff/services/{service_id}/due-date takes next_due_date and a reason of 3–500 characters, and answers the next_due_date and previous_due_date.
Manage coupons
Section titled Manage couponscurl -X POST https://api.coritan.com/api/v1/orgs/acme/staff/coupons \
-H "Authorization: Bearer $STAFF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"code": "WELCOME10", "kind": "percent", "value": "10", "max_redemptions": 500, "ends_at": "2026-12-31T23:59:00Z"}'
kind is percent (the default) or fixed, which needs a currency. description takes up to 200 characters, applies_to a list of product IDs, max_redemptions 1 or more, per_customer_limit 0–100 (1 by default), and status active (the default) or paused. campaign names the marketing campaign the code belongs to, up to 80 characters; every order that uses the code copies it (Coupon campaigns). first_invoice_only is kept with the coupon, and changes nothing: every coupon comes off the first invoice only. It answers 201 with the coupon.
PATCH /staff/coupons/{coupon_id} changes the description, campaign (an empty one clears it), value, applies_to, max_redemptions, per_customer_limit, dates or status, which may also be expired; clear_applies_to, clear_max_redemptions and clear_ends_at remove a limit. The code, kind and currency stay as they are. POST /staff/coupons/feature with {"enabled": true} turns coupons on.
GET /staff/coupons takes status and answers enabled, your products, and up to 300 coupons, each with its campaign, redemption_count and total_discounted, and a performance block over the last 90 days: orders (redemptions), net_revenue (what customers paid on the invoices that used the code), discount_cost (what it took off), new_customers (redeeming customers who signed up in the window), currency and window_days. Money is in the currency most used, and a coupon used in several currencies answers the rest per currency. GET /staff/coupons/{coupon_id}/redemptions lists up to 500 uses, 100 by default. Each use has the campaign and the channel its order recorded, or null for both when no storefront order recorded one.
Read and build reports
Section titled Read and build reportsGET /staff/insights/report/registry lists the metrics with their format (money, count, duration in seconds, or percent, an integer in basis points where 123 is 1.23 percent) and the dimensions each takes, and the dimensions with their kind (time or category). Billing and up read it.
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"
metric is net_revenue, payments, refunds, new_customers, orders_placed, orders_failed, active_services, tickets_opened, median_first_reply, visits or conversion_rate. dimension is day (the default), week, month, product, plan, location, gateway, coupon, department, customer_type, channel, first_channel, source, medium, campaign, landing, device, heard_about or coupon_campaign. A pair the figure does not take answers 422 and names the splits it does take. from and to are days, at most 366 apart, and the period is the last 30 days when they are left out. compare is previous, week, month, year, custom or none, with compare_from and compare_to for custom. limit takes 1–50 (10 by default) for a split into groups; a split by time answers every bucket.
The answer has metric, dimension, period, compare, rows, total, previous_total and series. A row is key, label, value, previous and filter, which is the list behind the row as path and query, such as /staff/orders with plan=Paper. Money is never added across currencies: currency is the one with the most money, and currencies and each row's by_currency carry the rest. active_services is what is active now, so it has no previous and no series. truncated is true when a median read only the newest 20,000 tickets.
A saved report is a view of the report list. POST /staff/views takes entity set to report, a name of 1–80 characters, the report's query (the builder's address, without paging), shared, pinned, and, for a report, schedule (daily or weekly) and recipients. shared needs Tier 3 support, and schedule and recipients need billing. A scheduled report needs at least one address, up to 20, or answers 422. GET /staff/views?entity=report lists your views and the team's, your own first. PATCH /staff/views/{view_id} and DELETE /staff/views/{view_id} belong to the member who saved the view; another member's view answers 404 with Only the person who saved a view can change it. A member keeps 50 views for each list and one name once. Send schedule: null to stop the mail. Scheduled reports go out at 07:00 in the brand's time zone, every day or on Monday, with the top 12 rows and a CSV.
List activity entries
Section titled List activity entriescurl "https://api.coritan.com/api/v1/orgs/acme/staff/activity?customer_id=812&since=2026-09-01&limit=50" \
-H "Authorization: Bearer $STAFF_TOKEN"
GET /staff/activity is for Tier 1 support and up. An admin reads the whole log. Tier 1 and Tier 2 support read their own actions, and Tier 3 support and billing must name the customer_id, service_id or server_uuid they look at, or ask for their own with actor_id. action matches the start of an action name, resource_type, since, until and q narrow it, limit takes 1–200 (50 by default) and offset pages on.
GET /staff/activity/facets takes the same filters and answers areas, each with a key, a label, a count and the prefix that narrows the list to it, plus total, so the chips above the list and the list agree. GET /staff/activity/export.csv is for admins, takes the same filters and streams up to 50,000 entries, newest first, with time in UTC, action, actor_type, actor_id, actor_name, resource_type, resource_id, details and ip_address.