| name | transaction-cleanup |
| description | Complete missing items on your transactions — memos, accounting categories, funds,
and attendees. Use when: 'add memo', 'categorize transactions', 'missing items',
'transaction cleanup', 'fix my transactions', 'set tracking category',
'assign to fund', 'bulk memo update'. Do NOT use for: receipt uploads
(use receipt-compliance) or approvals (use approval-dashboard). |
| user-invocable | true |
Non-Negotiables
- Scope to the user's own transactions by default (
--transactions_to_retrieve my_transactions).
- Show the transaction details before editing. Never blind-edit.
- For bulk edits, present the plan and confirm before executing.
- The
--user_submitted_fields flag tracks provenance — include it to mark which fields the user explicitly provided vs agent-inferred.
- All CLI flags use underscores, not hyphens.
Workflow
Step 1: Find transactions needing attention
ramp transactions list --transactions_to_retrieve my_transactions \
--from_date {start} --state cleared --agent --page_size 50
For any transaction, check what's missing:
ramp transactions missing {transaction_uuid}
Returns: missing_receipt (bool), missing_memo (bool), missing_accounting_items (array of category names).
Step 2: Get AI-suggested memos
Before writing memos manually, check if Ramp has suggestions:
ramp transactions memo-suggestions {transaction_uuid}
Returns memos[] — an array of suggested memo strings based on the transaction context.
Step 3: Edit transactions
Set a memo
ramp transactions edit {transaction_uuid} --memo "Q2 team offsite catering"
To clear a memo, pass an empty string: --memo ""
Assign to a fund/spend allocation
ramp transactions edit {transaction_uuid} --fund_uuid {fund_uuid}
To find available funds:
ramp funds list --funds_to_retrieve MY_FUNDS --include_balance --agent
Set tracking categories (accounting codes)
First, get available categories and their options:
ramp accounting categories --agent
ramp accounting category-options {tracking_category_uuid} --agent --page_size 50
Then edit via --json (tracking categories aren't exposed as named flags).
Important: When using --json, you must include transaction_uuid in the body. The --json flag bypasses the CLI's automatic injection of the positional arg.
ramp transactions edit --json '{
"transaction_uuid": "{transaction_uuid}",
"tracking_category_selections": [
{
"category_uuid": "{category_uuid}",
"option_selection": "{option_uuid}"
}
],
"user_submitted_fields": ["tracking_category_selections"]
}'
Note: the field names inside tracking_category_selections are category_uuid and option_selection — NOT tracking_category_uuid / tracking_category_option_uuid (those are the names returned by the categories list endpoint, not the edit endpoint).
Set attendees
ramp transactions edit --json '{
"transaction_uuid": "{transaction_uuid}",
"attendee_selections": {
"non_ramp_attendees": [
{"attendee_name": "Jane Smith", "attendee_email": "jane@company.com"}
],
"include_self_as_attendee": false
},
"user_submitted_fields": ["attendee_selections"]
}'
Step 4: Handle missing receipts (hand off)
If missing_receipt is true, you have two options:
- Upload a receipt — use the receipt-compliance skill
- Explain why it's missing:
ramp transactions explain-missing {transaction_uuid} \
--reason "Digital subscription — no receipt issued"
Or generate a link to the missing receipt affidavit form (the user must complete it manually in the browser):
ramp transactions flag-missing {transaction_uuid}
Bulk Cleanup Workflow
For cleaning up many transactions at once:
- Fetch all transactions in the period
- Check
missing_items on each (or batch-check via individual calls)
- Group by what's missing: memo, accounting, receipt
- Present summary: "12 transactions need memos, 5 need accounting categories, 3 need receipts"
- For memos: fetch suggestions for each, present them, let user confirm or edit
- For categories: if most transactions share a category, offer to bulk-apply
- Execute edits sequentially, report progress
Provenance Tracking
The --user_submitted_fields flag tells Ramp which fields the user explicitly provided. This matters for compliance — it distinguishes user intent from agent inference.
Include it when setting fields via --json:
ramp transactions edit --json '{
"transaction_uuid": "{transaction_uuid}",
"memo": "Client dinner with Acme team",
"user_submitted_fields": ["memo"]
}'
Valid values: attendee_selections, attendee_uuids, fund_uuid, memo, tracking_category_selections.
When using named flags (--memo, --fund_uuid), provenance is tracked automatically.
Example Session
User: I have a bunch of transactions that need memos
Agent: Let me check what's missing on your recent transactions.
> ramp transactions list --transactions_to_retrieve my_transactions \
> --from_date 2026-03-01 --state cleared --agent --page_size 50
Found 8 transactions. Checking missing items on each...
> ramp transactions missing {uuid} (×8)
Summary:
5 need memos
2 need accounting categories
1 needs a receipt (→ use receipt-compliance)
Let me get AI-suggested memos for the 5:
> ramp transactions memo-suggestions {uuid} (×5)
Transaction Suggested memo
$135 Facebook Ads 2026-03-02 "Q1 paid social campaign"
$220 AWS 2026-03-05 "March infrastructure costs"
$89 Uber 2026-03-10 (no suggestion)
$450 WeWork 2026-03-12 "March coworking space"
$65 Doordash 2026-03-15 (no suggestion)
Want to accept these suggestions, edit them, or write your own?
User: Accept the suggestions for Facebook and AWS. The Uber was a client dinner ride, WeWork is fine, skip DoorDash for now.
Agent: Updating 4 transactions:
> ramp transactions edit {fb-uuid} --memo "Q1 paid social campaign"
> ramp transactions edit {aws-uuid} --memo "March infrastructure costs"
> ramp transactions edit {uber-uuid} --memo "Client dinner transportation"
> ramp transactions edit {wework-uuid} --memo "March coworking space"
All 4 memos set. 2 transactions still need accounting categories.
Want to tackle those?
User: Yes, they should both be under the "Marketing" project
Agent: > ramp accounting categories --agent
> ramp accounting category-options {project-uuid} --agent --page_size 50
Found "Marketing" option (uuid: mkt-123). Applying to both:
> ramp transactions edit --json '{"transaction_uuid": "{uuid1}", "tracking_category_selections": [{"category_uuid": "proj-uuid", "option_selection": "mkt-123"}]}'
> ramp transactions edit --json '{"transaction_uuid": "{uuid2}", "tracking_category_selections": [{"category_uuid": "proj-uuid", "option_selection": "mkt-123"}]}'
Done. 1 transaction remaining (needs receipt — use receipt-compliance when ready).
When NOT to Use
- Uploading receipts — use receipt-compliance (handles base64 encoding, matching, bulk upload)
- Approving or rejecting items — use approval-dashboard
- Company-wide spend reporting — the CLI is scoped to your own data; use the Ramp dashboard
Gotchas
| Issue | Fix |
|---|
amount is a formatted string ("$135.40") | Strip "$" and "," for numeric operations |
--state values are lowercase | Use cleared, pending — not uppercase |
Tracking categories require --json | Named flags only cover --memo and --fund_uuid. When using --json, include transaction_uuid in the body. |
| Category field names differ between endpoints | accounting category-options returns tracking_category_option_uuid, but transactions edit expects category_uuid + option_selection |
memo-suggestions may return empty | Not all transactions have enough context for suggestions |
accounting category-options paginates with integers | Unlike other endpoints, the cursor is a number, not a string |
--transactions_to_retrieve is required | Always include it on transactions list |
| Searching for specific transactions | Use --reason_memo_merchant_or_user_name_text_search "query" (min 3 chars) |
| Comment on a transaction | ramp general comment {uuid} --ramp_object_type transaction --message "text" |