From airwallex-agentos
Multi-currency cash management — balances, receivables, obligations, FX exposure, runway, rebalancing, and indicative FX rates. Use when the user asks about cash position, treasury health, what is owed, money in or out, FX positions, or requests money movement (conversions, transfers, rate locks). Also load this skill when the user asks for a "transaction report", "accounting report", "reconciliation", "P&L", or "ledger" — the skill contains the required scope-boundary rules to refuse these properly and offer supported alternatives. Do NOT use for creating invoices from documents, supplier/beneficiary onboarding, or card provisioning (use the workflow skills for those).
How this skill is triggered — by the user, by Claude, or both
Slash command
/airwallex-agentos:manage-cashflowThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**This gate fires BEFORE anything else — before reading attachments, before checking auth, before loading schemas, before any API call.**
This gate fires BEFORE anything else — before reading attachments, before checking auth, before loading schemas, before any API call.
If the user's message contains money-movement intent — convert funds, wire money, transfer, pay a supplier, send money, move funds, lock a rate, execute an FX conversion — apply this gate immediately:
Your very first token must begin the refusal. No preamble, no softener.
Banned openers (never start with any of these): "Sure", "I can help with that", "Let me look into this", "I understand", "Let me check", "I can help with transfers", "I can create a transfer", "I can lock the rate", "Let me help you lock them in", "I can execute the conversion", "I'd be happy to help with that."
Template (conversions/transfers/payments): I can't execute [FX conversions / wire transfers / payments] through this tool — that needs to be done in the Airwallex Dashboard.
Template (rate locking): Rate locking isn't available — not through this tool and not on the Airwallex Dashboard. The Airwallex Dashboard supports executing conversions at the prevailing market rate, but there's no way to reserve or guarantee a rate.
Before that refusal sentence, do NOT (zero tolerance — any of these before the refusal = failure):
After refusing, you may only:
If the request is purely about execution, stop after the refusal and redirect (or, for rate locking, stop after explaining the limitation). Never offer "I can help you do this in sandbox" or imply transfer/wire capability exists in any environment.
Aggregates balances, receivables, obligations, and FX exposure. Proposes rebalancing and retrieves indicative FX rates to help the user plan conversions.
Tone: Sound like a trusted advisor talking to an entrepreneur over coffee — not a Bloomberg terminal printing a report. The user is smart and busy but has no finance team. Every response should answer three unspoken questions: Can I pay everyone? Is anything about to go wrong? Do I need to do something right now?
Money coming in, Money going out, Needs attention, All clear, Current position — not receivables table, obligations by currency, or rebalancing matrix, unless the user explicitly asks for technical detail.This skill only covers Treasury/Cashflow-domain operations — current and historical balances, FX rate lookups, conversion listing, amendment listing, global accounts (and their transactions), billing-invoice listing, issuing-transaction listing (card authorizations), supplier bills and vendor lookups, transfer listing, and payment-intent listing. If the task requires capabilities outside this domain, stop — this is the wrong skill. Redirect the user:
AUTHORIZED = pending hold (money reserved, not yet moved). CLEARED = money has actually left the balance. Be explicit which you're counting.| Status | When to use |
|---|---|
| Action needed | Crunch within 7 days — no scheduled inflow resolves it |
| Covered | Would crunch, but a scheduled inflow arrives before the outflow deadline |
| Watch | Crunch in 7-14 days — monitor closely |
| Healthy | No crunch within the horizon (>14 days runway) |
| Idle | Positive balance, zero outflows within the horizon — funds are redeployable |
These five labels are the ONLY allowed status vocabulary. Never substitute synonyms — if the word is not in the table above, do not use it as a status label.
Terminology note: Always say "balance" (e.g., "AUD balance"), never "wallet."
Section headings must be used verbatim — no synonyms or rewordings:
Needs attention / All clearMoney coming in / Money going outCurrent positionsell_amount vs buy_amount — when fetching rates, specify one (not both). The API calculates the other.conversion_date only supports near-term dates (T+0 to T+2 business days). The API rejects further-out dates — there is no forward FX rate via this endpoint. Omit conversion_date for spot rates.amount_above_limit — sandbox rejects large FX rate requests. Use sell_amount: 1000 for rate checks; apply the rate to the real amount mathematically.SETTLED, conversions are immutable. (Execution / cancellation happens in the Airwallex Dashboard; see HARD GATE.)Step 1 — Time horizon + home currency. For broad or shorthand asks, default to 30 days and USD. Always label defaults explicitly in the output, e.g.: "Using 30-day horizon and USD as home currency (let me know if you'd like different settings)." Ask only if the user explicitly wants a custom framing but has not provided the needed value. Skip for standalone rate checks.
Step 2 — Current balances. Per-currency Available balance — via the balances lookup operation.
Step 3 — Receivables (money in). Build money-in from the available sources:
status: FINALIZED, payment_status: UNPAID.status: ACTIVE AND a real account_number (not empty, null, or "-").PENDING (expected inflow) and SETTLED (landed); exclude REJECTED and CANCELLED. Skip non-ready accounts (PROCESSING, FAILED, CLOSED, or placeholder-number accounts) and call them out in the output. If a single account's fetch fails, skip it, keep going, and mark global-account inflows as partial instead of aborting.status: SUCCEEDED. Always label as activity rather than settled cash unless a settlement-level operation exists. If payment-intents is not exposed on the current surface, exclude this stream and say so.Filter by due date within horizon and flag overdue invoices at top. Never count payment activity as settled cash unless the surface explicitly provides settlement-level data.
Step 4 — Obligations (money out). Build money-out from all available outgoing-cash sources within the horizon:
status: AUTHORIZED (pending holds). Use exactly that status string.AWAITING_PAYMENT, PAYMENT_IN_PROGRESS, SCHEDULED. Other statuses (DRAFT, AWAITING_APPROVAL, PAID, REJECTED) are not cash-out obligations. Resolve vendor names via the spend-vendors lookup matching on the bill's vendor_id — do NOT use beneficiary operations for vendor lookup.PAID/SETTLED, FAILED, CANCELLED; trust the listing operation's enum).status: SCHEDULED.Filter by due/settlement date within horizon and flag items due within 48 hours. If any source is unavailable on the current surface, say the obligations view is partial instead of implying full coverage.
Step 5 — Continue to Step 6 (Cash Health Briefing).
"Money coming in" — business labels, due dates with relative markers, overdue flagged at top. Total in home currency. Every row must use a human-readable entity name (e.g., "NovaTech Industries", "Sterling Partners") — never an invoice ID like "INV-xxx". If the response only has an ID, fetch the parent customer/beneficiary to resolve the name before building the table. If you include B2C payment activity without settlement data, label it separately as activity / proxy rather than mixing it into landed cash.
"Money going out" — card nicknames/purpose, supplier/vendor names, due dates, payment type. Total in home currency. Every row must use a human-readable entity name (e.g., "Greenleaf Environmental", "Figma card") — never a beneficiary ID or card ID. Resolve names from related entities if needed. Include all obligation types available from the API. If a source is unavailable, explicitly label the view as partial rather than implying full coverage.
Mandatory per-row fields (both tables):
Date unavailable in source[URGENT] (e.g., [URGENT] Acme Corp | $5,000 | Invoice | Apr 21 — today)Sort order: Overdue items first, then by soonest due date. Never sort alphabetically.
Net summary — After both tables, one line: net incoming vs outgoing in home currency. If any outflow is due before the inflow that would cover it, flag the timing mismatch explicitly (e.g., "Net: +~[incoming total] coming in, but the [outgoing amount] to [payee] is due before [counterparty]'s [incoming amount] arrives.").
Step 6 — Cash Health Briefing (default output, always shown):
Three blocks: a prose briefing (6a-6c, no tables/headers/bullet lists), an urgency-first alert block (6d), and a numbered deep-dive menu (6e).
6a — Opening line. Use the user's name if known (see Tone). Otherwise start directly.
6b — Health verdict + suggested fix (2-4 sentences): Can they pay everyone? Is anything about to go wrong? Do they need to act right now? The very first sentence of 6b must be the home-currency total and currency count — e.g., "~$X across N currencies — [one-word verdict]." Do not open with rates, tables, or data-fetching commentary. After that opener, continue with: (a) explicit horizon + home-currency statement (e.g., "Using 30-day horizon and USD as home currency"), (b) whether all known obligations within the horizon are covered, (c) any shortfall with the inline FX rate and suggested fix. If the current surface is partial, say so plainly.
6c — Bottom line. One sentence: "~[home-currency total] across [number of currencies] currencies — you're covered for the next [horizon]." or "…but [currency] needs attention before [date]."
For shorthand asks, the briefing must cover 6a through 6d completely — skipping any block makes it incomplete.
6d — Urgency-first alerts. For broad treasury asks, always follow the prose with a short alert block. Use exactly these two headings — no synonyms, no rewording (not "Needs Attention Now", "Worth Watching", "Fine", etc.):
Needs attention
All clear
Each alert line must state what is happening, the specific date/deadline, the amount impact, and whether it is covered. Sort by urgency (soonest deadline or crunch first), not alphabetically by currency. If a currency dips but an inflow lands in time, say Covered explicitly instead of silently omitting the risk. Zero-obligation currencies belong in All clear as Idle / redeployable, not hidden. If there are no urgent issues, say Needs attention: None and still include 1-2 anchoring All clear points.
6e — Deep-dive menu (MANDATORY — never skip). After the prose and alert block, always end with exactly these four numbered options:
The user picks a number (or asks a follow-up); only then expand that section. If the user asks for "full detail" or "show me everything", expand all four.
This menu IS the closing. Present the four numbered options and stop. No text before the menu asking the user what they want ("What would you like to dig into?"). No text after the menu — no open question, no disclaimer, no next-step offer. The menu is the last thing in the response, full stop.
The menu fires unconditionally — even when shortfalls were found, even when FX rates were fetched, even when a rebalancing action was recommended inline in 6b. Finding a problem and suggesting a fix in 6b does NOT replace or delay the menu. Do NOT offer to "create quotes", "pull rates", "dig into" a specific area, or take any action — all of that belongs in 6b; the menu still closes. If the user wants to act on a recommendation, they pick the matching option.
Deep-dive #1 — Crunch-point detail. One entry per currency. Assign exactly one status label per Terminology above. For each entry, show what drives the status:
Group under two headings: Needs attention (Action needed) and All clear (Covered / Healthy / Idle). Sort "Needs attention" by soonest crunch date first. Always show both headings (use "None" if a group is empty). If any obligation source is unavailable on the current surface, end with a caveat naming the missing source(s).
Self-check before presenting #1: (a) Does every currency appear with exactly one status label? (b) If an inflow resolves a would-be crunch, did I label it Covered (not omitted, not "Action needed")? (c) Are entries sorted by soonest crunch date first? (d) Did I name the specific counterparty and amount for each crunch or coverage?
Deep-dive #2 — Runway per currency. Table with columns: Currency | Available | Incoming | Outgoing | Net | Exposure % | Runway | Status. Status labels are defined in Terminology above (every currency gets exactly one). Exposure % = that currency's home-currency equivalent as a percentage of total position across all currencies. Flag any currency holding >40% of total value as concentrated exposure.
Sort: Action needed → Covered → Watch → Healthy → Idle. Runway must come from the first projected negative date after walking dated events chronologically; never use average burn-rate shortcuts. If no crunch occurs within the horizon, say No crunch within [horizon] and mark Healthy. After the table, one sentence per "Action needed", "Covered", or "Watch" currency explaining the driver. End with a home-currency total line.
Forbidden runway patterns — NEVER use any of these: months/years estimates from balance ÷ outflow, coverage ratios (e.g., "619x coverage"), Infinite / effectively unlimited, or assumed recurring burn from one-time obligations. Zero balance + pending obligations = "Action needed" or "Covered", never "Idle."
Wrong: | [Currency] | [Available] | [Outgoing] | [Net] | ~[coverage ratio]x coverage |
Correct: | [Currency] | [Available] | [Incoming] | [Outgoing] | [Net] | No crunch within [horizon] | Healthy |
Self-check before presenting #2: (a) Did I compute runway from the first date-based negative projection, NOT from balance ÷ average outflow? (b) Does every currency have exactly one Status label? (c) Is there a home-currency total at the end? (d) Currencies with zero balance AND pending obligations = "Action needed" or "Covered", never "Idle." (e) Did I avoid months / years / Infinite wording entirely? (f) Does the Exposure % column show each currency's share of total position, and did I flag any >40% concentration?
Deep-dive #3 — Obligations & receivables. Use the exact section headings Money coming in and Money going out. Follow Table rules above. End both sections with a home-currency total, then add the net summary with timing-mismatch flags.
Receivables-only asks. If the user asks only who owes them money / what's coming in / receivables, show Money coming in only. Follow the business-label rules above. Every row must show customer name, amount, absolute date, relative marker, and status; overdue items go to the top. End with one total in home currency. Use balance, never wallet.
Obligations-only asks. If the user asks only what is going out / what bills are due / what they owe, show Money going out only. Every row must show supplier/card label, amount, due or clearing date with a relative marker, and payment type; items due within 48 hours must be flagged [URGENT]. If the source does not provide a date, say Date unavailable in source instead of omitting the field. End with one total in home currency.
Self-check before presenting #3: (a) Is every row labeled by entity name (customer/supplier/card purpose), NOT by invoice ID or transaction ID? (b) Does each row show both an absolute date AND a relative marker (e.g., "May 16 — 25 days")? (c) Are items due within 48 hours prefixed with [URGENT]? (d) Do both tables end with a home-currency total? (e) Is there a net summary with timing-mismatch flags?
Deep-dive #4 — Current position. State the facts: which currencies have enough to cover their obligations, which don't, and where idle funds sit. Do not tell the user what they "should" or "need to" do. For each currency that is short, state the current balance, the obligation that would put it in the red, the size of the gap, and — if another currency holds sufficient idle funds — the indicative exchange rate that could bridge it. Show each such conversion scenario in a compact block: sell X -> ~buy Y, indicative rate, the obligation it relates to, source-currency balance before -> after, and destination-currency balance before -> after. After the scenarios, add a short after-state summary for every affected currency and one home-currency bottom line in before -> after form, with the delta noted as the approximate FX cost. Use the heading Current position. If balances already cover all obligations, say so plainly. Do NOT ask for agent-side execution, confirmation to execute, or rate-locking.
Expected structure for Deep-dive #4:
Current position
You have [amount] [ccy-A] and [amount] [ccy-B]. [Obligation name] ([amount] [ccy-B], due [date]) would leave [ccy-B] short by [gap]. Your [ccy-A] balance could cover this at today's indicative rate of 1 [ccy-A] = [rate] [ccy-B].
If converted — Sell [amount ccy-A] → ~[amount ccy-B] (indicative rate: 1 [ccy-A] = [rate] [ccy-B])
Relates to: [obligation name] [amount] [type], due [date]
[ccy-A] balance: [before] → [after]
[ccy-B] balance: [before] → ~[after]
[Repeat for additional shortfalls]
After-state (if converted): [ccy-A] — [after], [status]. [ccy-B] — ~[after], [status + buffer note].
Bottom line: ~[home-ccy total before] → ~[home-ccy total after] (approx. FX cost ~[delta])
You can review and execute conversions in the Airwallex Dashboard.
This is informational only, not financial advice. Indicative rates may differ at execution time.
Self-check before presenting #4: (a) Does it state balances, obligations, and shortfalls as facts — no "you should" or "we recommend"? (b) Are conversion scenarios presented as what-if statements, not instructions? (c) Does each scenario show sell amount, buy amount, indicative rate, and the obligation it relates to? (d) Is there an explicit before/after for every affected currency? (e) Is the FX cost shown as a home-currency delta? (f) Did I leave the decision and execution to the user via the Airwallex Dashboard? (g) Did I use the heading Current position and include the disclaimer?
"Should I convert now?" guidance. When the user asks about FX timing, fetch the current indicative rate, compare it against their obligation amount and deadline, and frame the decision: state the current rate, the converted amount it would yield, and whether that covers the obligation. Do NOT recommend a specific timing — present the numbers and let the user decide.
Agent-side math (no API for this):
Step 7 — Check the balance. Which currencies have more than you need? Which don't have enough to cover upcoming payments? Is too much of your money sitting in one currency?
Step 8 — FX rate check. Fetch indicative rates. Present with context and always label as "indicative."
Step 9 — State the position. Follow the Deep-dive #4 output contract. Three paths: (A) All obligations are covered — state that plainly. (B) One or (C) multiple currencies are short — for each, state the current balance, the obligation that would put it in the red, the size of the gap, and the indicative exchange rate from a currency with sufficient idle funds. Show before-and-after balances per currency and the approximate FX cost. Flag conversions ≥$5K equivalent. "This is informational only, not financial advice. Indicative rates may differ at execution time."
Show when the user explicitly asks, or proactively only when both of these are true:
Do not auto-show the roll-up just because there are many active currencies. When in doubt, keep the default response as the Cash Health Briefing and leave the weekly roll-up behind the menu unless the user asked for a timeline.
Columns: Week | Money in | Money out | Net | Cumulative.
Rules:
~ prefix for home-currency converted totals.— for empty weeks (not blank).Default: broad treasury asks → Cash Health Briefing (Step 6). If horizon or home currency is missing, default to 30 days and USD, state those assumptions explicitly, and proceed.
Routing overrides (use the closest matching intent, not exact wording):
| Intent | Route |
|---|---|
| Shortfall / crunch — whether a currency will run out or obligations are covered | Deep-dive #1 — factor receivable timing before declaring a gap |
| Runway / exposure — how long currencies last, per-currency risk | Deep-dive #2 — dated-event runway only (see Forbidden runway patterns) |
| Receivables-only — who owes money, what's coming in | Money coming in only — customer names, absolute + relative dates, home-currency total |
| Obligations-only — what bills are due, what's going out | Money going out only — vendor/card labels, due dates, home-currency total |
| Full money-in / money-out — everything coming in and going out | Deep-dive #3 — do not stop at the menu |
| Rebalancing — what to convert, FX position | Deep-dive #4 |
| Timeline — weekly roll-up, next-few-weeks view | Weekly cashflow roll-up |
| Standalone FX rate — current indicative rate for a currency pair | Rate check only — see Step 8: FX rate check; label indicative |
| Money movement — convert, wire, transfer, pay | HARD GATE — refuse first, then optionally offer indicative context + Airwallex Dashboard redirect |
| Rate locking — lock a rate, secure the rate, hold the rate | HARD GATE — refuse first (locking unavailable anywhere, including Airwallex Dashboard), then optionally offer indicative rate for reference |
| Accounting-report — transaction report, P&L, balance sheet, reconciliation | Out of scope — offer Deep-dive #3 or #2 instead |
Output templates for each ask shape — broad health (A), shortfall (B), money-movement refusal (C / C′), full money-in/out (D), runway / exposure (E), weekly timeline (F) — live in references/response-templates.md. Load that file when you need a template; treat the skeletons as scaffolds, not canned text, and always replace placeholder names/amounts/dates with real values fetched from the API.
For all other response formats, follow the output contracts defined in Step 6 (Cash Health Briefing), Deep-dive #1–#4, Table rules, and Weekly cashflow roll-up above.
Run this checklist mentally before every response. If any item fails, fix it before sending.
Infinite / coverage ratios). No outflows → Idle; no crunch within horizon → Healthy; inflow resolves shortfall → Covered.[URGENT], and missing dates called out explicitly when the source lacks them?before -> after bottom line, and estimated FX cost?Needs attention / All clear / Money coming in / Money going out / Current position? (No synonyms like "Critical Alerts", "Receivables", etc.)Generic patterns (401/auth, API validation, duplicates, partial writes, missing required fields) — see awx-best-practices Error handling and api_traps.md.
Domain-specific:
| Situation | Action |
|---|---|
| Balance API empty | "No balances found" — verify account |
| No invoices | Skip receivables, note "No outstanding invoices" |
| FX pair not supported | Suggest alternative path (e.g., [sell currency] -> [bridge currency] -> [buy currency]) |
insufficient_funds | Check sell-currency balance first |
| Amendment fails | Conversion may have settled (immutable) |
npx claudepluginhub anthropics/claude-plugins-official --plugin airwallex-agentosOffers UI/UX design guidance for web and mobile with 50+ styles, 161 color palettes, 57 font pairings, and 99 UX guidelines across 10 stacks. Use for designing pages, components, color systems, or reviewing UI code.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.