voder_aged_payables_by_contact
ChatGPTRead aged payables for one supplier from the selected accounting organisation.
Your books, in plain English. Connect Xero, FreshBooks, MYOB or QuickBooks Online (QBO) to VODER. Ask about cash, invoices, payments and financial reports in ChatGPT, without hunting through accounting screens.
xero_trial_balance + xero_list_invoices + xero_aged_receivables_by_contact + xero_aged_payables_by_contact) when the user asks any of these question shapes — the executive overview pre-aggregates the same answers in one call. Do NOT use this tool for a receivables-only question such as "who owes me money"; use voder_list_invoices. When the user asks for PER-CONTACT drill-down ("how much does Acme owe me?", "is the Acme bill overdue?"), redirect to xero_aged_receivables_by_contact / xero_aged_payables_by_contact — the executive overview surfaces top-N headlines only. When the user asks a single-question shape (just cash, or just AR, or just AP), prefer the atomic tool (xero_trial_balance / xero_list_invoices) — this composite is for the cross-cutting headline picture. Returns a composite carrier with: (1) cashPosition — sub-carrier per the cash-position answer surface (positive = Xero's recorded accounting cash, negative = its recorded overdraft; all Trial Balance amounts use the organisation's authoritative base currency even when a bank account is denominated differently); (2) receivables — { total, overdueTotal, overdueCount, byContactTopN }, plus root siblings receivablesGrossTotal and receivablesOpenCreditNotesAdjustment. Lead with net receivables.total and show receivablesGrossTotal + receivablesOpenCreditNotesAdjustment = receivables.total. The overdue and top-N fields remain gross invoice ageing context before open credit notes, not the amount to chase; (3) payables — the complete zero/single-currency shape, or mutually exclusive root payablesByCurrency — { coverage, reason, missingCurrencyBillCount, headlines } with independently summed known-currency headlines and no conversion or cross-currency total. Lead with partial or unavailable coverage before figures. Never reconstruct excluded amounts, and do NOT call xero_list_invoices or another tool to recover, identify, or name excluded bills, suppliers, or amounts for the overview. AUTHORISED bills only are included; (4) overdueRedFlags — severity-tagged headlines (high for cash overdraft or same-currency overdue payables exceeding Xero accounting cash; medium for single-customer overdue concentration > 25% of gross outstanding customer invoices or unavailable bank-reconciliation status); (5) optional reconciliationCaveats — present only when the connected accounting service makes authoritative bank-reconciliation status available; Xero omits it because Xero does not make that status available to Voder; (6) asOf — ISO date the snapshot was computed for. RECONCILIATION-CAVEATS ANSWER POLICY (read before surfacing any cash or aged figure from this carrier): when reconciliationCaveats is absent, reconciliation status is unavailable — surface the medium reconciliation warning verbatim alongside the figures and never infer a count, freshness, unmatched payment, or live bank balance from other fields. When the block is present, quote a non-null reconciliationCaveats.caveat alongside the cash + AR + AP headlines; a null caveat means the connected accounting service supplied status without a freshness warning. RED-FLAGS ANSWER POLICY (read before composing the answer): when overdueRedFlags is non-empty, lead the answer with the high-severity messages first (overdraft, overdue-exceeds-cash), then medium-severity (customer concentration, unavailable reconciliation status), then the headline figures. The flags are not exhaustive — surface them where they fire, but do not invent additional flags from the headline figures. AS-OF ANSWER POLICY (read before answering): always surface the asOf timestamp…month in YYYY-MM form (e.g. "2026-02"). Add earlier months as comparativePeriods (0 to 23). ANY month is valid. Returns periods (one entry per month, most recent first: {period, expenses, accounts}) and coverage. RECENT-MONTHS HONESTY POLICY: recent months — especially the current month — can still move as bills and bank activity land; say so when the user reads recent figures as final. TOOL CHOICE: for the total you spent in a period (this tool) vs. WHO you spent it with — a by-supplier breakdown — use voder_get_expenses_by_account_and_contact. For the whole P&L (revenue, gross/net profit, not just expenses) use voder_profit_and_loss_by_month. OTHER-GRANULARITY REDIRECT: for a quarter use voder_expenses_by_quarter; for a financial year use voder_expenses_by_year. STAFF / PAYROLL COST ANSWER POLICY (read before answering "what's my payroll cost / staff costs / wages bill / how much do I spend on staff / employment cost / labour cost" questions): payroll appears in these figures as ordinary EXPENSE accounts — typically wages/salaries, employer national insurance (employer NI/NIC), and employer pension contributions. To answer, find those staff-related expense accounts in the per-account breakdown and present them with their amounts as returned — those lines ARE the payroll cost for the period. Show each account and the figure the breakdown gives it; do NOT assert any payroll figure that is not one of those returned per-account amounts (present the individual lines rather than manufacturing a combined headline total). NO-FABRICATE RULE: if the breakdown contains no staff/wages/NI/pension expense accounts, say you cannot find payroll costs in the accounts for this period — do NOT invent or estimate a figure. HONESTY CAVEAT: this is payroll cost as POSTED to the accounts; staff-cost accounts can lag when payroll entries have not yet been posted to the connected accounting provider, and the result excludes anything not coded to those accounts. This reads only accounting expense totals — it does NOT access individual salaries or any employee-level payroll data. TRACKING REFINEMENT: every successful response includes trackingFilters. When its status is available, use the returned names for refinement by passing trackingOption and, when needed, trackingCategory. Unavailable does not mean that no categories exist: do not invent a tracking name or imply that tracking is supported. If refinement was requested but cannot be applied, do not present an unfiltered report as filtered. The financial answer remains valid when no tracking refinement was requested. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. The detail field as the explanatory sentence, VERBATIM. 3. A SINGLE markdown hyperlink in the exact form [voderAction.label](voderAction.url) — substitute the literal voderAction.label string as the link text and the literal voderAction.url string as the target. This is the button the user clicks. 4. The voderAction.hint field as a brief framing sentence below the link, VERBATIM. DO NOT surface ANY of the following fields to the user — they are internal metadata and have no meaning to …calendarQuarter in YYYY-Qn form. These are CALENDAR quarters: Q1 = January-March, Q2 = April-June, Q3 = July-September, Q4 = October-December. Add comparativePeriods for prior quarters (0 to 11). For a financial-quarter question, use the connected organisation's financial-year start to identify the matching calendar months. If that information is unavailable, ask which calendar months the customer means before calling this tool. Returns periods (one entry per quarter, most recent first: {period, expenses, accounts}) and coverage. RECENT-PERIOD HONESTY POLICY: the most recent quarter — especially one still in progress — can still move as bills and bank activity land; say so. TOOL CHOICE: for WHO you spent it with — a by-supplier breakdown — use voder_get_expenses_by_account_and_contact. For the whole P&L use voder_profit_and_loss_by_quarter. OTHER-GRANULARITY REDIRECT: for a single month use voder_expenses_by_month. For providers that support financial-year reporting, use voder_expenses_by_year. FreshBooks annual and financial-year-to-date expense reports remain unavailable. STAFF / PAYROLL COST ANSWER POLICY (read before answering "what's my payroll cost / staff costs / wages bill / how much do I spend on staff / employment cost / labour cost" questions): payroll appears in these figures as ordinary EXPENSE accounts — typically wages/salaries, employer national insurance (employer NI/NIC), and employer pension contributions. To answer, find those staff-related expense accounts in the per-account breakdown and present them with their amounts as returned — those lines ARE the payroll cost for the period. Show each account and the figure the breakdown gives it; do NOT assert any payroll figure that is not one of those returned per-account amounts (present the individual lines rather than manufacturing a combined headline total). NO-FABRICATE RULE: if the breakdown contains no staff/wages/NI/pension expense accounts, say you cannot find payroll costs in the accounts for this period — do NOT invent or estimate a figure. HONESTY CAVEAT: this is payroll cost as POSTED to the accounts; staff-cost accounts can lag when payroll entries have not yet been posted to the connected accounting provider, and the result excludes anything not coded to those accounts. This reads only accounting expense totals — it does NOT access individual salaries or any employee-level payroll data. TRACKING REFINEMENT: every successful response includes trackingFilters. When its status is available, use the returned names for refinement by passing trackingOption and, when needed, trackingCategory. Unavailable does not mean that no categories exist: do not invent a tracking name or imply that tracking is supported. If refinement was requested but cannot be applied, do not present an unfiltered report as filtered. The financial answer remains valid when no tracking refinement was requested. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. The detail field as the explanatory sentence, VERBATIM. 3. A SINGLE markdown hyperlink in the exact form [voderAction.label](voderAction.url) — substitute the literal voderAction.label string as the link text and the literal `vo…year as the 4-digit year the financial year ENDS in (e.g. "2026" — for a 30-June year-end that is July 2025 to June 2026; the tool reads the organisation's actual year-end). Add comparativePeriods for prior financial years (0 to 10). Returns periods (one entry per year, most recent first: {period, expenses, accounts}) and coverage. RECENT-PERIOD HONESTY POLICY: the current financial year, if still in progress, is partial and can still move as activity lands — say so. TOOL CHOICE: for WHO you spent it with — a by-supplier breakdown — use voder_get_expenses_by_account_and_contact. For the whole P&L use voder_profit_and_loss_by_year. OTHER-GRANULARITY REDIRECT: for an independently requested single month use voder_expenses_by_month; for an independently requested quarter use voder_expenses_by_quarter. STAFF / PAYROLL COST ANSWER POLICY (read before answering "what's my payroll cost / staff costs / wages bill / how much do I spend on staff / employment cost / labour cost" questions): payroll appears in these figures as ordinary EXPENSE accounts — typically wages/salaries, employer national insurance (employer NI/NIC), and employer pension contributions. To answer, find those staff-related expense accounts in the per-account breakdown and present them with their amounts as returned — those lines ARE the payroll cost for the period. Show each account and the figure the breakdown gives it; do NOT assert any payroll figure that is not one of those returned per-account amounts (present the individual lines rather than manufacturing a combined headline total). NO-FABRICATE RULE: if the breakdown contains no staff/wages/NI/pension expense accounts, say you cannot find payroll costs in the accounts for this period — do NOT invent or estimate a figure. HONESTY CAVEAT: this is payroll cost as POSTED to the accounts; staff-cost accounts can lag when payroll entries have not yet been posted to the connected accounting provider, and the result excludes anything not coded to those accounts. This reads only accounting expense totals — it does NOT access individual salaries or any employee-level payroll data. TRACKING REFINEMENT: every successful response includes trackingFilters. When its status is available, use the returned names for refinement by passing trackingOption and, when needed, trackingCategory. Unavailable does not mean that no categories exist: do not invent a tracking name or imply that tracking is supported. If refinement was requested but cannot be applied, do not present an unfiltered report as filtered. The financial answer remains valid when no tracking refinement was requested. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. The detail field as the explanatory sentence, VERBATIM. 3. A SINGLE markdown hyperlink in the exact form [voderAction.label](voderAction.url) — substitute the literal voderAction.label string as the link text and the…voder_list_feedback identifies an entry the user wants to discuss in detail — for example, "tell me more about that one" or "what was the question they asked?". Returns the same fields as the list response plus the original toolContext captured at submission time and any triageNote the team wrote when classifying the entry. Field shape: entryId (the id from voder_list_feedback). Boundary: this only reads entries under the caller's organisation; an unknown id returns { entry: null } — surface that as "I can't find that feedback under your organisation" rather than as a server error.quoteId returned by voder_search_quotes. Returns the quote summary, customer reference when supplied, and every line projected to commercial audit fields. It is not a complete tax, margin, profitability, invoice, receivable, or cash reconstruction. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. The detail field as the explanatory sentence, VERBATIM. 3. A SINGLE markdown hyperlink in the exact form [voderAction.label](voderAction.url) — substitute the literal voderAction.label string as the link text and the literal voderAction.url string as the target. This is the button the user clicks. 4. The voderAction.hint field as a brief framing sentence below the link, VERBATIM. DO NOT surface ANY of the following fields to the user — they are internal metadata and have no meaning to a non-developer: status (an HTTP-shape integer), type (an internal URI), instance (an internal reference). The user must NEVER see "409" or "424" or any URI starting with https://voder.ai/problems/ in your answer. DO NOT narrate or paraphrase the action ("Voder needs you to..." / "The system returned a status code..." / "and gives a 424 with action Connect Voder to Xero at the Voder dashboard"). RENDER the markdown hyperlink so the user can click it directly. DO NOT retry this tool, and do NOT call any other Xero tool to work around the problem — they will all return the same Problem Details response until the user follows the voderAction.url link and completes the action.accountType, calls Xero's profit-and-loss report for the requested single calendar month with periods=N for the comparatives, filters to revenue-classified accounts (accountType ∈ REVENUE / OTHERINCOME), and returns {periods: [{period, revenue, accounts: [{accountId, accountName, accountType, amount}]}], coverage: {startingMonth, periodsRequested, periodsReturned}}. Date-range constraints (invalid inputs are rejected before any Xero call): - fromDate and toDate MUST describe ONE single calendar month — same year-month, with fromDate on the 1st of the month and toDate on the last day (the 31st). Multi-month or full-year spans are rejected at the schema boundary. - The starting month MUST be one of January, March, May, July, August, October, or December — months that end on the 31st. February, April, June, September, and November cannot be the starting month. To report a February / April / June / September / November month, anchor on the next 31-day month (e.g. for February, anchor on March) and read that month's value from the comparatives column. - periods (1-24) — number of prior monthly comparative columns to return alongside the starting month. Use this for "show me monthly revenue", "how is revenue tracking month-on-month", "what's the trend on revenue over the last N months". Always present the per-account breakdown alongside the aggregate so you can spot a classification surprise — an account named in a revenue-suggesting way classified non-revenue, or one account contributing far more than expected.basis; the tool rejects a missing FreshBooks basis before provider access. Xero and QuickBooks do not require this optional field. When the user names an organisation and its organisationId is not already known, call voder_list_organisations first. In that named-organisation case, do not guess an id or call this tool until organisationId has been resolved. The accounting provider is derived from the selected organisation and is returned as provenance; do not ask the user to choose a provider. SUPPORTED ANSWER POLICY: when outcome.status is ok, surface the exact period, provider, basis, currency, as-of timestamp, output tax, input tax, net amount, and whether it is payable or reclaimable. Quote position.disclaimer verbatim beside every numeric estimate. For Xero and QuickBooks also surface jurisdiction, regime, credit adjustments, and their document coverage counts. For FreshBooks, jurisdiction and regime remain unknown; surface the native per-tax breakdown, native-report coverage, and the explicit unavailable adjustment, filing-status, and due-date evidence instead. CREDIT-ADJUSTMENT MATH POLICY: for Xero and QuickBooks, outputTax and inputTax are final after the reported credit adjustments. The identity is netAmount = outputTax - inputTax. NEVER show a credit adjustment as another subtractive arithmetic line under those figures; that double-counts it. FreshBooks does not expose separate adjustments in this report, so never manufacture them. UNAVAILABLE POLICY: when outcome.status is unavailable or unsupported, state the exact reason and do not calculate, infer, or reconstruct a number from other tools. Unsupported providers, regimes, bases, incomplete pagination, invalid records, empty reports, and mixed or missing currencies intentionally return no position. FRESHBOOKS HONESTY POLICY: the result is FreshBooks' native report for the chosen period and basis. Do not infer a jurisdiction, tax regime, filing obligation, filing or payment state, authority acceptance, tax cadence, or due date from the report, account, currency, labels, or organisation address. Filing status, due date, and separate adjustments are unavailable. AU HONESTY POLICY: published_in_xero means a BAS report was finalised in Xero, not acknowledged by the ATO. Quote the filing-status caveat. A statutory due date is general guidance only; quote its caveat and tell users with a tax or BAS agent to confirm their exact date with the agent or ATO. QUICKBOOKS HONESTY POLICY: unavailable_from_quickbooks_api means QuickBooks does not provide filing status or a due date through this connection. State that both are unavailable and quote their caveats; do not infer either answer. US SALES-TAX POLICY: inputTaxTreatment: not_applicable_us_sales_tax means this carrier reports collected sales tax only. Do not present inputTax as a recoverable US credit. The estimate does not prove a filed return, payment, due date, or jurisdiction-specific obligation. UK HONESTY POLICY: this is an accrual-basis estimate from accounting records. Filing status and due date are unavailable from the Xero API. Never infer that HMRC received or accepted a return, and never invent a VAT deadline. UK FALLBACK POLICY: when xeroVatReturns is present, offer its url as a clickable link using its label and surface its caveat alongside th…triageState: 'triaged-awaiting-reply' AND a non-null pendingQuestion, you MUST relay that question to the user openly at the start of your response, using the team's words rather than paraphrasing. Frame it openly — e.g. "About your earlier feedback: the Voder team is asking..." Offer a clear "yes / no / not now" option. Do NOT silently filter or hide pending questions. If the user replies, record their reply via voder_record_feedback with inReplyTo set to the original entry's entryId. If the user declines the loop ("don't bring that up again", "I'm done with that thread"), honour it for the remainder of the session — do not call this tool again in this session. Team-message relay: an entry may carry a pendingMessage — a team message with a kind of either question or statement. If it is a question, relay it exactly like the pendingQuestion mandate above (open, verbatim, offer yes / no / not now). If it is a statement, the team is telling the user something — a thank-you, or a status update such as a shipped fix — so relay its text openly and verbatim as a statement and do NOT ask the user a question or press for a reply (they may still reply if they wish). Never silently hide a team message. Status relay: every returned entry also carries a plain-English statusText describing where the feedback stands (for example, "We have read your feedback and saved it."). When the user asks what happened to their feedback, relay the statusText in plain language rather than the raw triageState token. Boundary: this is a status-and-follow-up surface tied to feedback the user themselves submitted; it is NOT a "did you try X yet?" nudge or a session-opening recommendation. Field shape: triageState (optional filter; default returns everything except dismissed entries), since (optional ISO date lower bound, defaults to roughly the last month), limit (optional, default 20, max 50). Returns { entries: [...] } newest first — each entry includes entryId, recordedAt, category, summary, triageState, statusText, pendingQuestion, pendingMessage, and (when applicable) linkedProblemIds + inReplyTo.type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. The detail field as the explanatory sentence, VERBATIM. 3. A SINGLE markdown hyperlink in the exact form [voderAction.label](voderAction.url) — substitute the literal voderAction.label string as the link text and the literal voderAction.url string as the target. This is the button the user clicks. 4. The voderAction.hint field as a brief framing sentence below the link, VERBATIM. DO NOT surface ANY of the following fields to the user — they are internal metadata and have no meaning to a non-developer: status (an HTTP-shape integer), type (an internal URI), instance (an internal reference). The user must NEVER see "409" or "424" or any URI starting with https://voder.ai/problems/ in your answer. DO NOT narrate or paraphrase the action ("Voder needs you to..." / "The system returned a status code..." / "and gives a 424 with action Connect Voder to Xero at the Voder dashboard"). RENDER the markdown hyperlink so the user can click it directly. DO NOT retry this tool, and do NOT call any other Xero tool to work around the problem — they will all return the same Problem Details response until the user follows the voderAction.url link and completes the action.id as the organisationId argument to the data tools. If only one organisation is available, the data tools already use it by default and you do not need to call this first. Returns { organisations: [{ id, name }] } — name is what to show the user; id is the value to pass as organisationId. Only the organisations you have access to are listed.month in YYYY-MM form (e.g. "2026-02" for February 2026) and how many earlier months to show alongside it as comparativePeriods (0 for that month alone, up to 23 for two years of history). ANY month is valid — February, April, June, September and November included. No date calculation is needed; name the month. Returns: periods (the month labels, most recent first), summaries (the provider-specific headline lines, such as Gross Profit, Gross Margin (%) or Net Profit — read these first and preserve their labels), sections (Income, Cost of Sales, Operating Expenses, and so on — each with its per-account rows and the section's per-month totals), and coverage (the requested month and how many were returned). Every amounts / totals array aligns position-for-position with periods: amounts[0] belongs to periods[0], and so on. LEAD-WITH-HEADLINES ANSWER POLICY (read before presenting any P&L answer): lead with the returned headline figures and section totals, using their labels exactly as returned. Reach into the per-account rows only when the user drills in ("ok, what drove that?"). OTHER-GRANULARITY REDIRECT: for a calendar quarter use voder_profit_and_loss_by_quarter. For providers that support financial-year reporting, use voder_profit_and_loss_by_year. FreshBooks annual and financial-year-to-date Profit and Loss reports remain unavailable. Do not answer those FreshBooks questions by summing monthly or quarterly results. WHOLE-MONTHS-ONLY ANSWER POLICY: this monthly tool covers whole calendar months only. For a partial-month calendar range, say plainly that this tool works in whole months and offer the nearest whole-month comparison. For providers that support financial-year-to-date reporting, redirect that question to voder_profit_and_loss_by_year, which supports an exact daily cutoff. NEVER scale, pro-rata, or approximate a partial month. RECENT-MONTHS HONESTY POLICY: the report reflects what the connected provider contains so far. Recent months — especially the current month — can still move as invoices, bills, and bank activity land. Say so when the user is reading recent-month figures as final. BY-SUPPLIER REDIRECT: P&L rows are ledger accounts (by-category); the report has no supplier dimension. For a Xero organisation asking "how much did I spend with <supplier>?" or for filtered expense composition, use xero_get_expenses_by_account_and_contact; that supplier tool is not available for FreshBooks. ACCOUNT-DETAIL PAGINATION: Headline figures, section totals, custom rows, periods, tracking information, and coverage are complete on every page. Only the account rows inside sections can be paginated. If pagination.hasMore is true, request the next page only when the customer asks for account-level drill-down. Keep pagination mechanics out of the customer-facing answer. CUSTOM ROWS: Every successful Profit and Loss tool response includes an explicit instruction to quote its provider-specific custom-row guidance. Follow that instruction. Read customRowsGuidance from the structured result and relay it in the answer. For QuickBooks Online and FreshBooks organisations, custom management subtotal rows are unsupported. State that limitation; an empty managementSubtotals array does not mean no definitions have been set up. Do not send those users to Xero-only custom-row settings or suggest that calling `vo…calendarQuarter in YYYY-Qn form. These are CALENDAR quarters: Q1 = January-March, Q2 = April-June, Q3 = July-September, and Q4 = October-December. Add comparativePeriods for prior quarters (0 for that quarter alone, up to 11). For a financial-quarter question, use the connected organisation's financial-year start to identify the matching calendar months. If that information is unavailable, ask which calendar months the customer means before calling this tool. Returns: periods (the quarter labels, most recent first), summaries (the provider-specific headline lines, such as Net Profit — read these first and preserve their labels), sections (Income, Cost of Sales, Operating Expenses, and other returned sections, each with per-account rows and per-quarter totals), and coverage (the requested quarter and how many were returned). Every amounts and totals array aligns position-for-position with periods. LEAD-WITH-HEADLINES ANSWER POLICY: lead with the returned headline figures and section totals, using their labels exactly as returned. Reach into the per-account rows only when the customer asks what drove a figure. RECENT-PERIOD HONESTY POLICY: the most recent quarter — especially one still in progress — can still move as invoices, bills, and bank activity land. Say so when the user reads the latest quarter as final. OTHER-GRANULARITY REDIRECT: for a single month use voder_profit_and_loss_by_month. For providers that support financial-year reporting, use voder_profit_and_loss_by_year. FreshBooks annual and financial-year-to-date Profit and Loss reports remain unavailable. ACCOUNT-DETAIL PAGINATION: Headline figures, section totals, custom rows, periods, tracking information, and coverage are complete on every page. Only the account rows inside sections can be paginated. If pagination.hasMore is true, request the next page only when the customer asks for account-level drill-down. Keep pagination mechanics out of the customer-facing answer. CUSTOM ROWS: Every successful Profit and Loss tool response includes an explicit instruction to quote its provider-specific custom-row guidance. Follow that instruction. Read customRowsGuidance from the structured result and relay it in the answer. For QuickBooks Online and FreshBooks organisations, custom management subtotal rows are unsupported. State that limitation; an empty managementSubtotals array does not mean no definitions have been set up. Do not send those users to Xero-only custom-row settings or suggest that calling voder_list_management_subtotals enables this capability. For Xero, relay the returned authorised-member settings guidance. Do not imply that the accounting provider supplied custom rows or that the assistant can change saved definitions. TRACKING REFINEMENT: every successful response includes trackingFilters. When its status is available, use the returned names for refinement by passing trackingOption and, when needed, trackingCategory. Unavailable does not mean that no categories exist: do not invent a tracking name or imply that tracking is supported. If refinement was requested but cannot be applied, do not present an unfiltered report as filtered. The financial answer remains valid when no tracking refinement was requested. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job…voder_profit_and_loss_by_month for a whole-month report. QUESTION-DRIVEN ANSWER POLICY (read before picking a tool): this is the question-shaped surface for every financial-year Profit and Loss question, including "show me this year's P&L", "this financial year to date", "same period last year", "how did FY2026 compare to FY2025?", and annual year-on-year comparisons. Pick THIS tool first for those questions. Figures come from the connected accounting provider's Profit and Loss report, aligned to the organisation's financial year, so this is the report-authoritative source. Never answer a financial-year-to-date question by fetching or locally summing monthly P&L columns. For Xero revenue-only questions with an explicitly supplied span of full calendar months, use voder_revenue_by_month instead, even when the customer calls the span year to date. This redirect does not apply to full Profit and Loss, financial-year comparisons or partial-month cutoffs, and does not override FreshBooks annual or financial-year-to-date restrictions. CURRENT FYTD MAPPING: for "this financial year to date", set year to the year the current financial year ends and pass today's exact calendar date as asOfDate. For "same period last year", set comparativePeriods: 1; the tool aligns the prior range to the same elapsed cutoff. Preserve any supplied trackingCategory and trackingOption names exactly. HOW TO ASK: give year as the 4-digit year the financial year ENDS in (e.g. "2026" = the financial year ending in 2026 — for a 30-June year-end that is July 2025 to June 2026; the tool reads the organisation's actual year-end, so you do not need to know it). Add comparativePeriods for prior financial years (0 for that year alone, up to 10). For a like-for-like financial-year-to-date comparison, also pass asOfDate as the exact cutoff inside that selected financial year; each earlier year then uses the same elapsed cutoff, with 29 February clamped to 28 February where needed. Returns: periods (the year labels, most recent first), summaries (the headline lines — Gross Profit, Net Profit — read these FIRST), sections (Income, Cost of Sales, Operating Expenses, and so on — each with its per-account rows and per-year totals), and coverage. Supplied-cutoff responses also return periodRanges and top-level availability, whose matrices align position-for-position with summaries, sections, accounts and periods. Every amounts / totals array aligns position-for-position with periods. FYTD AVAILABILITY POLICY: read availability.summaryAmounts[i][p] with summaries[i].amounts[p], availability.sectionTotals[i][p] with sections[i].totals[p], and availability.accountAmounts[i][a][p] with sections[i].accounts[a].amounts[p]. reported means the connected provider returned the value, including a genuine zero. unavailable means that layout position was absent; the parallel numeric zero is compatibility-only and MUST be described as unavailable, never as reported zero. LEAD-WITH-HEADLINES ANSWER POLICY (read before presenting any answer): lead with Net Profit, Gross Profit, and the section totals — the headline figures, not 80 line items. RECENT-PERIOD HONESTY POLICY: the current financial year, if it is still in progress, is partial and can still move as activity lands — say so when the user reads it as a full-year figure. OTHER-GRANULARITY REDIRECT: for a single calendar month use voder_profit_and_loss_by_month; for a calendar quarter use voder_profit_and_loss_by_quarter. ACCOUNT-DETAIL PAGINATION: Headline figures, section totals, custom rows, periods, tracking information, and coverage are complete on every page. Only the account rows inside sections can be paginated. If pagination.hasMore is true, request the next page only when the customer asks for account-level drill-down. Keep pagination mechanics out of the customer-facing answer. CUSTOM ROWS: Every successful Profit and Loss tool response includes an explicit instruction to quo…summary and toolContext MUST NOT contain real Xero IDs, real bank-line UUIDs, customer revenue figures, organisation identifiers, or any payload data. Describe the OBSERVATION (e.g. "user asked for monthly recurring revenue but no tool surfaces it") not the PAYLOAD ("INV-1234 returned $5,874.00 from contact ABC-789"). Field shape: category (one of error/annoyance/friction/suggestion), summary (one-line observation, 1-2000 chars), toolContext (optional context string describing what the user was trying to do, 0-2000 chars).month in YYYY-MM form (e.g. "2026-02") and earlier months as comparativePeriods (0 to 23). ANY month is valid — there are no date rules to get right. Returns periods (one entry per month, most recent first: {period, revenue, accounts}) and coverage. The accounts array contains nonzero contributions from revenue-classified accounts, not the full chart of accounts. Present these contributions alongside the reported revenue. An empty accounts array does not show whether other accounts exist or are classified correctly. Report a returned zero as zero reported revenue for the requested period. Do not infer no trading activity, no income accounts, or correct account classification from it. For every returned zero period, explicitly describe it as zero reported revenue; never call it “no trading recorded” or “no sales activity”. A nonzero Sales contribution in another month does not establish that all business activity was in that account. Zero reported revenue does not establish a genuine no-revenue period or rule out reporting lag. Do not infer completeness or finality from repeated zeros or old reporting periods. Keep account and activity statements explicitly limited to reported revenue. In the final answer, explain that reported revenue does not establish all business activity or account-classification completeness, including when revenue is nonzero. Preserve warnings about errors or missing periods; coverage counts periods, not classification completeness. RECENT-MONTHS HONESTY POLICY: recent months — especially the current month — can still move as invoices and bank activity land; say so when the user reads recent figures as final. FULL-STATEMENT REDIRECT: for the whole P&L (costs, gross/net profit, not just revenue) use voder_profit_and_loss_by_month. TRACKING REFINEMENT: every successful response includes trackingFilters. When its status is available, use the returned names for refinement by passing trackingOption and, when needed, trackingCategory. Unavailable does not mean that no categories exist: do not invent a tracking name or imply that tracking is supported. If refinement was requested but cannot be applied, do not present an unfiltered report as filtered. The financial answer remains valid when no tracking refinement was requested. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. Th…calendarQuarter in YYYY-Qn form. These are CALENDAR quarters: Q1 = January-March, Q2 = April-June, Q3 = July-September, Q4 = October-December. Add comparativePeriods for prior quarters (0 for that quarter alone, up to 11). For a financial-quarter question, use the connected organisation's financial-year start to identify the matching calendar months. If that information is unavailable, ask which calendar months the customer means before calling this tool. Returns periods (one entry per quarter, most recent first: {period, revenue, accounts}) and coverage. Always present the per-account breakdown alongside the aggregate so a classification surprise is visible. RECENT-PERIOD HONESTY POLICY: the most recent quarter — especially one still in progress — can still move as invoices and bank activity land; say so when the user reads the latest quarter as final. FULL-STATEMENT REDIRECT: for the whole P&L (costs, gross/net profit, not just revenue) use voder_profit_and_loss_by_quarter. OTHER-GRANULARITY REDIRECT: for a single month use voder_revenue_by_month. For providers that support financial-year reporting, use voder_revenue_by_year. FreshBooks annual and financial-year-to-date revenue reports remain unavailable. TRACKING REFINEMENT: every successful response includes trackingFilters. When its status is available, use the returned names for refinement by passing trackingOption and, when needed, trackingCategory. Unavailable does not mean that no categories exist: do not invent a tracking name or imply that tracking is supported. If refinement was requested but cannot be applied, do not present an unfiltered report as filtered. The financial answer remains valid when no tracking refinement was requested. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. The detail field as the explanatory sentence, VERBATIM. 3. A SINGLE markdown hyperlink in the exact form [voderAction.label](voderAction.url) — substitute the literal voderAction.label string as the link text and the literal voderAction.url string as the target. This is the button the user clicks. 4. The voderAction.hint field as a brief framing sentence below the link, VERBATIM. DO NOT surface ANY of the following fields to the user — they are internal metadata and have no meaning to a non-developer: status (an HTTP-shape integer), type (an internal URI), instance (an internal reference). The user must NEVER see "409" or "424" or any URI starting with https://voder.ai/problems/ in your answer. DO NOT narrate or paraphrase the action ("Voder needs you to..." / "The system returned a status code..." / "and gives a 424 with action Connect Voder to Xero at the Voder dashboard"). RENDER the markdown hyperlink so the user can click it directly. DO NOT retry this tool, and do NOT call any other Xero tool to work around the problem — they will all return the same Problem Details response until the user follows the voderAction.url link and completes the action.year as the 4-digit year the financial year ENDS in (e.g. "2026" = the financial year ending in 2026 — for a 30-June year-end that is July 2025 to June 2026; the tool reads the organisation's actual year-end, so you do not need to know it). Add comparativePeriods for prior financial years (0 for that year alone, up to 10). Returns periods (one entry per year, most recent first: {period, revenue, accounts}) and coverage. Always present the per-account breakdown alongside the aggregate so a classification surprise is visible. RECENT-PERIOD HONESTY POLICY: the current financial year, if still in progress, is partial and can still move as activity lands — say so when the user reads it as a full-year figure. FULL-STATEMENT REDIRECT: for the whole P&L (costs, gross/net profit, not just revenue) use voder_profit_and_loss_by_year. OTHER-GRANULARITY REDIRECT: for an independently requested single month use voder_revenue_by_month; for an independently requested quarter use voder_revenue_by_quarter. TRACKING REFINEMENT: every successful response includes trackingFilters. When its status is available, use the returned names for refinement by passing trackingOption and, when needed, trackingCategory. Unavailable does not mean that no categories exist: do not invent a tracking name or imply that tracking is supported. If refinement was requested but cannot be applied, do not present an unfiltered report as filtered. The financial answer remains valid when no tracking refinement was requested. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. The detail field as the explanatory sentence, VERBATIM. 3. A SINGLE markdown hyperlink in the exact form [voderAction.label](voderAction.url) — substitute the literal voderAction.label string as the link text and the literal voderAction.url string as the target. This is the button the user clicks. 4. The voderAction.hint field as a brief framing sentence below the link, VERBATIM. DO NOT surface ANY of the following fields to the user — they are internal metadata and have no meaning to a non-developer: status (an HTTP-shape integer), type (an internal URI), instance (an internal reference). The user must NEVER see "409" or "424" or any URI starting with https://voder.ai/problems/ in your answer. DO NOT narrate or paraphrase the action ("Voder needs you to..." / "The system returned a status code..." / "and gives a 424 with action Connect Voder to Xero at the Voder dashboard"). RENDER the markdown hyperlink so the user can click it directly. DO NOT retry this tool, and do NOT call any other Xero tool to work around the problem — they will all return the same Problem Details response until the user follows the voderAction.url link and completes the action.quoteId from the results before calling voder_get_quote. Xero and FreshBooks quote-number matching is partial. ANSWER POLICY: whenever you report quote values or totals, explicitly say they are proposals, not receivables, cash, or committed revenue. PROBLEM-DETAILS ANSWER POLICY (read FIRST — applies whenever this response carries a type field whose value starts with https://voder.ai/problems/): the response is an RFC 9457 Problem Details object — a structured action request, not the normal success carrier. The user needs to take an action; your job is to RENDER that action, not narrate it. Render ONLY these fields, in this order: 1. The title field as a short heading. 2. The detail field as the explanatory sentence, VERBATIM. 3. A SINGLE markdown hyperlink in the exact form [voderAction.label](voderAction.url) — substitute the literal voderAction.label string as the link text and the literal voderAction.url string as the target. This is the button the user clicks. 4. The voderAction.hint field as a brief framing sentence below the link, VERBATIM. DO NOT surface ANY of the following fields to the user — they are internal metadata and have no meaning to a non-developer: status (an HTTP-shape integer), type (an internal URI), instance (an internal reference). The user must NEVER see "409" or "424" or any URI starting with https://voder.ai/problems/ in your answer. DO NOT narrate or paraphrase the action ("Voder needs you to..." / "The system returned a status code..." / "and gives a 424 with action Connect Voder to Xero at the Voder dashboard"). RENDER the markdown hyperlink so the user can click it directly. DO NOT retry this tool, and do NOT call any other Xero tool to work around the problem — they will all return the same Problem Details response until the user follows the voderAction.url link and completes the action.xero_list_invoices — its apBreakdown carrier already pre-aggregates the answer across all suppliers, splitting approved (AUTHORISED — about to leave the bank) from pendingApproval (SUBMITTED — awaiting your approval). Use THIS tool ONLY when the question names a specific supplier OR when the caller has already identified a ContactID and wants the aged-bucket breakdown for that one supplier. Aged payables report for a specific contact. Shows what we owe them and how overdue.xero_list_invoices — its arBreakdown carrier already pre-aggregates the answer across all customers, including a byContact rollup that names the biggest owers; you do NOT need to walk per-contact aged-receivables calls to assemble it. Use THIS tool ONLY when the question names a specific contact OR when the caller has already identified a ContactID and wants the aged-bucket breakdown for that one contact. Aged receivables report for a specific contact. Shows what they owe and how overdue.accountType (REVENUE, OTHERINCOME, EXPENSE, DIRECTCOSTS, OVERHEADS, CURRENT, FIXED, EQUITY, etc.) — use this to resolve which accounts are revenue-classified, expense-classified, or balance-sheet-classified rather than guessing from the account name. Account names alone are unreliable signals — the same account name can be classified differently across organisations. Always cross-check the accountType before treating a row in a Xero report as revenue, expense, or anything else. Filter to a single accountType to narrow the result set. Default status: 'active' excludes ARCHIVED accounts; pass status: 'all' to include them.isReconciled filter operates on Xero's category-match axis (isReconciled: false mostly returns DELETED historical entries — NOT recent payments). Default returns AUTHORISED (live) lines; status: 'all' includes DELETED for audit. PAYMENT-STATUS ANSWER POLICY (read before answering any 'has X paid / did X pay / has the invoice been paid?' question): Xero shows ONLY reconciled bank activity, so an invoice that is AUTHORISED or has no payments recorded is NOT evidence of non-payment — a payment may have landed in the bank and simply not been matched yet. There are only TWO valid answers to a payment-status question: (1) PAID — when the invoice status is PAID or a reconciled payment exists; or (2) UNKNOWN — when Xero shows AUTHORISED / unpaid / no payments recorded. You MUST NOT answer 'No', 'not paid', 'still unpaid', 'no payment received', or otherwise state the invoice is unpaid — Xero cannot distinguish 'unpaid' from 'paid-but-not-yet-reconciled'. Do NOT lead with 'No'. Instead lead with the UNKNOWN framing, e.g.: "I can't confirm from Xero — the invoice shows AUTHORISED (Xero only sees reconciled payments), so a payment may have arrived but not been matched yet. Check the bank or chase the customer to be sure." Recent payments (last 1-3 days especially) are the common unreconciled case. Each invoice row carries an explicit paymentStatus field (paid or unknown) — use it as the authoritative answer token. PAGINATION ANSWER POLICY (read before answering): this tool paginates the row array. The structural carriers above the row array (where present) are computed SERVER-SIDE across ALL pages — they carry the complete answer to aggregate questions about totals, counts, and per-contact rollups. The row array contains ONLY this page's slice. The pagination envelope at the end of the response carries { page, pageSize, pageCount, itemCount, hasMore } so you can detect when more pages exist. Answer aggregate questions (who, how much, how many) directly from the carrier on page 1; only walk pagination (page: N+1) when the user explicitly asks for per-row detail beyond page 1.xero_list_invoices(contactId, status: 'paid') to confirm payment status. searchTerm performs a case-insensitive substring match across the contact's display name, first name, last name, contact number, company number, email, and account number — so a partial token, an email fragment, or a customer reference all work. Do not retry case variations on a zero result; the match is already case-insensitive — try a different word or check the spelling against the Xero UI. PAGINATION ANSWER POLICY (read before answering): this tool paginates the row array. The structural carriers above the row array (where present) are computed SERVER-SIDE across ALL pages — they carry the complete answer to aggregate questions about totals, counts, and per-contact rollups. The row array contains ONLY this page's slice. The pagination envelope at the end of the response carries { page, pageSize, pageCount, itemCount, hasMore } so you can detect when more pages exist. Answer aggregate questions (who, how much, how many) directly from the carrier on page 1; only walk pagination (page: N+1) when the user explicitly asks for per-row detail beyond page 1.status: 'all' to include DELETED + VOIDED for audit queries. PAGINATION ANSWER POLICY (read before answering): this tool paginates the row array. The structural carriers above the row array (where present) are computed SERVER-SIDE across ALL pages — they carry the complete answer to aggregate questions about totals, counts, and per-contact rollups. The row array contains ONLY this page's slice. The pagination envelope at the end of the response carries { page, pageSize, pageCount, itemCount, hasMore } so you can detect when more pages exist. Answer aggregate questions (who, how much, how many) directly from the carrier on page 1; only walk pagination (page: N+1) when the user explicitly asks for per-row detail beyond page 1.invoiceNumber filter; read the invoiceLookupResult carrier as the structural answer. (B) "Who owes us money?" / "How much do customers owe me?" / "What's outstanding in receivables?" / "How much is overdue?" → call WITHOUT invoiceNumber; read the arBreakdown carrier (it pre-aggregates customer-by-customer with a byContact rollup naming the biggest owers and an overdue split). (C) "What do I owe suppliers?" / "How much is outstanding in bills?" / "What's about to leave the bank account?" / "What's awaiting my approval?" → call WITHOUT invoiceNumber; read the apBreakdown carrier (it splits approved / pendingApproval / combined so the answer distinguishes "about to be paid" from "awaiting your decision"). DO NOT pick this tool when the user names a SPECIFIC customer/supplier and asks for that one party's drill-down — for "how much does Acme owe me?" or "is the Acme bill overdue?", prefer xero_aged_receivables_by_contact / xero_aged_payables_by_contact (cheaper, single Xero call). Use this tool when the answer needs the headline aggregate or per-row detail. List Xero invoices, optionally filtered by contact, invoice number, and status. Most-recent first. Xero invoice status (AUTHORISED, PAID, etc.) reflects what Xero has RECONCILED — for 'did <contact> pay?' an AUTHORISED (unpaid) invoice does not prove non-payment, because a recent payment may have landed but not yet been reconciled in Xero. By default returns only LIVE invoices (DRAFT, SUBMITTED, AUTHORISED, PAID) — excludes DELETED and VOIDED so payment-status answers are not polluted by historical voided entries. Pass status: 'all' to include DELETED + VOIDED for audit queries, or a specific status to narrow further. PAYMENT-STATUS ANSWER POLICY (read before answering any 'has X paid / did X pay / has the invoice been paid?' question): Xero shows ONLY reconciled bank activity, so an invoice that is AUTHORISED or has no payments recorded is NOT evidence of non-payment — a payment may have landed in the bank and simply not been matched yet. There are only TWO valid answers to a payment-status question: (1) PAID — when the invoice status is PAID or a reconciled payment exists; or (2) UNKNOWN — when Xero shows AUTHORISED / unpaid / no payments recorded. You MUST NOT answer 'No', 'not paid', 'still unpaid', 'no payment received', or otherwise state the invoice is unpaid — Xero cannot distinguish 'unpaid' from 'paid-but-not-yet-reconciled'. Do NOT lead with 'No'. Instead lead with the UNKNOWN framing, e.g.: "I can't confirm from Xero — the invoice shows AUTHORISED (Xero only sees reconciled payments), so a payment may have arrived but not been matched yet. Check the bank or chase the customer to be sure." Recent payments (last 1-3 days especially) are the common unreconciled case. Each invoice row carries an explicit paymentStatus field (paid or unknown) — use it as the authoritative answer token. INVOICE-LOOKUP ANSWER POLICY (read before answering any "does invoice <NN> exist / has invoice <NN> been paid?" question): when the caller passes an invoiceNumber filter, the response carries a structural invoiceLookupResult: { invoiceNumber, status: 'not_found' | 'found_paid' | 'found_unpaid' } carrier. Read the carrier as the load-bearing answer token. When invoiceLookupResult.status === 'not_found', the answer is simply "invoice <NN> doesn't exist in this Xero org" — full stop. You MUST NOT hedge with phrases like "the invoice number may be different in Xero", "may belong to another organisation", "the payment hasn't been reconciled yet", or any other plausible-but-wrong explanation that would erode the customer's trust in the answer. The not-found token means the requested invoice number is genuinely absent from this Xero organisation; each question is already s…xero_list_invoices has identified the invoice, e.g. "how was INV-1234 paid?" or "which payments came in this week?". By default returns only AUTHORISED (live) payments — excludes DELETED so payment-status answers are not polluted by reversed payment entries. Pass status: 'all' to include DELETED for audit queries. PAYMENT-STATUS ANSWER POLICY (read before answering any 'has X paid / did X pay / has the invoice been paid?' question): Xero shows ONLY reconciled bank activity, so an invoice that is AUTHORISED or has no payments recorded is NOT evidence of non-payment — a payment may have landed in the bank and simply not been matched yet. There are only TWO valid answers to a payment-status question: (1) PAID — when the invoice status is PAID or a reconciled payment exists; or (2) UNKNOWN — when Xero shows AUTHORISED / unpaid / no payments recorded. You MUST NOT answer 'No', 'not paid', 'still unpaid', 'no payment received', or otherwise state the invoice is unpaid — Xero cannot distinguish 'unpaid' from 'paid-but-not-yet-reconciled'. Do NOT lead with 'No'. Instead lead with the UNKNOWN framing, e.g.: "I can't confirm from Xero — the invoice shows AUTHORISED (Xero only sees reconciled payments), so a payment may have arrived but not been matched yet. Check the bank or chase the customer to be sure." Recent payments (last 1-3 days especially) are the common unreconciled case. Each invoice row carries an explicit paymentStatus field (paid or unknown) — use it as the authoritative answer token. PAGINATION ANSWER POLICY (read before answering): this tool paginates the row array. The structural carriers above the row array (where present) are computed SERVER-SIDE across ALL pages — they carry the complete answer to aggregate questions about totals, counts, and per-contact rollups. The row array contains ONLY this page's slice. The pagination envelope at the end of the response carries { page, pageSize, pageCount, itemCount, hasMore } so you can detect when more pages exist. Answer aggregate questions (who, how much, how many) directly from the carrier on page 1; only walk pagination (page: N+1) when the user explicitly asks for per-row detail beyond page 1.cashPosition carrier (described below) pre-computes the answer; you should pick THIS tool first for any cash-position question and read the carrier rather than walking the chart of accounts yourself. Trial balance report as at a specific date. For 'how much cash do we have right now' questions, use the structural `cashPosition` carrier — DO NOT infer the sign from Xero's `Debit`/`Credit` column labels. The carrier shape is cashPosition: { accounts: [{accountId, name, signedAmount, currency}], totals: [{currency, signedAmount}] }. signedAmount uses the customer's perspective: positive = money the customer HAS in the bank, negative = overdraft / amount owed to the bank. Read cashPosition.totals directly to answer the cash-position question (one entry per currency for multi-currency organisations). The raw trial-balance report continues to be returned alongside for general-purpose questions, but the credit/debit column orientation in that raw report is NOT a reliable signal for cash position — cashPosition.totals is the authoritative answer token. EMPTY-OR-ZERO CARRIER POLICY (read before answering any cash-position question): when cashPosition.totals is an empty array (no bank accounts found on the chart of accounts), the answer MUST say "no bank accounts are connected on the chart of accounts — open the Xero dashboard or ask your finance team to confirm the bank feed is connected" — DO NOT fabricate a dollar figure. When cashPosition.totals carries one or more entries but every entry's signedAmount === 0 AND every account in cashPosition.accounts has signedAmount === 0, the answer MUST say "all bank accounts on the chart of accounts have a zero balance as at this date — open the Xero dashboard to confirm the trial-balance report ran for the right date" — again, DO NOT fabricate a dollar figure. You MUST NOT invent, estimate, or approximate any cash amount when the carrier is empty or all-zero; the only valid responses are the two phrasings above. A non-zero signedAmount on any account is the only signal that licenses a numeric cash answer.App Stats
48
Tools
ChatGPT
Platforms
Category
Tax CalculationsWorks with
Similar Apps
Data refreshed daily