Manage Procurement
Use this skill for purchase order lookup, unified procurement request lookup,
status tracking after submission, pending procurement approvals, and safe
request approval or rejection.
For a new or existing draft that the user wants to fill, review before
submission, or submit, use ramp-submit-procurement-request. For an approval queue
that spans requests, bills, reimbursements, or transactions, use
ramp-approval-dashboard.
Do not use it for bill approval/payment, card transaction cleanup,
reimbursements, vendor document upload, accounting recoding, or drafting
contract edits.
Rules
- Use
purchase_orders for PO lookup/detail. Use requests for unified request
search, request detail, pending approval queue, approval, and rejection.
- Keep identifiers labeled.
purchase_order_id, unified_request_id, and
spend_request_id are distinct. Approval acts on
the unified request UUID, not the PO UUID.
- Use
--agent for responses you need to parse.
- Use
--json for search filters. The CLI validates unknown JSON keys and enum
values, so use --dry_run --json ... when checking payload shape.
- Use exact pagination cursors returned by the API. Do not trim or rewrite them.
- Procurement schemas do not return deep-link URLs. Present returned identifiers
and statuses instead of inventing links.
- Do not approve or reject without first showing details and confirming the
user's intent.
- When
requests get returns a non-null original_request, treat the request as
a change request; before approval, verify that original_request identifies the
intended original approved request and review every entry in
change_request_diff fields, including each old and new value. Stop if the
source or diff is absent or unexpected.
- A
LINE_ITEM diff includes only changed values. Overlay a present new_value
on old_value: a null property means unchanged; the whole new_value is null
when the line was removed. When a line item's UUID matches the original, its
tracking categories, custom fields, withholding rates, and external IDs
carried over unchanged; do not report them as changes.
- For rejection, include the user-supplied or user-accepted reason in
--thoughts.
- PO amount fields are numeric currency units with a
currency code. Display
them directly; do not apply cents conversion.
Workflow
Search POs first when the user gives a PO number, vendor, or procurement
record. filters.search matches PO numbers, request names, and owner names;
it does not match vendor names. For a vendor search, resolve the vendor UUID
first, then filter POs by payee_uuids:
ramp vendors search --search_term "Figma" --limit 10 --rationale "Find the vendor UUID for the purchase order search" --agent
ramp purchase_orders search --json '{"rationale":"Searching purchase orders for the resolved vendor","filters":{"payee_uuids":["{vendor_uuid}"]},"limit":10}' --agent
For a PO number, request name, or owner name, use filters.search directly:
ramp purchase_orders search --json '{"rationale":"Searching purchase orders by PO number","filters":{"search":"PO-1234"},"limit":10}' --agent
If a known PO number is not returned, the spend request may still be pending
and the PO may not be issued yet. Search unified requests scoped to purchase
orders:
ramp requests search --json '{"rationale":"Searching purchase order requests before PO issuance","filters":{"search":"PO-1234","unified_spend_request_types":["PURCHASE_ORDER"]},"limit":10}' --agent
Unified request search and pending rows include unified_request_id and may
include purchase_order_number, but they do not include
purchase_order_id. To move from a unified request row to PO detail, first
call requests get with unified_request_id and use purchase_order_id
from that detail response if it is present.
Get detail before summarizing or taking action:
ramp purchase_orders get {purchase_order_id} --rationale "Reviewing purchase order details" --agent
ramp requests get {unified_request_id} --rationale "Reviewing request before action" --agent
The unified request identifier is named unified_request_id in request
search, pending, detail, approve, and reject responses. Do not call
purchase_orders get directly from a request search or pending row; list
rows do not expose purchase_order_id.
Review pending approvals through the request queue:
ramp requests pending --rationale "Reviewing pending procurement approvals" --thoughts "Reviewing pending procurement requests" --page_size 50 --request_types PURCHASE_ORDER --agent
Paginate with the returned cursor:
ramp requests pending --rationale "Continuing pending procurement approval review" --thoughts "Reviewing pending procurement requests" --page_size 50 --request_types PURCHASE_ORDER --start "{next_page_cursor}" --agent
Before approval or rejection, check the current approval step:
ramp requests get {unified_request_id} --rationale "Pre-approval workflow check" --agent
If approval_workflow.needs_user_action is not true, do not call
requests approve; hand off with the identifiers and the current approval
step from approval_workflow.steps.
If original_request is non-null, also show its original spend request
UUID, unified request UUID, and PO number, followed by the complete
change_request_diff fields and old/new values. Confirm that the source is the
original approved request the user intended to amend and that the diff
contains only the expected changes. Do not infer a change request from names or
amounts when original_request is null.
Act only after the user confirms the exact unified_request_id:
ramp requests approve {unified_request_id} --action APPROVE --rationale "Approving confirmed purchase order request" --thoughts "Approved after confirming PO details with the user" --agent
ramp requests approve {unified_request_id} --action REJECT --rationale "Rejecting confirmed purchase order request" --thoughts "Rejected: {confirmed_reason}" --agent
Output
For search results, keep rows compact and use fields from the command response:
PO number | vendor | amount | currency | PO status | id
For detail summaries, include available status and relationship fields:
PO number:
Vendor:
Amount:
PO status:
Request status:
Change-request source:
Change-request diff:
Promise date:
Linked bills:
Linked transactions:
Linked item receipts:
Unified request ID:
Before approval, state that approval acts on the unified request UUID, not the
PO ID. For change requests, include the original approved request identifiers and
old/new diff in the confirmation prompt. After action, surface returned
unified_request_id, action, success, and message.
Handoff
Hand off instead of guessing when the CLI cannot complete the workflow, the
current user is not the active approver, the user asks for unsupported edits, or
the task belongs to bills, reimbursements, transactions, vendor documents, or
contracts.
Include the identifiers and statuses you have:
PO number:
Purchase order ID:
Unified request ID:
Spend request ID:
Request status:
Current approval step:
1---2name: ramp-manage-procurement3description: Search, inspect, track, and safely approve submitted procurement requests and purchase orders. Use when: 'find a PO', 'show procurement request details', 'purchase order status', 'what procurement requests need approval', or 'approve this PO request'. Do NOT use to create, continue, edit, review before submission, or submit a draft request (use ramp-submit-procurement-request), to track or award a sourcing event or RFP (use ramp-manage-sourcing), or for a cross-product approval queue (use ramp-approval-dashboard).4---56# Manage Procurement78Use this skill for purchase order lookup, unified procurement request lookup,9status tracking after submission, pending procurement approvals, and safe10request approval or rejection.1112For a new or existing draft that the user wants to fill, review before13submission, or submit, use `ramp-submit-procurement-request`. For an approval queue14that spans requests, bills, reimbursements, or transactions, use15`ramp-approval-dashboard`.1617Do not use it for bill approval/payment, card transaction cleanup,18reimbursements, vendor document upload, accounting recoding, or drafting19contract edits.2021## Rules2223- Use `purchase_orders` for PO lookup/detail. Use `requests` for unified request24 search, request detail, pending approval queue, approval, and rejection.25- Keep identifiers labeled. `purchase_order_id`, `unified_request_id`, and26 `spend_request_id` are distinct. Approval acts on27 the unified request UUID, not the PO UUID.28- Use `--agent` for responses you need to parse.29- Use `--json` for search filters. The CLI validates unknown JSON keys and enum30 values, so use `--dry_run --json ...` when checking payload shape.31- Use exact pagination cursors returned by the API. Do not trim or rewrite them.32- Procurement schemas do not return deep-link URLs. Present returned identifiers33 and statuses instead of inventing links.34- Do not approve or reject without first showing details and confirming the35 user's intent.36- When `requests get` returns a non-null `original_request`, treat the request as37 a change request; before approval, verify that `original_request` identifies the38 intended original approved request and review every entry in39 `change_request_diff` fields, including each old and new value. Stop if the40 source or diff is absent or unexpected.41- A `LINE_ITEM` diff includes only changed values. Overlay a present `new_value`42 on `old_value`: a null property means unchanged; the whole `new_value` is null43 when the line was removed. When a line item's UUID matches the original, its44 tracking categories, custom fields, withholding rates, and external IDs45 carried over unchanged; do not report them as changes.46- For rejection, include the user-supplied or user-accepted reason in47 `--thoughts`.48- PO amount fields are numeric currency units with a `currency` code. Display49 them directly; do not apply cents conversion.5051## Workflow52531. Search POs first when the user gives a PO number, vendor, or procurement54 record. `filters.search` matches PO numbers, request names, and owner names;55 it does not match vendor names. For a vendor search, resolve the vendor UUID56 first, then filter POs by `payee_uuids`:5758 ```bash59 ramp vendors search --search_term "Figma" --limit 10 --rationale "Find the vendor UUID for the purchase order search" --agent60 ramp purchase_orders search --json '{"rationale":"Searching purchase orders for the resolved vendor","filters":{"payee_uuids":["{vendor_uuid}"]},"limit":10}' --agent61 ```6263 For a PO number, request name, or owner name, use `filters.search` directly:6465 ```bash66 ramp purchase_orders search --json '{"rationale":"Searching purchase orders by PO number","filters":{"search":"PO-1234"},"limit":10}' --agent67 ```6869 If a known PO number is not returned, the spend request may still be pending70 and the PO may not be issued yet. Search unified requests scoped to purchase71 orders:7273 ```bash74 ramp requests search --json '{"rationale":"Searching purchase order requests before PO issuance","filters":{"search":"PO-1234","unified_spend_request_types":["PURCHASE_ORDER"]},"limit":10}' --agent75 ```7677 Unified request search and pending rows include `unified_request_id` and may78 include `purchase_order_number`, but they do not include79 `purchase_order_id`. To move from a unified request row to PO detail, first80 call `requests get` with `unified_request_id` and use `purchase_order_id`81 from that detail response if it is present.82832. Get detail before summarizing or taking action:8485 ```bash86 ramp purchase_orders get {purchase_order_id} --rationale "Reviewing purchase order details" --agent87 ramp requests get {unified_request_id} --rationale "Reviewing request before action" --agent88 ```8990 The unified request identifier is named `unified_request_id` in request91 search, pending, detail, approve, and reject responses. Do not call92 `purchase_orders get` directly from a request search or pending row; list93 rows do not expose `purchase_order_id`.94953. Review pending approvals through the request queue:9697 ```bash98 ramp requests pending --rationale "Reviewing pending procurement approvals" --thoughts "Reviewing pending procurement requests" --page_size 50 --request_types PURCHASE_ORDER --agent99 ```100101 Paginate with the returned cursor:102103 ```bash104 ramp requests pending --rationale "Continuing pending procurement approval review" --thoughts "Reviewing pending procurement requests" --page_size 50 --request_types PURCHASE_ORDER --start "{next_page_cursor}" --agent105 ```1061074. Before approval or rejection, check the current approval step:108109 ```bash110 ramp requests get {unified_request_id} --rationale "Pre-approval workflow check" --agent111 ```112113 If `approval_workflow.needs_user_action` is not `true`, do not call114 `requests approve`; hand off with the identifiers and the current approval115 step from `approval_workflow.steps`.116117 If `original_request` is non-null, also show its original spend request118 UUID, unified request UUID, and PO number, followed by the complete119 `change_request_diff` fields and old/new values. Confirm that the source is the120 original approved request the user intended to amend and that the diff121 contains only the expected changes. Do not infer a change request from names or122 amounts when `original_request` is null.1231245. Act only after the user confirms the exact `unified_request_id`:125126 ```bash127 ramp requests approve {unified_request_id} --action APPROVE --rationale "Approving confirmed purchase order request" --thoughts "Approved after confirming PO details with the user" --agent128 ramp requests approve {unified_request_id} --action REJECT --rationale "Rejecting confirmed purchase order request" --thoughts "Rejected: {confirmed_reason}" --agent129 ```130131## Output132133For search results, keep rows compact and use fields from the command response:134135```text136PO number | vendor | amount | currency | PO status | id137```138139For detail summaries, include available status and relationship fields:140141```text142PO number:143Vendor:144Amount:145PO status:146Request status:147Change-request source:148Change-request diff:149Promise date:150Linked bills:151Linked transactions:152Linked item receipts:153Unified request ID:154```155156Before approval, state that approval acts on the unified request UUID, not the157PO ID. For change requests, include the original approved request identifiers and158old/new diff in the confirmation prompt. After action, surface returned159`unified_request_id`, `action`, `success`, and `message`.160161## Handoff162163Hand off instead of guessing when the CLI cannot complete the workflow, the164current user is not the active approver, the user asks for unsupported edits, or165the task belongs to bills, reimbursements, transactions, vendor documents, or166contracts.167168Include the identifiers and statuses you have:169170```text171PO number:172Purchase order ID:173Unified request ID:174Spend request ID:175Request status:176Current approval step:177```