skills/procurement/invoice-management/SKILL.md
Manage accounts payable invoices including data extraction, PO matching, three-way matching (PO, receipt, invoice), discrepancy identification, and resolution routing
npx skillsauth add happy-technologies-llc/happy-servicenow-skills invoice-managementInstall 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.
This skill provides a structured approach to managing accounts payable invoices in ServiceNow Sourcing and Procurement Operations. It helps you:
sn_proc_invoice tablesn_apo_invoice_caseWhen to use: When invoices need to be reviewed, matched against purchase orders and goods receipts, or when discrepancies require investigation and resolution.
sn_procurement.invoice_manager, sn_procurement.analyst, or accounts_payablecom.sn_procurement (Sourcing and Procurement Operations) activatedsn_proc_invoice, proc_po, proc_po_item, proc_rec_slip_itemRetrieve invoices awaiting processing or matching.
Using MCP (Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sn_proc_invoice
query: state=pending^ORstate=awaiting_match
fields: sys_id,number,vendor,po_number,invoice_amount,invoice_date,currency,state,due_date
limit: 25
order_by: due_date
Using REST API:
GET /api/now/table/sn_proc_invoice?sysparm_query=state=pending^ORstate=awaiting_match^ORDERBYdue_date&sysparm_fields=sys_id,number,vendor,po_number,invoice_amount,invoice_date,currency,state,due_date&sysparm_limit=25
For each invoice, fetch the associated PO and its line items to begin matching.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: proc_po
query: number=[PO_NUMBER]
fields: sys_id,number,vendor,total_cost,state,ordered_date,expected_delivery,currency
limit: 1
Then fetch PO line items:
Tool: SN-Query-Table
Parameters:
table_name: proc_po_item
query: purchase_order.number=[PO_NUMBER]
fields: sys_id,item_description,quantity,unit_price,total_cost,received_quantity,model,part_number
limit: 50
Using REST API:
# Get PO header
GET /api/now/table/proc_po?sysparm_query=number=[PO_NUMBER]&sysparm_fields=sys_id,number,vendor,total_cost,state,ordered_date,expected_delivery,currency&sysparm_limit=1
# Get PO line items
GET /api/now/table/proc_po_item?sysparm_query=purchase_order.number=[PO_NUMBER]&sysparm_fields=sys_id,item_description,quantity,unit_price,total_cost,received_quantity,model,part_number&sysparm_limit=50
Query receiving slip items to verify what was physically received.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: proc_rec_slip_item
query: purchase_order.number=[PO_NUMBER]
fields: sys_id,quantity_received,received_date,po_item,receiving_slip,condition,notes
limit: 50
Using REST API:
GET /api/now/table/proc_rec_slip_item?sysparm_query=purchase_order.number=[PO_NUMBER]&sysparm_fields=sys_id,quantity_received,received_date,po_item,receiving_slip,condition,notes&sysparm_limit=50
Compare across the three documents. For each line item, validate:
| Check | Formula | Pass Condition |
|-------|---------|----------------|
| Quantity | invoice_qty <= received_qty | Invoice does not exceed receipt |
| Unit Price | abs(invoice_price - po_price) / po_price * 100 | Variance within threshold (e.g., 2%) |
| Line Total | invoice_line_total <= po_line_total * (1 + tolerance) | Within tolerance band |
| Invoice Total | invoice_total <= po_total * (1 + tolerance) | Grand total within tolerance |
If matching fails, create an invoice exception case for resolution.
Using MCP:
Tool: SN-Create-Record
Parameters:
table_name: sn_apo_invoice_case
fields:
invoice: [invoice_sys_id]
purchase_order: [po_sys_id]
short_description: "Three-way match failure: quantity discrepancy on PO0012345"
description: "Invoice INV-9876 line 2: invoiced qty 100, received qty 85. Variance: 15 units (17.6%). Exceeds 5% tolerance threshold."
priority: 2
category: quantity_discrepancy
state: new
assigned_to: [procurement_analyst_sys_id]
Using REST API:
POST /api/now/table/sn_apo_invoice_case
Content-Type: application/json
{
"invoice": "[invoice_sys_id]",
"purchase_order": "[po_sys_id]",
"short_description": "Three-way match failure: quantity discrepancy on PO0012345",
"description": "Invoice INV-9876 line 2: invoiced qty 100, received qty 85. Variance: 15 units (17.6%).",
"priority": "2",
"category": "quantity_discrepancy",
"state": "new"
}
Mark the invoice as matched or exception based on results.
Using MCP:
Tool: SN-Update-Record
Parameters:
table_name: sn_proc_invoice
sys_id: [invoice_sys_id]
fields:
state: matched
match_status: passed
work_notes: "Three-way match completed. All line items within tolerance. Ready for payment approval."
For failed matches:
Tool: SN-Update-Record
Parameters:
table_name: sn_proc_invoice
sys_id: [invoice_sys_id]
fields:
state: exception
match_status: failed
work_notes: "Three-way match failed. Exception case CASE0045678 created for quantity discrepancy on lines 2, 5."
Using REST API:
PATCH /api/now/table/sn_proc_invoice/[invoice_sys_id]
Content-Type: application/json
{
"state": "exception",
"match_status": "failed",
"work_notes": "Three-way match failed. Exception case created."
}
| Tool | When to Use |
|------|-------------|
| SN-Query-Table | Query invoices, POs, receipts, and vendors |
| SN-NL-Search | Natural language search for invoices by vendor or amount |
| SN-Create-Record | Create invoice exception cases |
| SN-Update-Record | Update invoice state and match status |
| SN-Add-Work-Notes | Document matching results and decisions |
| Endpoint | Method | Purpose |
|----------|--------|---------|
| /api/now/table/sn_proc_invoice | GET | Query invoices |
| /api/now/table/sn_proc_invoice/{sys_id} | PATCH | Update invoice status |
| /api/now/table/proc_po | GET | Retrieve purchase orders |
| /api/now/table/proc_po_item | GET | Retrieve PO line items |
| /api/now/table/proc_rec_slip_item | GET | Retrieve goods receipts |
| /api/now/table/sn_apo_invoice_case | POST | Create exception cases |
core_company records to confirm vendor bank details before paymentCause: The PO number field is empty or contains a non-matching reference
Solution: Search proc_po by vendor and date range to find the correct PO; update the invoice record
Cause: Receiving has not been recorded in ServiceNow yet
Solution: Check proc_rec_slip_item by PO; contact warehouse to confirm physical receipt and create receiving slip
Cause: Price increases, additional charges (shipping, tax), or duplicate invoicing
Solution: Create an exception case; verify with vendor if charges are legitimate; check for duplicate invoices using sysparm_query=vendor=[vendor_id]^invoice_amount=[amount]^invoice_date>=[date]
Cause: Vendor consolidated multiple orders into one invoice Solution: Split the invoice or match line-by-line against individual POs using part numbers or item descriptions
Scenario: Invoice INV-2024-0456 from Acme Corp for $15,000.00
Steps:
proc_rec_slip_itemTool: SN-Update-Record
Parameters:
table_name: sn_proc_invoice
sys_id: a1b2c3d4...
fields:
state: matched
match_status: passed
work_notes: "Three-way match passed. PO0012345 fully received. All prices match. Ready for payment."
Scenario: Invoice INV-2024-0789 shows 500 units at $12.00 each ($6,000). PO shows 500 units at $10.00 ($5,000). Receipt confirms 500 units.
Analysis:
Action: Create exception case, flag for procurement analyst review, hold payment.
Scenario: PO for 1,000 units, 750 received, invoice for 750 units.
Analysis:
procurement/purchase-order-summarization - Summarize PO details and delivery statusprocurement/procurement-summarization - Procurement case and pipeline overviewprocurement/supplier-recommendation - Evaluate vendor performance for sourcing decisionscatalog/approval-workflows - Configure invoice approval workflowstesting
Manage supplier onboarding, qualification, performance monitoring, and offboarding with auditable lifecycle controls
tools
Identify emerging risks, prioritize intake signals, and route candidates into formal GRC risk assessment workflows
documentation
Screen inbound documents for completeness, policy risk, and routing readiness before extraction or case workflows
testing
Generate concise task summaries with status, timeline, blockers, SLA risk, and recommended next actions