Balances, what a period came to, and reading a figure that is withheld.
Billing is what each tenant owes and what they have left: a balance, what
the current period has come to, and where the money went. This page is the
operator’s view; an organisation admin sees their own on the same screen,
with the cost and margin columns withheld. What they see, and what they can
read off it, is the tenant’s billing page.
Each tenant has a balance, a credit limit and a reserved amount. Reserved is
credit held against calls in progress — money not yet spent but no longer
available, which is what stops a prepaid tenant starting more calls than their
balance can finish.
Billing → Balances → Add credit puts money on an organisation’s balance.
Pick the organisation from the list, or use a row’s Add credit.
Kind
Use it for
Top-up
Money the organisation paid you, for example a bank transfer
Credit
Money you give: goodwill, a refund of a bad call
Adjustment
A correction. The only kind that may be negative
The amount is exact, in the organisation’s billing currency.
The description is shown on the organisation’s ledger.
A reference can be entered only once, so a transfer recorded twice is
refused rather than credited twice.
A row’s Ledger lists every entry and who made it. Holds for calls in
progress are hidden unless you ask for them.Adding credit needs the operator’s billing permission. Organisations can
read their own ledger but cannot write to it.
Credit limit: how far below zero the balance may go before calls are
refused.
Enforce the limit, for a postpaid organisation: off by default, and
every postpaid organisation you already have is unchanged. Off, calls are
rated and never stopped, as postpaid always was. On, calls are held against
balance + credit limit and cut off exactly as a prepaid one’s, so a postpaid
client cannot run up more than you have agreed.
Warn below: when available credit falls below this, the organisation’s
admins and you are emailed once, and a Low balance alert opens. A
top-up that lifts it above the level closes the alert, so the next fall
warns again. Empty means no warning.
Organisations can top up their own balance by card, paid into your Stripe
account.
Settings → Payments: turn it on, enter your Stripe secret key
(sk_...; a publishable pk_ key is refused) and the webhook signing
secret, and set the smallest and largest top-up.
In Stripe, add a webhook to the address the page shows,
https://<your API host>/api/v1/public/payments/stripe/<operator>, for
the events checkout.session.completed and
checkout.session.async_payment_succeeded.
The keys are stored encrypted and never shown again.Only Stripe’s signed webhook adds money. A payment page that returns
successfully credits nothing on its own. A webhook delivered twice, or both
events for one payment, credits once.A payment is not credited, and is logged as an error for you to refund in
Stripe, if it:
A credit check runs before a call is placed. A tenant out of credit is
refused at origination rather than discovered mid-call, and the refusal carries
a reason.The caller hears the reason too: “Your balance is not enough to make this call”
when credit or a team budget has run out, and “Calls to this destination are not
allowed on your account” when the rate card has no price for the number. Each
organisation can replace either with its own recording; see
refusal announcements.
Minutes and tokens are rated on different cards and appear separately. The
“charged” figure on a call record is telephony only; a call answered by a
virtual agent has its AI cost alongside, not folded in.
A carrier charges in its currency; you bill an organisation in yours. Billing →
Exchange rates is what joins them, so that a call’s margin is a real number
and not dollars subtracted from rupees.Enter one direction — 1 USD = 83.2 INR — and the other is worked out from it.
A rate is added, never edited. When it changes, add a new one. The rate in
force when a call ends is written on that call, beside what the carrier
charged in its own money, so entering this month’s rate cannot move last
month’s margin. Old rates stay listed: they are the record of what past calls
were converted at.
A rate dated in the future waits its turn. In force marks the one a call
ending now would use.
The charge is converted, not the price. Minimums and increments are the
carrier’s arithmetic and are done in the carrier’s currency first.
On a call record: currency is what the sale, the cost and the margin are all
in; cost_currency, cost_amount_original and fx_rate are what the carrier
charged, in what, and the rate that turned it into cost_amount.
With no rate for a pair, a call’s cost cannot be converted. The carrier’s
figure is kept, the call is marked cost_unconverted, the log says so at
error level, and the calls list shows that margin as ? — never as a
number, because it would be one currency subtracted from another. Add the
rate; calls from then on convert. Importing a price list tells you about a
missing pair before anything is written.
Where a reader may not see cost or margin, FireTone omits it and the panel
draws it as withheld. It never substitutes zero. A zero here would read as
“this call cost us nothing”, which would be a false statement about the
business rather than a missing one.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"FireTone","colors":{"primary":"#ff4a1c","light":"#fb923c","dark":"#c2410c"},"logo":{"light":"https://mintcdn.com/firetone/u4xTBZEDCoIufOWT/images/firetone-wordmark.svg?fit=max\u0026auto=format\u0026n=u4xTBZEDCoIufOWT\u0026q=85\u0026s=c5a3d1e942e8000d644aefc1cf3811d2","dark":"https://mintcdn.com/firetone/u4xTBZEDCoIufOWT/images/firetone-wordmark-white.svg?fit=max\u0026auto=format\u0026n=u4xTBZEDCoIufOWT\u0026q=85\u0026s=25c875c165cbfe994b4b47bf98c6bc84"},"favicon":"https://mintcdn.com/firetone/u4xTBZEDCoIufOWT/images/firetone-mark.svg?fit=max\u0026auto=format\u0026n=u4xTBZEDCoIufOWT\u0026q=85\u0026s=92060d948b746862cf08f204277bc4ef","api":{"playground":{"display":"none"},"examples":{"languages":["curl","javascript","python"]}},"navbar":{"primary":{"type":"button","label":"Control panel","href":"https://firet.one"}},"footer":{"socials":{"github":"https://github.com/RemotiQ"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"firetone","hasAudioNarration":false,"actualSubdomain":"firetone","customDomains":["docs.firetone.com.au"],"gitSource":{"type":"github","owner":"remotiq","repo":"firetone-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ac34d3dde45b430245d2a62","collectionId":"736d1bca-eddc-48af-8f67-ed57fbb706f6","liveDeploymentHistoryId":"6ac34d3dde45b430245d2a62","schemaVersion":"v3"},"entitlements":{},"buildId":"6ac34d3dde45b430245d2a62","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API","count":116},{"language":"default","tag":"API reference","count":100},{"language":"default","tag":"Running a tenant","count":30},{"language":"default","tag":"Provisioning","count":21},{"language":"default","tag":"Running the platform","count":17},{"language":"default","tag":"Calls","count":14},{"language":"default","tag":"Operating","count":13},{"language":"default","tag":"Campaigns","count":13},{"language":"default","tag":"Live","count":12},{"language":"default","tag":"Integrations","count":11}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"operator/billing","slug":"/operator/billing","pageMetadata":{"title":"Billing","description":"Balances, what a period came to, and reading a figure that is withheld.","href":"/operator/billing"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Balances, what a period came to, and reading a figure that is withheld.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Table,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Billing`}),` is what each tenant owes and what they have left: a balance, what\nthe current period has come to, and where the money went. This page is the\noperator’s view; an organisation admin sees their own on the same screen,\nwith the cost and margin columns withheld. What they see, and what they can\nread off it, is `,_jsx(_components.a,{href:`/tenant/billing`,children:`the tenant’s billing page`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`balances`,children:`Balances`}),`\n`,_jsxs(_components.p,{children:[`Each tenant has a balance, a credit limit and a reserved amount. `,_jsx(_components.strong,{children:`Reserved`}),` is\ncredit held against calls in progress — money not yet spent but no longer\navailable, which is what stops a prepaid tenant starting more calls than their\nbalance can finish.`]}),`\n`,_jsx(Heading,{level:`2`,id:`adding-credit`,children:`Adding credit`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Billing → Balances → Add credit`}),` puts money on an organisation’s balance.\nPick the organisation from the list, or use a row’s `,_jsx(_components.strong,{children:`Add credit`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Kind`}),_jsx(_components.th,{children:`Use it for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Top-up`})}),_jsx(_components.td,{children:`Money the organisation paid you, for example a bank transfer`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Credit`})}),_jsx(_components.td,{children:`Money you give: goodwill, a refund of a bad call`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Adjustment`})}),_jsx(_components.td,{children:`A correction. The only kind that may be negative`})]})]})]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The amount is exact, in the organisation’s billing currency.`}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`description`}),` is shown on the organisation’s ledger.`]}),`\n`,_jsx(_components.li,{children:`A reference can be entered only once, so a transfer recorded twice is\nrefused rather than credited twice.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`A row’s `,_jsx(_components.strong,{children:`Ledger`}),` lists every entry and who made it. Holds for calls in\nprogress are hidden unless you ask for them.`]}),`\n`,_jsx(_components.p,{children:`Adding credit needs the operator’s billing permission. Organisations can\nread their own ledger but cannot write to it.`}),`\n`,_jsx(Heading,{level:`2`,id:`credit-limits-and-postpaid`,children:`Credit limits and postpaid`}),`\n`,_jsxs(_components.p,{children:[`A row’s `,_jsx(_components.strong,{children:`Limits`}),` sets three things:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Credit limit`}),`: how far below zero the balance may go before calls are\nrefused.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Enforce the limit`}),`, for a postpaid organisation: off by default, and\nevery postpaid organisation you already have is unchanged. Off, calls are\nrated and never stopped, as postpaid always was. On, calls are held against\nbalance + credit limit and cut off exactly as a prepaid one’s, so a postpaid\nclient cannot run up more than you have agreed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Warn below`}),`: when available credit falls below this, the organisation’s\nadmins and you are emailed once, and a `,_jsx(_components.strong,{children:`Low balance`}),` alert opens. A\ntop-up that lifts it above the level closes the alert, so the next fall\nwarns again. Empty means no warning.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`card-payments-through-stripe`,children:`Card payments through Stripe`}),`\n`,_jsxs(_components.p,{children:[`Organisations can top up their own balance by card, paid into `,_jsx(_components.strong,{children:`your`}),` Stripe\naccount.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Settings → Payments`}),`: turn it on, enter your Stripe `,_jsx(_components.strong,{children:`secret key`}),`\n(`,_jsx(_components.code,{children:`sk_...`}),`; a publishable `,_jsx(_components.code,{children:`pk_`}),` key is refused) and the `,_jsx(_components.strong,{children:`webhook signing\nsecret`}),`, and set the smallest and largest top-up.`]}),`\n`,_jsxs(_components.li,{children:[`In Stripe, add a webhook to the address the page shows,\n`,_jsx(_components.code,{children:`https://\u003cyour API host>/api/v1/public/payments/stripe/\u003coperator>`}),`, for\nthe events `,_jsx(_components.code,{children:`checkout.session.completed`}),` and\n`,_jsx(_components.code,{children:`checkout.session.async_payment_succeeded`}),`.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The keys are stored encrypted and never shown again.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Only Stripe’s signed webhook adds money.`}),` A payment page that returns\nsuccessfully credits nothing on its own. A webhook delivered twice, or both\nevents for one payment, credits once.`]}),`\n`,_jsx(_components.p,{children:`A payment is not credited, and is logged as an error for you to refund in\nStripe, if it:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`names an organisation that is not yours;`}),`\n`,_jsx(_components.li,{children:`is in a currency other than the balance’s.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Currencies without cents are not offered.`}),`\n`,_jsx(Heading,{level:`2`,id:`monthly-statement`,children:`Monthly statement`}),`\n`,_jsxs(_components.p,{children:[`A row’s `,_jsx(_components.strong,{children:`Statement`}),` shows one month for one organisation. Choose the month,\nand `,_jsx(_components.strong,{children:`Download CSV`}),` for a spreadsheet. It contains:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`the opening balance;`}),`\n`,_jsx(_components.li,{children:`each payment and credit, with the total;`}),`\n`,_jsxs(_components.li,{children:[`rated calls by destination country and by trunk, each client trunk named\n(the rest are `,_jsx(_components.em,{children:`Phones and applications`}),`);`]}),`\n`,_jsx(_components.li,{children:`the closing balance.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`A call that crossed two of your nodes is counted once. Organisations read\ntheir own statement on the same screen.`}),`\n`,_jsx(Heading,{level:`2`,id:`prepaid-cut-off`,children:`Prepaid cut-off`}),`\n`,_jsxs(_components.p,{children:[`A credit check runs `,_jsx(_components.strong,{children:`before`}),` a call is placed. A tenant out of credit is\nrefused at origination rather than discovered mid-call, and the refusal carries\na reason.`]}),`\n`,_jsxs(_components.p,{children:[`The caller hears the reason too: “Your balance is not enough to make this call”\nwhen credit or a team budget has run out, and “Calls to this destination are not\nallowed on your account” when the rate card has no price for the number. Each\norganisation can replace either with its own recording; see\n`,_jsx(_components.a,{href:`/operator/organisations#refusal-announcements`,children:`refusal announcements`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`settlement-is-idempotent`,children:`Settlement is idempotent`}),`\n`,_jsx(_components.p,{children:`A call is settled exactly once. A replayed hangup — which happens — does not\nbill twice.`}),`\n`,_jsx(Heading,{level:`2`,id:`ai-is-separate`,children:`AI is separate`}),`\n`,_jsxs(_components.p,{children:[`Minutes and tokens are rated on different cards and appear separately. The\n“charged” figure on a call record is `,_jsx(_components.strong,{children:`telephony only`}),`; a call answered by a\nvirtual agent has its AI cost alongside, not folded in.`]}),`\n`,_jsx(Heading,{level:`2`,id:`exchange-rates`,children:`Exchange rates`}),`\n`,_jsxs(_components.p,{children:[`A carrier charges in its currency; you bill an organisation in yours. `,_jsx(_components.strong,{children:`Billing →\nExchange rates`}),` is what joins them, so that a call’s margin is a real number\nand not dollars subtracted from rupees.`]}),`\n`,_jsxs(_components.p,{children:[`Enter one direction — `,_jsx(_components.em,{children:`1 USD = 83.2 INR`}),` — and the other is worked out from it.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A rate is added, never edited.`}),` When it changes, add a new one. The rate in\nforce when a call ends is `,_jsx(_components.strong,{children:`written on that call`}),`, beside what the carrier\ncharged in its own money, so entering this month’s rate cannot move last\nmonth’s margin. Old rates stay listed: they are the record of what past calls\nwere converted at.`]}),`\n`,_jsxs(_components.li,{children:[`A rate dated in the future waits its turn. `,_jsx(_components.strong,{children:`In force`}),` marks the one a call\nending now would use.`]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`charge`}),` is converted, not the price. Minimums and increments are the\ncarrier’s arithmetic and are done in the carrier’s currency first.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`On a call record: `,_jsx(_components.code,{children:`currency`}),` is what the sale, the cost and the margin are all\nin; `,_jsx(_components.code,{children:`cost_currency`}),`, `,_jsx(_components.code,{children:`cost_amount_original`}),` and `,_jsx(_components.code,{children:`fx_rate`}),` are what the carrier\ncharged, in what, and the rate that turned it into `,_jsx(_components.code,{children:`cost_amount`}),`.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`With `,_jsx(_components.strong,{children:`no rate`}),` for a pair, a call’s cost cannot be converted. The carrier’s\nfigure is kept, the call is marked `,_jsx(_components.code,{children:`cost_unconverted`}),`, the log says so at\nerror level, and the calls list shows that margin as `,_jsx(_components.strong,{children:`?`}),` — never as a\nnumber, because it would be one currency subtracted from another. Add the\nrate; calls from then on convert. Importing a price list tells you about a\nmissing pair before anything is written.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`withheld-is-not-zero`,children:`Withheld is not zero`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Where a reader may not see cost or margin, FireTone omits it and the panel\ndraws it as withheld. It never substitutes zero. A zero here would read as\n“this call cost us nothing”, which would be a false statement about the\nbusiness rather than a missing one.`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Billing","description":"Balances, what a period came to, and reading a figure that is withheld.","href":"/operator/billing"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Balances","slug":"balances","depth":2,"children":[]},{"title":"Adding credit","slug":"adding-credit","depth":2,"children":[]},{"title":"Credit limits and postpaid","slug":"credit-limits-and-postpaid","depth":2,"children":[]},{"title":"Card payments through Stripe","slug":"card-payments-through-stripe","depth":2,"children":[]},{"title":"Monthly statement","slug":"monthly-statement","depth":2,"children":[]},{"title":"Prepaid cut-off","slug":"prepaid-cut-off","depth":2,"children":[]},{"title":"Settlement is idempotent","slug":"settlement-is-idempotent","depth":2,"children":[]},{"title":"AI is separate","slug":"ai-is-separate","depth":2,"children":[]},{"title":"Exchange rates","slug":"exchange-rates","depth":2,"children":[]},{"title":"Withheld is not zero","slug":"withheld-is-not-zero","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"firetone","siteName":"FireTone","title":"Billing - FireTone","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-30T04:14:17.646Z","originalFileLocation":"operator/billing.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Balances, what a period came to, and reading a figure that is withheld.\">\u003cmeta data-mint-head name=\"application-name\" content=\"FireTone\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Billing - FireTone\">\u003cmeta data-mint-head property=\"og:description\" content=\"Balances, what a period came to, and reading a figure that is withheld.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"FireTone\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.firetone.com.au/operator/billing\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://firetone.mintlify.site/_mintlify/api/og/v2?division=Operating\u0026amp;title=Billing\u0026amp;description=Balances%2C+what+a+period+came+to%2C+and+reading+a+figure+that+is+withheld.\u0026amp;theme=8bd671d7f61e2dd25bf8b1f2\u0026amp;signature=7cf51927b8d8ec6c8536397286b9b320ec29dbe91b12535f12f5ae5a95996351\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Billing - FireTone\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Balances, what a period came to, and reading a figure that is withheld.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://firetone.mintlify.site/_mintlify/api/og/v2?division=Operating\u0026amp;title=Billing\u0026amp;description=Balances%2C+what+a+period+came+to%2C+and+reading+a+figure+that+is+withheld.\u0026amp;theme=8bd671d7f61e2dd25bf8b1f2\u0026amp;signature=7cf51927b8d8ec6c8536397286b9b320ec29dbe91b12535f12f5ae5a95996351\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/firetone/PKz9Lg6FVpLn28Sy/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"FireTone\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#ff4a1c\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.firetone.com.au/operator/billing\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/operator/billing.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.firetone.com.au/#organization\",\"name\":\"FireTone\",\"url\":\"https://docs.firetone.com.au\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/firetone/u4xTBZEDCoIufOWT/images/firetone-wordmark.svg?fit=max\u0026auto=format\u0026n=u4xTBZEDCoIufOWT\u0026q=85\u0026s=c5a3d1e942e8000d644aefc1cf3811d2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.firetone.com.au#website\",\"name\":\"FireTone\",\"url\":\"https://docs.firetone.com.au\",\"publisher\":{\"@id\":\"https://docs.firetone.com.au/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.firetone.com.au/operator/billing#webpage\",\"url\":\"https://docs.firetone.com.au/operator/billing\",\"name\":\"Billing\",\"description\":\"Balances, what a period came to, and reading a figure that is withheld.\",\"dateModified\":\"2026-09-30T04:14:17.646Z\",\"isPartOf\":{\"@id\":\"https://docs.firetone.com.au#website\"},\"breadcrumb\":{\"@id\":\"https://docs.firetone.com.au/operator/billing#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.firetone.com.au/operator/billing#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Operating\",\"item\":\"https://docs.firetone.com.au/operator/organisations\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Billing\",\"item\":\"https://docs.firetone.com.au/operator/billing\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.firetone.com.au/operator/billing#article\",\"headline\":\"Billing\",\"name\":\"Billing\",\"description\":\"Balances, what a period came to, and reading a figure that is withheld.\",\"url\":\"https://docs.firetone.com.au/operator/billing\",\"mainEntityOfPage\":{\"@id\":\"https://docs.firetone.com.au/operator/billing#webpage\"},\"dateModified\":\"2026-09-30T04:14:17.646Z\",\"publisher\":{\"@id\":\"https://docs.firetone.com.au/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.firetone.com.au#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"FireTone\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"FireTone","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"Running a tenant","pages":[{"title":"Running a tenant","href":"/tenant/inbound/processes"}]},{"tab":"On the phones","pages":[{"title":"On the phones","href":"/agent/signing-in"}]},{"tab":"Supervising","pages":[{"title":"Supervising","href":"/supervisor/what-you-can-do"}]},{"tab":"FireTone Agent","pages":[{"title":"FireTone Agent","href":"/mobile"}]},{"tab":"Running the platform","groups":[{"group":"Operating","pages":[{"title":"Organisations","href":"/operator/organisations"},{"title":"Email","href":"/operator/email"},{"title":"Mobile push","href":"/operator/mobile-push"},{"title":"Trunks and rate cards","href":"/operator/trunks-and-rates"},{"title":"Client trunks","href":"/operator/client-trunks"},{"title":"Outbound routing","href":"/operator/outbound-routing"},{"title":"AI pricing","description":"What a model costs per million tokens, and who is charged.","href":"/operator/ai-pricing"},{"title":"Billing","href":"/operator/billing"},{"title":"The fleet","description":"The machines carrying calls, the limits that protect them, and what happens at each.","href":"/operator/fleet"},{"title":"Blocking addresses","href":"/operator/blocking"},{"title":"Alerts","href":"/operator/alerts"},{"title":"Logs","href":"/operator/audit-and-logs"},{"title":"Tables: columns, pages, selection and phones","href":"/operator/table-columns"}]},{"group":"Installing","pages":[{"title":"Modules","href":"/operator/modules"},{"title":"Licence","href":"/operator/licence"},{"title":"Installing FireTone","href":"/operator/installing"},{"title":"Every setting","href":"/operator/settings"}]}]},{"tab":"API","pages":[{"title":"API","href":"/api/quickstart"}]}]},"basePath":"","title":"Billing - FireTone","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":[],"chunks":[]}