{"id":"545f839d-54ae-4d15-88e4-19cb1245ff6c","slug":"clawhub-zmtucker-drivethru-payable-matching","name":"drivethru-payable-matching","description":"Payable matching for BaconCo — reconcile vendor documents in Odoo's Documents app against their purchase orders and correct incorrect PO line pricing. Use for requests like \"check the Purchasing folder against the POs and fix the pricing\", \"match the vendor invoice / order confirmation / acknowledgement to its PO\", \"AP price matching / invoice-to-PO matching / three-way match\", \"reconcile the vendor documents and mark the POs checked\", or \"go through the Purchasing folder\". The flow: read every document in a Documents-app folder (extracting text out-of-context so large batches don't bloat the context window — falling back to a page render + OCR/vision for scanned or custom-encoded PDFs that won't extract as text), pull the PO number / line items / unit prices from each, compare to the purchase order line by line, correct any wrong `price_unit`, post a \"checked\" log note on the PO (internal, never a \"Send message\"), and FILE every document into the `Matched` or `Questions` subfolder — escalating genuine questions to a reviewer (default Zach Tucker). Also runs the buying-group payables flow: pull Sports Inc invoices from the SportsLink API (via the `sportsinc-sportslink` adapter), reconcile each to its PO, correct price variances, create the vendor bill and — when the bill total matches the invoice within tolerance — POST it, leaving any mismatch in draft for a human (\"get the Sports Inc invoices and bill them\", \"match the SI invoices to POs and post the payables\", \"match the vendor invoice and post the bill if it matches\"). Handles the multi-shipment case where one PO returns several Sports Inc invoices, splitting it into one vendor bill per shipment via `account.move.line` edits (the `ap_*_bill_line(s)` tools). Runs at volume on a low-cost model. Driven by the Odoo `drivethru_mcp` MCP server; complements the broader `drivethru-odoo` skill.","canonicalUrl":"https://www.xpersona.co/agent/clawhub-zmtucker-drivethru-payable-matching","sourceUrl":"https://clawhub.ai/zmtucker/drivethru-payable-matching","homepage":"https://clawhub.ai/zmtucker/skills/drivethru-payable-matching","source":"CLAWHUB","vendor":{"slug":"clawhub","label":"Clawhub","url":"https://clawhub.ai/zmtucker/skills/drivethru-payable-matching"},"protocols":["OPENCLEW"],"capabilities":[],"trustScore":null,"trustConfidence":"unknown","artifactCount":0,"benchmarkCount":0,"lastRelease":"0.10.0","freshnessAt":"2026-10-10T13:48:21.095Z","freshnessLabel":"Oct 10, 2026","securityReviewed":true,"openapiReady":false,"stats":[{"label":"Trust score","value":"Unknown"},{"label":"Compatibility","value":"OpenClaw"},{"label":"Freshness","value":"Oct 10, 2026"},{"label":"Vendor","value":"Clawhub"},{"label":"Artifacts","value":"0"},{"label":"Benchmarks","value":"0"},{"label":"Last release","value":"0.10.0"}],"factsPreview":[{"factKey":"vendor","category":"vendor","label":"Vendor","value":"Clawhub","href":"https://clawhub.ai/zmtucker/skills/drivethru-payable-matching","sourceUrl":"https://clawhub.ai/zmtucker/skills/drivethru-payable-matching","sourceType":"profile","confidence":"medium","observedAt":"2026-10-10T13:48:21.095Z","isPublic":true},{"factKey":"protocols","category":"compatibility","label":"Protocol compatibility","value":"OpenClaw","href":"https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-drivethru-payable-matching/contract","sourceUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-drivethru-payable-matching/contract","sourceType":"contract","confidence":"medium","observedAt":"2026-10-10T13:48:21.095Z","isPublic":true},{"factKey":"traction","category":"adoption","label":"Adoption signal","value":"1.4K downloads","href":"https://clawhub.ai/zmtucker/drivethru-payable-matching","sourceUrl":"https://clawhub.ai/zmtucker/drivethru-payable-matching","sourceType":"profile","confidence":"medium","observedAt":"2026-10-10T13:48:21.095Z","isPublic":true},{"factKey":"latest_release","category":"release","label":"Latest release","value":"0.10.0","href":"https://clawhub.ai/zmtucker/drivethru-payable-matching","sourceUrl":"https://clawhub.ai/zmtucker/drivethru-payable-matching","sourceType":"release","confidence":"medium","observedAt":"2026-09-23T18:16:20.449Z","isPublic":true},{"factKey":"handshake_status","category":"security","label":"Handshake status","value":"UNKNOWN","href":"https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-drivethru-payable-matching/trust","sourceUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-drivethru-payable-matching/trust","sourceType":"trust","confidence":"medium","observedAt":null,"isPublic":true}],"highlights":["1.4K downloads","Trust evidence available"],"agentCard":{"name":"drivethru-payable-matching","description":"Payable matching for BaconCo — reconcile vendor documents in Odoo's Documents app against their purchase orders and correct incorrect PO line pricing. Use for requests like \"check the Purchasing folder against the POs and fix the pricing\", \"match the vendor invoice / order confirmation / acknowledgement to its PO\", \"AP price matching / invoice-to-PO matching / three-way match\", \"reconcile the vendor documents and mark the POs checked\", or \"go through the Purchasing folder\". The flow: read every document in a Documents-app folder (extracting text out-of-context so large batches don't bloat the context window — falling back to a page render + OCR/vision for scanned or custom-encoded PDFs that won't extract as text), pull the PO number / line items / unit prices from each, compare to the purchase order line by line, correct any wrong `price_unit`, post a \"checked\" log note on the PO (internal, never a \"Send message\"), and FILE every document into the `Matched` or `Questions` subfolder — escalating genuine questions to a reviewer (default Zach Tucker). Also runs the buying-group payables flow: pull Sports Inc invoices from the SportsLink API (via the `sportsinc-sportslink` adapter), reconcile each to its PO, correct price variances, create the vendor bill and — when the bill total matches the invoice within tolerance — POST it, leaving any mismatch in draft for a human (\"get the Sports Inc invoices and bill them\", \"match the SI invoices to POs and post the payables\", \"match the vendor invoice and post the bill if it matches\"). Handles the multi-shipment case where one PO returns several Sports Inc invoices, splitting it into one vendor bill per shipment via `account.move.line` edits (the `ap_*_bill_line(s)` tools). Runs at volume on a low-cost model. Driven by the Odoo `drivethru_mcp` MCP server; complements the broader `drivethru-odoo` skill.","source":"CLAWHUB","sourceId":"clawhub:s17fq291581evd78xzn1930b0n87bfny:drivethru-payable-matching","homepage":"https://clawhub.ai/zmtucker/skills/drivethru-payable-matching","repository":"https://clawhub.ai/zmtucker/drivethru-payable-matching","documentation":"https://www.xpersona.co/agent/clawhub-zmtucker-drivethru-payable-matching","protocols":["OPENCLEW"],"examples":[{"kind":"example","language":"bash","snippet":"# 1. Read the whole folder as TEXT (no base64, no render) — ONE call\npython3 scripts/paymatch.py extract '{\"folder\": \"Purchasing\"}'\n\n# 1a. Scheduled batch? Narrow the extraction instead of pulling every file:\n#     document_ids = only these docs; name_excludes = drop by name substring\n#     (case-insensitive); max_docs = cap the batch (extras reported as\n#     skipped_beyond_max_docs). folder still scopes the listing.\npython3 scripts/paymatch.py extract '{\"folder\": \"Purchasing\", \"document_ids\": [7617, 7536]}'\npython3 scripts/paymatch.py extract '{\"folder\": \"Purchasing\", \"name_excludes\": [\"sanmar\"], \"max_docs\": 8}'\n\n# 1b. Any document flagged needs_vision (scanned or custom-encoded) → render its\n#     page(s) to PNG (+ OCR if tesseract is present), then read the image(s)\npython3 scripts/paymatch.py render '{\"document_id\": 485}'\n#\n# Each extracted document also carries `po_candidates` (the distinct PO refs in\n# its text, each canonicalized to Odoo's `P<digits>` name — so a bare \"PO 14594\"\n# and a \"P14594\" token both surface as `P14594`) and `multi_invoice` (true when\n# it holds several invoices — >1 distinct PO, or >1 \"Invoice #/No/Number\"\n# header). On multi_invoice, treat the PDF as several invoices: process EACH\n# against its own PO (resolve by name, dedupe, bill/post per invoice) rather than\n# billing only the first — a batch PDF is usually one invoice per page. These are\n# HINTS; verify against the text.\n\n# 2. Per document: pull the PO trimmed to matchable fields (incl. qty_received)\npython3 scripts/paymatch.py po-lines '{\"po\": \"P13189\"}'\n\n# 2b. Partial shipment? Read the PO's prior log notes to see what's already checked\npython3 scripts/paymatch.py notes '{\"po\": \"P13137\"}'\n\n# 3. Correct any wrong line(s) in one call (PO must be confirmed)\npython3 scripts/paymatch.py apply '{\"po_id\": 13145, \"lines\": [{\"line_id\": 40941, \"price_unit\": 11.94}]}'\n\n# 4a. Clean/fixed → post the checked LOG NOTE AND file to Matched (one call)\npython3 scripts/paymatch.py matched '{\"po_id"},{"kind":"example","language":"bash","snippet":"# Create the DRAFT bill from a reconciled PO\npython3 scripts/paymatch.py bill '{\"po_id\": 13145, \"vendor_bill_number\": \"<inv#>\", \"invoice_date\": \"2026-07-22\", \"expected_total\": 1041.90, \"tolerance\": 0.02, \"reviewer_user_id\": 6, \"review_note\": \"...\"}'\n\n# Post it — ONLY when the bill total matches the vendor invoice\npython3 scripts/paymatch.py post '{\"bill_id\": 8842, \"expected_total\": 1041.90, \"tolerance\": 0.02, \"note\": \"Matched to <inv#>; totals reconcile.\"}'"}]}}