Manage accounts payable invoices including data extraction, PO matching, three-way matching (PO, receipt, invoice), discrepancy identification, and resolution routing
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_invoiceproc_poproc_po_itemproc_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 workflows