accounts_payable_pulse · v1.1.0 · 2026-11-02 · sha256 99a3c98730172ed9

accounts_payable_pulse v1.1.0A

Immutable. This exact content never changes and is served at /api/v1/blob/99a3c98730172ed9.

---
name: accounts_payable_pulse
description: >
  AP health dashboard and invoice lookup for Accounts Payable teams. Two modes:
  (1) AP Pulse Briefing — comprehensive AP payments health snapshot: overdue invoices
  with age buckets, holds, match exceptions, approval pipeline aging, large upcoming
  payments, with optional cash balances, intake trend, and team performance; opens
  with AI-synthesized Key Takeaways. (2) Invoice Lookup — match uploaded supplier
  invoices (CSV/Excel/PDF) against system records to verify amounts, currency, and
  payment status. Triggers: AP pulse, AP dashboard, AP health, good morning AP,
  AP briefing, how are my invoices, AP status, payments health, match this invoice,
  check invoice status, reconcile invoices, upload invoice.
data_domain: "accounts payable invoices, supplier invoices, overdue invoices, invoice holds, match exceptions, approval workflow, large payments, purchase orders, AP operations, invoice matching, payment status, AP payments health"
dehydrated: true
created_date: 2026-05-28
version: 1.1.0
license: Snowflake Skills License. See LICENSE.txt for complete terms
type: snowflake
language: en
status: Published
---

# Accounts Payable Pulse

## Intent

Comprehensive AP payments health dashboard and on-demand invoice lookup for Accounts Payable teams. Tells the story of AP in one view: what is overdue, what is blocked, what is stuck in approval, and what large payments are coming up — followed by an option to match uploaded supplier invoices against system records.

For: AP analysts, AP managers, controllers, and auditors at any organization.

Not for: GL reporting, payroll, employee expense management, revenue accounting, or any data modification.

---

## Routing Logic

Classify the request into one of two modes before doing anything else.

| Signal | Mode |
|---|---|
| "AP pulse", "AP dashboard", "AP health", "AP status", "good morning AP", "AP briefing", "AP daily", "how are my invoices", "payments health", "show me AP" | Mode 1 — AP Pulse Briefing |
| "match this invoice", "check invoice status", "reconcile invoices", "upload invoice", user uploads a file (CSV / Excel / PDF) | Mode 2 — Invoice Lookup |
| Ambiguous | Use `ask_user_question`: "Would you like the AP Pulse Briefing (payments health overview) or Invoice Lookup (match a specific invoice against your records)?" |

---

## Mode 1: AP Pulse Briefing

### Section Plan

**Core sections** — run always (require only invoice header + approval tables):

| Order | Section | What it answers |
|---|---|---|
| — | *(run all queries first)* | |
| 1 | **Key Takeaways** | What are the top 3–5 things AP needs to act on right now? (shown first) |
| 2 | **Overdue Invoices** | What is past due, broken down by age and payment terms? |
| 3 | **Invoices on Hold** | What is blocked and why? |
| 4 | **Match Exceptions** | What failed automated matching? |
| 5 | **Approval Pipeline** | Where are invoices stuck waiting for approval? |
| 6 | **Large Upcoming Payments** | What big payments are due in the next N days? |

**Optional sections** — run only if the corresponding data resolves at runtime:

| Section | Required data | Degraded behavior |
|---|---|---|
| **Cash & Bank Balances** | Bank/treasury balance table | Skip; note "Cash balance data not available." |
| **Invoice Intake Trend** | Intake pipeline / daily processing table | Skip; note "Intake pipeline data not available." |
| **Team Performance** | Processor assignment + cycle time data | Skip; note "Processor assignment data not available." |
| **Support Ticket Queue** | AP support ticket / service desk table | Skip; note "Support ticket system not connected." |

Always end with: **Deep Dive** — suggested follow-up questions using actual values from the data.

---

### Step 1 — Confidence Check

Before running any queries:

1. Verify the invoice header table resolves with at minimum: a supplier identifier, an invoice amount, a due date or payment term, and a status or hold indicator. If it cannot be resolved: skip Mode 1 and output the data requirement guidance from the Context Queries section.
2. Verify the approval/workflow table resolves. If not: run Sections 2–6 only; skip Section 5 with note "Approval workflow data not available."
3. For each optional section: check if the corresponding table resolves. Record which are active.
4. Note skipped optional sections in a one-line banner at the top of the briefing — do not repeat per section.

---

### Step 2 — Run All Queries in Parallel

Run all active section queries simultaneously before presenting anything. See [queries.md](queries.md) for query type descriptions.

**Configuration defaults (use these unless the customer has configured overrides):**

| Parameter | Default | Description |
|---|---|---|
| Approval aging threshold | 3 days | Invoices pending a single approval step longer than this are flagged |
| Large payment threshold | Configurable per org | Minimum invoice amount to appear in Large Upcoming Payments; no universal default — ask or configure at setup |
| Payment lookahead window | 5 days | Days ahead to look for upcoming large payments |
| Overdue age buckets | 1–30d, 31–60d, 61–90d, 90+d | Overdue aging tiers for grouping |

---

### Step 3 — Present Briefing

**Key Takeaways first.** Present Section 1 (Key Takeaways) at the very top of the response — before any detail tables. Then present Sections 2–6, then active optional sections, then Deep Dive.

For each section:
- One-line summary with KPI indicator (🔴 / 🟡 / 🟢), count, and total amount
- Detail table (up to 15 rows; if more: "Showing top 15 of N — ask to filter by supplier / reason / date")
- `> 🔍` drill-down block with 2–3 follow-up prompts using **actual data values** from the results

See [references/output_format.md](references/output_format.md) for section templates and KPI threshold guidance.

---

### Section 1: Key Takeaways

**Run last, present first.** After all queries complete, generate 3–5 AI-synthesized insights from the full dataset.

Rules:
- Order by dollar impact (largest first)
- Each insight: severity badge (🔴 / 🟡 / 🟢) + bold headline + one-sentence recommended action
- Cross-section connections: if the same supplier appears in overdue AND holds AND exceptions, consolidate into one insight ("Supplier X has $1.2M spread across holds, exceptions, and overdue")
- Flag large payments due today or tomorrow as 🔴 regardless of amount
- Note if overdue total exceeds a material amount (org-specific; ask at setup or note "exceeds a material threshold")
- Include at least one 🟢 positive signal when the data supports it
- **Never invent figures.** Every number in Key Takeaways must come from a query result.

---

### Section 2: Overdue Invoices

**Goal:** Show the full overdue picture — how much is late, how late, and which payment terms are most at risk.

Display in two layers:
1. **Age bucket summary** — total count and amount by bucket (1–30d, 31–60d, 61–90d, 90+d)
2. **Payment term breakdown** — count and amount by payment term, ordered by average days overdue

KPI logic:
- 🔴 if any invoice is 90+ days overdue OR total overdue exceeds the org's materiality threshold
- 🟡 if invoices are 31–90 days overdue
- 🟢 if all overdue items are within 30 days and below threshold

Drill-down: `"Show all overdue [Net 30 / specific term] invoices"` | `"Show invoices overdue more than 60 days"` | `"Which suppliers have the most overdue invoices?"`

---

### Section 3: Invoices on Hold

**Goal:** Show what is blocked and why.

Display:
- Hold reason breakdown (count + amount per reason, ordered by amount)
- Detail table: invoice reference, supplier, amount, entity, days on hold, hold reason

KPI logic:
- 🔴 if any invoice has been on hold for more than 14 days OR total hold amount exceeds materiality threshold
- 🟡 if holds present, all within 7–14 days
- 🟢 if zero holds, or all holds are recent (< 7 days)

Drill-down: `"Show invoices on hold for [top reason]"` | `"Show holds older than 14 days"` | `"Which supplier has the most on hold?"`

---

### Section 4: Match Exceptions

**Goal:** Show what failed automated 2-way or 3-way matching.

Display:
- Exception reason breakdown (count + amount per reason)
- Detail table: invoice reference, supplier, amount, entity, days open, exception reason

KPI logic:
- 🔴 if any exception has been open more than 10 days OR total exception amount exceeds threshold
- 🟡 if exceptions present, all within 5–10 days
- 🟢 if zero exceptions

Drill-down: `"Show invoices with [top exception reason]"` | `"Show exceptions older than 10 days"` | `"Which supplier has the most exceptions?"`

---

### Section 5: Approval Pipeline

**Goal:** Show where invoices are stuck waiting for approval, by step and aging.

Display:
- Step-level breakdown: count pending, count beyond threshold (default: 3 days), max days pending, total amount
- Detail: invoices pending beyond threshold with step name, approver, days waiting, amount

KPI logic:
- 🔴 if any invoice has been pending a single step for more than 7 days OR more than 20% of the queue exceeds threshold
- 🟡 if some items exceed threshold but none exceed 7 days
- 🟢 if all pending approvals are within threshold

Drill-down: `"Show all invoices stuck in [top step name]"` | `"Show approvals pending more than 7 days"` | `"Who is the approver for [step name]?"`

---

### Section 6: Large Upcoming Payments

**Goal:** Surface large payments due in the next N days so AP can prepare cash or flag issues.

Display:
- Payments above the configured threshold, due within the lookahead window
- Columns: supplier, due date, days until due, amount (local currency), amount (reporting currency), entity, payment type
- Order by due date ascending, then amount descending

KPI logic:
- 🔴 if any large payment is due today or tomorrow
- 🟡 if large payments are due within 2–5 days
- 🟢 if no large payments within the window (show "No payments above threshold due in the next N days")

Note: The large payment threshold is organization-specific. During setup, collect this value from the customer (e.g., "$500K" or "1M EUR"). If not yet configured, surface all upcoming payments above a reasonable default and note the threshold used.

Drill-down: `"Show all payments due this week"` | `"Show payments from [supplier name]"` | `"Break down by legal entity"`

---

### Optional Section: Cash & Bank Balances

Latest balances for AP-managed bank accounts. Show: account name, entity, currency, local balance, reporting-currency balance. Order by reporting-currency balance descending.

---

### Optional Section: Invoice Intake Trend

7-day daily trend of invoices received and processed through the intake pipeline. Show: date, received count, processed/pushed count, pending count. Note: only available if the organization uses a separate AP intake or processing queue system.

---

### Optional Section: Team Performance

Rolling 30-day processor performance. Show: team total row first, then per-processor: invoice count, average cycle time (received to approved), sent-back rate. Flag sent-back rates above the configured threshold.

---

### Optional Section: Support Ticket Queue

Open AP support tickets grouped by status (active / on-hold / unassigned) with aging bucket distribution. Note: only available if an AP service desk or ticketing system is connected.

---

### Deep Dive

End with a table of suggested follow-up questions covering: overdue drill-downs, hold reasons, exception types, approval steps, upcoming payments, and any optional sections that were active. Use **actual values from the data** (real supplier names, real hold reasons, real step names) — not generic placeholders.

---

### Step 4 — Post-Briefing Actions

After presenting all sections, use `ask_user_question`:

```json
{
  "header": "Next",
  "question": "What would you like to do?",
  "options": [
    {"label": "Drill into a section", "description": "Deep-dive into one of the sections above"},
    {"label": "Match an invoice", "description": "Upload a supplier invoice to check its status (switch to Invoice Lookup mode)"},
    {"label": "Export to Excel", "description": "Download the full AP pulse data as a spreadsheet"},
    {"label": "Done", "description": "Wrap up — no further action needed"}
  ]
}
```

**If "Match an invoice":** transition directly to Mode 2 (Invoice Lookup) — no re-greeting, continue the conversation.

**If "Export to Excel":** generate `ap_pulse_{YYYY-MM-DD}.xlsx` with one sheet per active section. Save to Downloads folder; confirm path.

---

## Mode 2: Invoice Lookup

Match uploaded supplier invoices against internal procurement records. Supports CSV, Excel, and PDF inputs.

---

### Step 1 — Collect File (mandatory stopping point)

Use `ask_user_question` to request the supplier invoice file. Do not proceed until the file is provided.

Accepted formats: CSV, Excel (.xlsx / .xls), PDF (single invoice or vendor statement with multiple line items).

Also ask — or infer from context — the preferred matching mode:
- **Supplier invoice reference** (default): match by the reference number the supplier put on the invoice
- **Internal header number**: match by the system-assigned invoice ID
- **Purchase order number**: match by the PO referenced on the invoice

---

### Step 2 — Parse the Uploaded File

**For CSV / Excel:**
- Identify columns for: invoice reference number, supplier name, amount, currency
- If column mapping is ambiguous, ask via `ask_user_question` before proceeding

**For PDF — single invoice format:**
- Extract: invoice reference, supplier name, total amount, currency, invoice date
- One row per PDF

**For PDF — vendor statement with multiple line items:**
- Extract multiple invoice rows from a single PDF
- Normalize PO references to the account's standard PO identifier format
- Strip supplier legal suffixes (", Inc.", "LLC", "Corp.", "Ltd.", "GmbH", etc.) before fuzzy name matching
- Infer currency from symbols if not explicit: $ → USD, € → EUR, £ → GBP

**PDF fallback for CID-encoded fonts:**
- If extracted text contains mostly `(cid:XX)` sequences or is otherwise unreadable, convert pages to PNG images at 200 DPI and read visually to extract invoice data

---

### Step 3 — Run Matching Cascade

Run matching queries in order. Stop at the first query that returns results.

1. **Primary match** — invoice reference number + supplier name (fuzzy supplier name match)
2. **Header number match** — system invoice header identifier
3. **PO via invoice lines** — match PO reference in invoice line table (finds invoices already entered)
4. **PO direct lookup** — query purchase order tables directly (use when invoice has not yet been entered; shows PO exists + invoiced vs uninvoiced amounts)

See [queries.md](queries.md) for query type descriptions Q14–Q18.

---

### Step 4 — Present Match Results

**Summary counts** at top: Total uploaded | Matched | Amount Mismatch | Currency Mismatch | Unmatched

Per-invoice result row:

| Column | Source |
|---|---|
| Invoice Reference (uploaded) | User file |
| Invoice Reference (system) | Invoice header table |
| Supplier Name (system) | Invoice header table |
| Amount (uploaded) | User file |
| Amount (system) | Invoice header table |
| Currency Match | Compare uploaded vs system |
| Payment Status | Invoice header table |
| Match Status | Status flag (see below) |

**Status flags:**
- `Matched` — found in system; amount and currency agree
- `Amount Mismatch` — found; amount differs beyond tolerance
- `Currency Mismatch` — found; currency differs
- `Unmatched` — not found in system after all matching steps
- `PO Found / Not Yet Invoiced` — PO exists but invoice not yet entered; flag for AP to process

For PO direct lookup results, additionally show: PO number, PO status, total PO amount, amount invoiced, uninvoiced amount, payment terms, requester.

---

### Step 5 — Offer Next Steps (mandatory stopping point)

Use `ask_user_question`:

```json
{
  "header": "Next",
  "question": "What would you like to do?",
  "options": [
    {"label": "Export to Excel", "description": "Download match results as a spreadsheet"},
    {"label": "Try different matching mode", "description": "Re-run using PO number or system header ID"},
    {"label": "Run AP Pulse Briefing", "description": "Switch back to the AP health overview"},
    {"label": "Done", "description": "End the workflow"}
  ]
}
```

---

## Confidence Handling

### Mode 1

| Confidence | Condition | Behavior |
|---|---|---|
| HIGH | Invoice header + approval table resolve with all critical columns | Full briefing: all 6 core sections + any resolved optional sections |
| MEDIUM | Invoice header resolves; approval table missing | Sections 2–4, 6 only; skip Section 5 with note |
| LOW — non-critical | Reporting-currency amount column missing | All sections; show amounts in transaction currency; note "Reporting-currency totals unavailable — amounts shown in transaction currency" |
| LOW — critical | Invoice header not found | Skip Mode 1; output data requirement descriptions; suggest configuration |

### Mode 2

| Confidence | Condition | Behavior |
|---|---|---|
| HIGH | Invoice header + invoice line + PO tables all resolve | Full 4-step matching cascade |
| MEDIUM | Invoice header resolves; line or PO tables missing | Steps 1–2 only; note "PO matching unavailable" |
| LOW — critical | Invoice header not found | Skip Mode 2; output data requirement descriptions |

---

## Guardrails

- **Read-only.** Never INSERT, UPDATE, DELETE, MERGE, or call any procedure that modifies data. If the user requests any data modification: *"This is a read-only AP analysis tool. To take action on invoices, use your AP or ERP system directly."*
- **No cross-currency aggregation without conversion.** If a reporting-currency column is unavailable, group and display amounts by currency code. Never sum USD and EUR together.
- **No invented reasons.** Display hold reasons, exception reasons, and approval step names exactly as they appear in the data — never paraphrase or fill in from assumptions.
- **No hardcoded dollar thresholds.** The large payment threshold and materiality thresholds are organization-specific. Use configured values; if not configured, surface all items and note the threshold is not yet set.
- **Approval aging threshold is a starting point.** The default of 3 days is guidance. Customers should calibrate to their own SLA commitments.

---

## Error Handling

| Scenario | Action |
|---|---|
| Core section returns 0 rows (holds, exceptions, or overdue) | Show "No [holds / exceptions / overdue invoices]" with 🟢 |
| Approval table returns 0 rows | Show "No invoices pending approval beyond threshold" with 🟢 |
| Large payments returns 0 rows | Show "No payments above threshold due in next N days" with 🟢 |
| Query timeout on large dataset | Suggest filtering to a specific supplier, entity, date range |
| Optional table inaccessible | Skip section with one-line explanatory note; never error the whole briefing |
| PDF parsing failure | Ask user to provide data as CSV / Excel instead |
| Invoice lookup — no match found | Suggest alternate matching mode; confirm dates and supplier name |
| Invoice lookup — too many results | Suggest narrowing by supplier name or date range |

---

## Context Queries

Described in natural language — no table names, no column names. Resolved at runtime.

**Critical (skill cannot run Mode 1 without this):**

- An invoice header table where each row is one supplier invoice. Contains: a unique system invoice identifier, a supplier identifier used as a join key, supplier name, vendor-assigned invoice reference number, invoice date, due date, invoice received date, invoice status (e.g., approved / pending / paid), payment status, invoice amount in transaction currency, invoice amount in reporting currency, transaction currency code, company or legal entity, a hold flag or hold reason field, a match exception flag or exception reason field, payment type, and an intercompany flag. Grain: one row per invoice.

**Important — enables Approval Pipeline section:**

- An invoice approval or workflow action table where each row is one pending approval action. Contains: invoice identifier, approval step name, approver identifier or name, and the date the invoice entered this approval step. Optionally: a step completion date. Grain: one row per invoice per pending approval step. In some systems this is a separate workflow table; in others, the pending step and entry date are columns on the invoice header itself.

**Optional — enables Invoice Lookup Mode 2 PO matching:**

- An invoice line table where each row is one line item on a supplier invoice. Contains: invoice header identifier, purchase order reference (PO number or line reference), adjustment flag (boolean), adjustment reason text, optional line memo. Grain: one row per invoice line.

- A purchase order header table: PO identifier, supplier identifier, supplier name, PO status, total PO amount in local and reporting currency, transaction currency, payment terms, invoicing status. Grain: one row per PO.

- A purchase order line table: PO identifier, line identifier, description, line amount (local), amount invoiced to date, uninvoiced amount, line payment status, cancellation flag, requester. Grain: one row per PO line.

**Optional — enables Cash & Bank Balances section:**

- A bank account balance or treasury cash table: account identifier, account name, company or legal entity, currency, balance in local currency, balance in reporting currency, balance date. Grain: one row per account per snapshot (or current-state row per account). If unavailable, section is skipped.

**Optional — enables Invoice Intake Trend section:**

- An invoice intake or processing pipeline table: date, count of invoices received into the intake queue, count pushed or approved into the ERP system, count pending in the queue. Grain: one row per day. If the organization does not use a separate AP intake system, section is skipped.

**Optional — enables Team Performance section:**

- A processor assignment or invoice processing table that can be used to identify who processed each invoice and when. May be the invoice header table itself (with a processor/assignee column and a processed date), or a separate activity table. Used to compute processing volume, cycle time, and sent-back rate per processor. If processor assignment data is not available, section is skipped.

**Optional — enables Support Ticket Queue section:**

- An AP support ticket or service request table: ticket identifier, status (active / on-hold / closed), assignee, created date, closed date, ticket category or type. Grain: one row per ticket. If no AP ticket system is connected, section is skipped.