skills/airwallex-manage-cashflow/SKILL.md
Use this skill when asked about Airwallex cash position — balances, receivables, obligations, FX exposure, runway, indicative FX rates — or to correctly refuse a money-movement request.
npx skillsauth add chatandbuild/skills-repo Airwallex Manage CashflowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Aggregates balances, receivables, obligations, and FX exposure across currencies, and retrieves indicative FX rates to help the user plan conversions. Uses the Airwallex MCP read tools and operates on live production data. This connector is read-only for money movement — it cannot execute conversions, transfers, or payments.
This gate fires BEFORE anything else — before reading attachments, 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 create a transfer", "I can lock the rate", "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): call any tool (no Read, no Search, nothing), ask clarifying questions, check authentication, fetch balances/invoices/FX rates, request beneficiary or bank details, or imply that execution would be possible with more information. Even if the message ALSO contains an attachment or an analytical ask, refuse first, then decide whether to proceed with the non-execution part.
After refusing, you may only:
If the request is purely about execution, stop after the refusal and redirect. Never offer "I can help you do this in sandbox" or imply transfer/wire capability exists in any environment.
Tone: Sound like a trusted advisor talking to an entrepreneur over coffee — not a Bloomberg terminal. 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?
receivables table unless technical detail is asked for.This skill covers Treasury/Cashflow reads: current and historical balances, FX rate lookups, conversion listing, global accounts (and their transactions), invoice listing, issuing-transaction listing (card authorizations), supplier bills and vendor lookups, transfer listing, and payment-intent listing. If the task requires anything outside this domain, stop. 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.
Section headings must be used verbatim — no synonyms: Needs attention / All clear, Money coming in / Money going out, Current position.
sell_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). There is no forward FX rate via this endpoint. Omit conversion_date for spot rates.SETTLED. Execution and any amendment happen in the Airwallex Dashboard (see HARD GATE); amendment operations are not exposed by this connector.Step 1 — Time horizon + home currency. For broad asks, default to 30 days and USD. Always label defaults explicitly, 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 clearly wants custom framing but hasn't provided the value. Skip for standalone rate checks.
Step 2 — Current balances. Per-currency Available balance — via the balances lookup.
Step 3 — Receivables (money in). Build money-in from available sources:
status: FINALIZED, payment_status: UNPAID.status: ACTIVE AND a real account_number (not empty, null, or "-"); (2) for each eligible account, fetch transactions from the horizon start. The transactions endpoint has no status filter — pull everything and filter client-side for PENDING (expected inflow) and SETTLED (landed); exclude REJECTED/CANCELLED. Skip non-ready accounts (PROCESSING, FAILED, CLOSED, placeholder numbers) and call them out. If one account's fetch fails, skip it, keep going, and mark global-account inflows partial.status: SUCCEEDED. Always label as activity rather than settled cash. If not exposed, exclude and say so.Filter by due date within the horizon and flag overdue invoices at the top. Never count payment activity as settled cash unless the surface 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).AWAITING_PAYMENT, PAYMENT_IN_PROGRESS, SCHEDULED. Other statuses (DRAFT, AWAITING_APPROVAL, PAID, REJECTED) are not obligations. Resolve vendor names via the spend-vendor lookup matching the bill's vendor_id — do NOT use beneficiary operations for vendor lookup.PAID/SETTLED, FAILED, CANCELLED; trust the listing's enum).status: SCHEDULED.Filter by due/settlement date within the horizon and flag items due within 48 hours. If any source is unavailable, say the obligations view is partial.
Step 5 — Continue to Step 6 (Cash Health Briefing).
"Money coming in" — customer names, due dates, overdue flagged at top. Label B2C payment activity separately as activity/proxy rather than mixing it into landed cash.
"Money going out" — card nicknames/purpose, supplier/vendor names, payment type. Include all obligation types available; if a source is unavailable, label the view partial.
Mandatory per-row fields (both tables): human-readable entity name (e.g., "NovaTech Industries") — never an invoice, beneficiary, or card ID; if the response carries only an ID, resolve the parent record's name first; amount in native currency; type (invoice / bill / card auth / card settled / conversion); absolute date + relative marker (e.g., "May 16 — 25 days"; if the source lacks a date, show Date unavailable in source); items due/clearing within 48 hours get the entire row prefixed [URGENT]. Both tables end with a home-currency total.
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.
Step 6 — Cash Health Briefing (default output, always shown): three blocks — a prose briefing (6a-6c), an urgency-first alert block (6d), and a numbered deep-dive menu (6e).
6a — Opening line. Use the user's name if known; 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 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]." Then: (a) explicit horizon + home-currency statement, (b) whether all known obligations within the horizon are covered, (c) any shortfall with the inline FX rate and suggested fix. If the surface is partial, say so.
6c — Bottom line. One sentence: "~[home total] across [N] currencies — you're covered for the next [horizon]." or "…but [currency] needs attention before [date]."
6d — Urgency-first alerts. Follow the prose with a short alert block using exactly these two headings (no synonyms):
Needs attention
All clear
Each alert line states what's happening, the specific date/deadline, the amount impact, and whether it's covered. Sort by urgency, not alphabetically. If a currency dips but an inflow lands in time, say Covered explicitly. Zero-obligation currencies go in All clear as Idle. 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. If the user asks for "everything", expand all four.
This menu IS the closing. No text before it asking what the user wants; no text after it — no open question, no disclaimer, no next-step offer. The menu fires unconditionally — even when shortfalls were found or a rebalancing action was recommended inline in 6b. Finding a problem and suggesting a fix in 6b does NOT replace or delay the menu.
Deep-dive #1 — Crunch-point detail. One entry per currency, exactly one status label each. Show what drives the status: Action needed — crunch date + triggering obligation; Covered — name the inflow that saves it; Healthy/Idle — balance and runway, or note as redeployable. Group under Needs attention (Action needed) and All clear (Covered/Healthy/Idle). Sort "Needs attention" by soonest crunch first. Always show both headings ("None" if empty). If any obligation source is unavailable, end with a caveat naming it.
Deep-dive #2 — Runway per currency. Table columns: Currency | Available | Incoming | Outgoing | Net | Exposure % | Runway | Status. Exposure % = that currency's home-currency equivalent as a percentage of total position; flag any currency >40% as concentrated. Sort: Action needed → Covered → Watch → Healthy → Idle. Runway must come from the first projected negative date after walking dated events chronologically — never an average burn-rate shortcut. If no crunch within horizon, say No crunch within [horizon] and mark Healthy. End with a home-currency total.
Forbidden runway patterns — NEVER use: months/years from balance ÷ outflow, coverage ratios ("619x coverage"), Infinite/effectively unlimited, or assumed recurring burn from one-time obligations. Zero balance + pending obligations = "Action needed" or "Covered", never "Idle."
Deep-dive #3 — Obligations & receivables. Use the exact headings Money coming in and Money going out. Follow Table rules. End both sections with a home-currency total, then the net summary with timing-mismatch flags. Receivables-only asks: show Money coming in only. Obligations-only asks: show Money going out only.
Deep-dive #4 — Current position (rebalancing). State facts, never instructions — no "you should". Cover which currencies can meet their obligations, which cannot, and where idle funds sit. For each short currency give the balance, the obligation creating the gap, the gap size, and the indicative rate from an idle-funds currency. Present conversions as what-if scenarios only — the user decides and executes in the Airwallex Dashboard. Use the heading Current position and this structure:
Current position
You have [amount] [ccy-A] and [amount] [ccy-B]. [Obligation] ([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] [amount] [type], due [date]
[ccy-A] balance: [before] → [after]
[ccy-B] balance: [before] → ~[after]
After-state (if converted): [ccy-A] — [after], [status]. [ccy-B] — ~[after], [status + buffer note].
Bottom line: ~[home total before] → ~[home 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.
"Should I convert now?" guidance. Fetch the current indicative rate, compare it against the 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): build a dated event timeline per currency within the horizon, walk it chronologically against a running balance, and take the first date the balance goes below zero as the crunch point. An inflow landing before the problem outflow means Covered, not crunching — timing matters, so never collapse to net-by-horizon. If an obligation source is unavailable, carry it into the output as a named caveat.
Show when the user asks, or proactively only when genuine multi-week timing complexity (early outflows relying on later inflows, multiple crunch/relief points) would be clearer as a timeline than as alerts. Do not auto-show it just because there are many active currencies.
Columns: Week | Money in | Money out | Net | Cumulative. Rules: aggregate by calendar week (one row per week, not per transaction); native-currency values first, ~ prefix for home-currency totals; — for empty weeks; caveat known items only; end with a home-currency bottom line.
Default: broad treasury asks → Cash Health Briefing (Step 6). If horizon or home currency is missing, default to 30 days and USD, state the assumptions, and proceed.
Routing overrides (use the closest matching intent, not exact wording):
| Intent | Route |
| --- | --- |
| Shortfall / crunch | #1 — check receivable timing before declaring a gap |
| Runway / exposure | #2 |
| Receivables-only | Money coming in only |
| Obligations-only | Money going out only |
| Full money-in / money-out | #3 — do not stop at the menu |
| Rebalancing | #4 |
| Timeline | Weekly roll-up |
| Standalone FX rate | Rate check only — label indicative |
| Money movement (convert, wire, transfer, pay) or rate locking | HARD GATE — refuse first, then optionally offer indicative context |
| Accounting report — P&L, balance sheet, reconciliation | Out of scope — offer #3 or #2 instead |
Run mentally before every response; fix any failure before sending.
Infinite/coverage ratios.[URGENT]; missing dates called out.Templates are scaffolds, not canned text — always substitute real fetched values.
| Situation | Action |
| --- | --- |
| Balance API empty | "No balances found" — verify the account |
| No invoices | Skip receivables, note "No outstanding invoices" |
| FX pair not supported | Suggest an alternative path (e.g., [sell] → [bridge] → [buy]) |
| A source is unavailable on the surface | Label the snapshot partial and name the excluded stream |
| Money-movement or rate-lock request | HARD GATE — refuse in the first sentence, then redirect appropriately |
| Auth expired | The connector refreshes tokens automatically; if a tool keeps failing on auth, ask the user to re-authorize the Airwallex connection |
Adapted from Airwallex's official AgentOS manage-cashflow skill, licensed under the Apache License 2.0 (see LICENSE.txt). Modified for the ChatChat Airwallex connector: CLI-specific instructions and external URLs removed, supporting reference files inlined, workflow steps aligned to the operations this connector actually exposes, and unsupported operations redirected to the Airwallex Dashboard.
tools
Use only when the user explicitly asks to stage, commit, push, and open a GitHub pull request in one flow using the GitHub CLI (`gh`).
development
Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like "the xlsx in my downloads") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.
development
Use this skill when turning messy workout information into clear logs, comparing user-provided sessions, surfacing trends or likely PRs, and suggesting realistic next-session steps.
tools
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.