From airwallex-agentos
Provision virtual or physical corporate cards in Airwallex Issuing — create cardholders, issue cards with spend limits, and manage card spending. Use when the user says "create a card for", "spin up a virtual card", "set up a card for Adobe", "provision a card", or needs to manage corporate card spending. Do NOT use for bank transfers, creating invoices, or checking FX rates.
How this skill is triggered — by the user, by Claude, or both
Slash command
/airwallex-agentos:card-provisioningThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Creates virtual or physical corporate cards in Airwallex Issuing — one workflow to set up a cardholder, issue a card with spend limits, and optionally manage ongoing spend.
Creates virtual or physical corporate cards in Airwallex Issuing — one workflow to set up a cardholder, issue a card with spend limits, and optionally manage ongoing spend.
Tone: The target user is a busy entrepreneur, not a finance analyst. Keep language conversational and action-oriented — say "Your Adobe card is set up with a $50/month limit" rather than "Card ID card_xxx created with authorization_controls.transaction_limits.limits[0].amount = 50.00." Show business labels (card nicknames, cardholder names) first; keep raw IDs and technical details in the background unless the user asks for them.
This skill only covers Issuing-domain operations (cards, cardholders, issuing-transactions). If the task requires anything outside that domain, stop — this is the wrong skill. Redirect the user:
AUTHORIZED ≠ money moved. It's a hold. CLEARED = money left. Be explicit when reporting.form_factor, currency, interval, or program purpose, ASK ONCE for shared defaults before creating. Process rows sequentially — never in parallel.card_abc or cardholder_xyz. If you only have a name or label, look up the real UUID first.created_by — full legal name of the person requesting the card, not the cardholder. Ask the user if unspecified.is_personalized — VIRTUAL → false, PHYSICAL → true. Ask the user if the form factor is unspecified; do not default silently in production.MULTIPLE vs MULTI, program wrapper vs flat fields, authorization_controls nesting) are catalogued in api_traps.md.allowed_categories. Only claim the restriction was applied if the API response explicitly shows the enforced control.individual.address uses country (not country_code); individual.express_consent_obtained is the string "yes" (not boolean true). Ask the user for DOB, address, and email — never fabricate.postal_address or delivery_details — if either is wrong after creation, close and re-issue. Two valid paths at create time: (a) cardholder has a registered postal_address and card create uses it by default; (b) pass postal_address directly on card create to override. For EXPRESS shipment (or any China destination), delivery_details.mobile_number (E.164) is required. Always confirm the address with the user.INACTIVE — activate after delivery via the card-activate operation.status: AUTHORIZED to see pending holds.cards spending endpoint — list transactions per card (filter by card_id) and sum in post-processing. Use cursor pagination on issuing-transactions.Step 1 — Understand the card request. Collect: purpose/nickname, cardholder (name + email), card type (Virtual/Physical), currency, spend limit (amount + interval), and any requested merchant restriction (MCC support is unconfirmed — see constraints above).
If the user gives a natural-language request like "Create a virtual card for Adobe, $50.00/month", extract what you can and ask for gaps (e.g., "Who should this card be assigned to?").
If the user provides a document (spreadsheet, PDF, email, list) with card specifications, extract each person's currency, limit, form factor, and other details AS WRITTEN in the document — do NOT normalize currencies or limits to a single default. Present the extracted table for confirmation before proceeding. This is the same principle as beneficiary-creation (extract bank details as-is) and contract-to-billing (show extracted data in tables).
Step 2 — Build card spec table. For a single card, present:
| Field | Value |
|---|---|
| Purpose / Nickname | (e.g., Adobe Subscription) |
| Cardholder | (e.g., Jane Doe, [email protected]) |
| Form factor | VIRTUAL / PHYSICAL |
| Currency | (e.g., USD) |
| Spend limit | (e.g., $50.00/month) |
| MCC restriction | All merchants (unconfirmed — see constraints) |
| Personalized | No (virtual) / Yes (physical) |
For a batch request (multiple cards from a document or list), list cardholders BEFORE building the table so you can show cardholder match results inline. Then present a full extraction table with per-row status:
| # | Name | Currency | Limit/mo | Cardholder | Status | Issue | |
|---|---|---|---|---|---|---|---|
| … | (as extracted) | (as extracted) | (as extracted) | (as extracted) | ✅ Exists / ❌ New | ✅ Ready / ❌ Blocked / ⚠️ Dup | (specific reason) |
Required columns:
Distinguish document issues from system defaults. When determining row status:
Tier 1 — Document issues (per-row blockers): Missing data the document should have provided — name, email, currency, spend limit, DOB (for INDIVIDUAL cardholders) — plus conflicting values, duplicates, or ambiguous fields. These determine the Status column. A row is ✅ Ready when all document-extracted fields are complete and unambiguous.
Tier 2 — System defaults (shared across batch): Fields the API requires but card-request documents typically don't include — card nicknames, created_by, express_consent_obtained, delivery/postal addresses. Present these after the table as "I'll also need from you" items. Do NOT mark rows as ❌ Blocked on Tier 2 fields — this buries the real document issues and makes it look like nothing can proceed.
After the table, summarize:
Then ask the user to confirm ready rows and resolve blocked rows.
Handling blanket overrides: If the user provides a blanket override (e.g., "set all limits to $2,000 USD") that conflicts with document-extracted values (e.g., document lists GBP for some rows, AUD for others), flag the conflict and ask the user to choose before applying. Do NOT silently override document-extracted currencies or limits.
Do NOT proceed until user confirms.
Step 3 — Confirm environment. State sandbox vs production to the user (sandbox default; production only on explicit confirmation). Validate auth via a low-cost read. Verify Issuing is enabled on the active account.
Step 4 — Match existing cardholder by email. Reuse only if status is READY; otherwise stop and explain the cardholder must reach READY before issuing. Paginate fully (page_size ≥ 10) until has_more is false.
Step 5 — Create cardholder (if needed). Copy the appropriate template from references/card-templates.md (INDIVIDUAL for a named person, DELEGATE for a purpose card), fill in values, show the full payload to the user and get explicit confirmation, then execute. In a batch, confirm row-by-row.
Step 6 — Create card. Do NOT add extra JSON fields for MCC or merchant restrictions unless the exact field is documented and verified first. Process card creates sequentially — do NOT parallelize. A parallel failure cancels sibling calls, causing cascading errors. Wait for each creation to succeed before starting the next.
Copy the Virtual or Physical card template from references/card-templates.md, fill in values, show the full payload to the user and get explicit per-card confirmation, then execute. A prior sample/template preview is not approval for later cards.
Physical-card delivery address — two valid paths (both surfaces):
postal_address (set via the cardholder-create / update operation). Card create uses it by default.postal_address directly on card create when the delivery destination differs from the cardholder's registered address.Always show the user the cardholder's registered address alongside the intended delivery address and confirm before issuing. Never fabricate an address based on the card's currency. For EXPRESS shipment (or any China destination), pass delivery_details with preferred_delivery_mode: "EXPRESS" and an E.164 mobile_number. Both postal_address and delivery_details are create-time only — if either is wrong after creation, close and re-issue.
Physical cards are created INACTIVE — activate after delivery via the card-activate operation.
Step 7 — Verify and confirm. Re-fetch the created card (and limits if needed), then show: card ID, nickname, type, currency, limits, status. In the final confirmation, do NOT display any part of the card number — including masked/last-4 digits. The API response includes card_number with partial masking, but even last-4 digits must not appear in agent output. Identify cards by nickname and card ID only. Direct user to the Airwallex Dashboard for PAN, CVV, and expiry — do NOT construct Airwallex Dashboard URLs. If the user mentioned a specific vendor or subscription (e.g., "card for Adobe"), remind them of the next step: go to the Airwallex Dashboard to copy the card details (PAN, CVV, expiry), then enter them on the vendor/subscription site to complete setup.
Update limits: Always show current spend vs limit first (via the card-limits lookup), then update after user confirms.
Review spend: List transactions per card (filter by card_id) and sum amounts. When presenting spend summaries:
Category aggregation (e.g., "what are we spending on software?"): There is no API-level category filter. Build the category view by combining two signals:
merchant_name / description fields and map to recognizable business names.Combine both signals to classify cards into user-friendly categories (Software, Travel, Office, etc.). Present a grouped summary with per-card breakdown and category total:
Software spend this month: $847
Figma: $30 / $50 (60%)
AWS: $412 / $500 (82%) ⚠️ approaching limit
Notion: $24 / $30 (80%) ⚠️ approaching limit
GitHub: $21 / $50 (42%)
Other (3 cards): $360
If a card's category is ambiguous, ask the user rather than guessing.
Spend aggregation is manual. No
cards spendingendpoint. List issuing-transactions withcard_id, optionalstatus, optional date range, and cursor pagination (page/page_after,page_size10–100). Filter in post-processing if needed.
Activate physical card after delivery.
Batch provisioning: Follow the batch extraction table from Step 2. Process ✅ Ready rows first — create cardholders where needed, then create cards row by row sequentially. After all ready rows are done, report results and re-present the ❌ Blocked rows for the user to resolve. ASK ONCE for shared defaults (form_factor, interval) only if the document does not specify them per row. Report each card_id with its cardholder nickname.
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 |
|---|---|
| Cardholder details incomplete | Ask for missing required fields (name, email, DOB for INDIVIDUAL) |
| All required fields present | Proceed — do NOT block on optional fields (address, phone, etc.) unless the card type requires them (e.g., physical cards need postal_address) |
| Card creation fails | Show full error. Go back to references/card-templates.md — include ALL required fields and retry once. For any other rejection, stop and show error |
| Limit format unclear | Ask: amount + currency + interval (per transaction / daily / monthly) |
| Cardholder not READY | Stop — the cardholder must reach READY before issuance. May need KYC verification; check Airwallex Dashboard |
| Physical card missing postal address | Ask for delivery address |
| MCC / merchant restriction requested but not documented | Say support is unconfirmed in this workflow; create the card without guessed restriction fields or direct the user to the Airwallex Dashboard / policy controls |
Phase 1: Gather Requirements
understand request → build card spec → user confirms
Phase 2: Create Card
environment / account + auth → match cardholder → create cardholder if needed
→ create card (sequential, per-row confirmed) → verify & confirm
Phase 3: Manage (ongoing)
show spend vs limit → update limits → aggregate by category → activate physical cards
Offers 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.
npx claudepluginhub anthropics/claude-plugins-official --plugin airwallex-agentos