# Invoice Checker: 3-Way Match PO, Delivery & Invoice (`ryanbot_research/islem-b2b-automation`) Actor

Upload an invoice, purchase order and delivery note (CSV, Excel or PDF). Get every over-billed line, short delivery and price change with the file row as proof, plus supplier quote comparison and a reorder plan. Built for e-commerce sellers, wholesalers and bookkeepers. $0.02 per report.

- **URL**: https://apify.com/ryanbot_research/islem-b2b-automation.md
- **Developed by:** [Woven Comet Technologies](https://apify.com/ryanbot_research) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 completed business reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Invoice Matching & Supplier Quote Comparison | ISLEM

![ISLEM: catch invoice mistakes before you pay](https://islem-api-production.up.railway.app/marketplace-media/islem-cover.jpg)

**Check invoices against orders and deliveries, compare supplier quotes and plan stock reorders — in seconds, with every exception flagged.**

**Upload the CSV, Excel or PDF exports you already have** — no JSON needed. Column names are recognised in English, German and Turkish. ISLEM returns a clear report as **Excel, HTML, CSV and JSON**: what matches, what does not, and what a person should check before paying or ordering. No AI key, no setup.

**$0.02 per completed report, Apify platform usage included.** Failed operations are not charged as reports.

▶ **Try it in your browser first:** the [free input builder](https://islem-api-production.up.railway.app/marketplace-media/start.html) prepares a request without running anything.

### See what you get

**Inspect an example → prepare your input → run on your platform.**

[Open the free input builder](https://islem-api-production.up.railway.app/marketplace-media/start.html) to prepare a small invoice, stock or supplier request in your browser. No key, upload or engine run is needed to prepare the JSON.

| Start with your task | What to send | Preview and prepare |
|---|---|---|
| Check an invoice | Invoice, order and delivery lines with matching SKUs | [10 invoiced / 8 delivered](https://islem-api-production.up.railway.app/marketplace-media/start.html#reconciliation) |
| Plan stock within a budget | Stock, sales, lead time, pack size and unit cost | [EUR 150 budget example](https://islem-api-production.up.railway.app/marketplace-media/start.html#inventory) |
| Compare suppliers | Required items, offers, shipping and delivery limits | [EUR 115 vs EUR 130 example](https://islem-api-production.up.railway.app/marketplace-media/start.html#procurement) |

These are **synthetic demonstration records** processed by ISLEM, not customer data or a market accuracy benchmark.

![Invoice exception: 10 invoiced, 8 delivered](https://islem-api-production.up.railway.app/marketplace-media/02-invoice.jpg)

![Supplier comparison and a stock plan within a cash budget](https://islem-api-production.up.railway.app/marketplace-media/03-stock-suppliers.jpg)

![ISLEM: 32 business operations across seven buyer groups](https://islem-api-production.up.railway.app/marketplace-media/01-cover.jpg)

| Example | Inspect the report | Download Excel |
|---|---|---|
| Invoice / order / delivery matching | [HTML](https://islem-api-production.up.railway.app/marketplace-media/reconciliation.html) | [Excel](https://islem-api-production.up.railway.app/marketplace-media/reconciliation.xlsx) |
| Supplier quote comparison | [HTML](https://islem-api-production.up.railway.app/marketplace-media/procurement.html) | [Excel](https://islem-api-production.up.railway.app/marketplace-media/procurement.xlsx) |
| Inventory with a EUR 150 budget | [HTML](https://islem-api-production.up.railway.app/marketplace-media/inventory.html) | [Excel](https://islem-api-production.up.railway.app/marketplace-media/inventory.xlsx) |

### Upload your files

Pick the operation, then drop your files into the matching fields:

| Operation | Upload | Columns ISLEM looks for |
|---|---|---|
| Invoice matching | Invoice + purchase order (+ delivery note) | SKU / Artikelnummer / Ürün kodu, Quantity / Menge / Adet, Unit price / Einzelpreis / Birim fiyat |
| Supplier comparison | Items you need + one file with all supplier quotes | Supplier / Lieferant / Tedarikçi, SKU, Unit price; optional Shipping and Lead time |
| Stock planning | Stock and sales list | SKU, Stock / Bestand / Stok, Sold / Verkauft / Satış; optional Pack size, Unit cost, Lead time |

Numbers like `12,50`, `1.234,56` and `1,234.56` are read correctly; a truly ambiguous value such as `1.500` stops the run and asks you to choose the number format, so nothing is guessed. Total rows are skipped and repeated SKUs at the same price are added up. Every finding names the file and row it came from.

**Try it with sample files:** [invoice (German)](https://islem-api-production.up.railway.app/marketplace-media/sample-invoice.csv), [order (English)](https://islem-api-production.up.railway.app/marketplace-media/sample-order.csv), [delivery note (Turkish)](https://islem-api-production.up.railway.app/marketplace-media/sample-delivery.csv) · [needed items](https://islem-api-production.up.railway.app/marketplace-media/sample-needed-items.csv), [supplier quotes](https://islem-api-production.up.railway.app/marketplace-media/sample-supplier-quotes.csv) · [stock list](https://islem-api-production.up.railway.app/marketplace-media/sample-stock.csv). You can also paste these links straight into the file fields. The invoice sample finds a short delivery on A1 and €1.50 over-billing on B2.

### The three jobs most teams start with

| You send | You get back |
|---|---|
| 🧾 **Invoice + purchase order (+ delivery note)** | Quantity and price differences per line, what is safe to pay, what to query with the supplier |
| 📦 **Supplier quotes for the same items** | Total landed cost incl. shipping, missing items, the cheapest offer that meets your budget and delivery date |
| 📊 **Stock, sales and lead times** | Reorder quantities in whole packs, days of cover, and a purchase draft that fits your cash budget |

### Who uses it

- **Accounts payable & bookkeepers** — catch over-billing and short deliveries before paying.
- **Purchasing teams** — compare quotes on true total cost, not just unit price.
- **Shops, wholesalers and warehouses** — know what to reorder this week and what it costs.
- **Automation builders** (n8n, Make, Zapier, custom scripts) — one API call per check, structured JSON back.

### How to run it

1. Pick an `operation` (for example `reconciliation`, `procurement` or `inventory`) and paste its `payload`. The input form is prefilled with a working example.
2. Run. Most reports finish in under 10 seconds.
3. Open the run's **Storage**: `report-0.html` (readable report), `report-0.xlsx` (Excel) and `result-0.json`. Each report also appears in the Dataset.

Batch several checks with `{"jobs": [{"operation": "inventory", "payload": {...}}, ...]}` (up to 100 jobs). Use `operation: "workflow"` to chain steps.

```json
{
  "operation": "reconciliation",
  "payload": {
    "invoice_id": "INV-001",
    "invoice":  [{"sku": "A1", "name": "Cable 1 metre", "quantity": "10", "unit_price": "12.50", "currency": "EUR"}],
    "order":    [{"sku": "A1", "name": "Cable 1 metre", "quantity": "10", "unit_price": "12.50", "currency": "EUR"}],
    "delivery": [{"sku": "A1", "name": "Cable 1 metre", "quantity": "8",  "unit_price": "12.50", "currency": "EUR"}]
  }
}
```

### Pricing

**$0.02 per completed report** (a single operation or a whole connected workflow) plus a $0.00005 start fee. **Apify platform usage is included** — there is nothing else to pay. Operations that fail or workflows stopped before completion are not charged. A batch run can produce several reports. The run stops scheduling new jobs when your spending limit is reached.

### All 32 operations

| Operation | What it does | Typical buyer |
|---|---|---|
| `reconciliation` | Invoice, purchase order and delivery matching | Accounts payable |
| `procurement` | Supplier quote comparison | Purchasing teams |
| `inventory` | Inventory reorder and budget planning | Retailers and manufacturers |
| `catalog` | Catalog normalization | E-commerce and distributors |
| `shipping` | Shipment document checks | Logistics teams |
| `contracts` | Contract deadline review | Contract operations |
| `tenders` | Tender document checklist | Bid teams |
| `workorders` | Work order and price-list quote | Field service teams |
| `support` | Knowledge-based support draft | Support teams |
| `appointments` | Appointment slot planning | Service businesses |
| `collections` | Receivables and reminder drafts | Finance teams |
| `returns` | Returns policy pre-check | Commerce support |
| `dispatch` | Skill and capacity dispatch | Field operations |
| `renewals` | Maintenance and renewal tracking | Facilities and asset teams |
| `browser` | Browser action plan | Automation developers |
| `fx_convert` | Dated reference currency conversion | International purchasing |
| `business_calendar` | Business-day due date | Operations teams |
| `invoice_import` | UBL invoice import | Finance integrators |
| `contact_clean` | Contact normalization | CRM operations |
| `table_quality` | Table quality checks | Data teams |
| `record_link` | Record linkage candidates | CRM and data teams |
| `bank_match` | Bank transaction matching | Accounting teams |
| `cashflow` | Cash-flow scenario | Finance teams |
| `margin_analysis` | Contribution margin and target price | Sellers and agencies |
| `inventory_abc` | ABC inventory classification | Warehouse teams |
| `supplier_scorecard` | Supplier delivery scorecard | Purchasing and quality |
| `sla_audit` | Support SLA audit | Support operations |
| `expense_audit` | Expense duplicate and limit checks | Finance and managers |
| `locale_normalize` | Locale-aware table conversion | International data teams |
| `calendar_export` | Calendar file export | Service and operations |
| `lei_lookup` | Legal Entity Identifier lookup | Company data teams |
| `public_holidays` | Public holiday reference | Scheduling teams |

### Good to know

- **Inputs:** uploaded CSV, Excel (.xlsx) or text PDFs with a table, or structured JSON. UBL XML invoices are supported. Scanned-PDF and photo OCR are not included. Limits: 2 MiB input, 1,000 rows per list, 100 jobs per batch, 20 workflow steps.
- **Read-only:** ISLEM never pays, emails, orders, refunds or edits your systems. It flags; a person decides.
- **Method:** explicit rules and exact decimal maths, not guesswork. Stock plans use average historical demand. Reference data (FX, holidays, LEI) is dated and sourced.
- **Troubleshooting:** `422` = invalid input (check the `error` field and the example); `review_required` = open the report; no delivery note? set `check_delivery=false`.

Process only records you are authorized to use. Reports are operational aids, not legal, tax, credit or sanctions decisions.

### Need public company research as well?

[RyanBot on Apify](https://apify.com/ryanbot_research/ryanbot-company-research?utm_source=islem_store\&utm_medium=owned\&utm_campaign=related_product) discovers companies by city and sector or researches supplied websites. [RyanBot on RapidAPI](https://rapidapi.com/MuhammednedimIpek/api/ryanbot-company-research-api?utm_source=islem_store\&utm_medium=owned\&utm_campaign=related_product) starts from your website list. Reports can include public contacts, hiring, technology, SEO and ten buyer perspectives with sources.

ISLEM processes the operational records you supply. These are separate products and subscriptions; there is no automatic transfer or shared quota. Public company research does not reveal private invoices, stock or purchasing intent.

# Actor input Schema

## `operation` (type: `string`):

Choose one of 32 operations, then provide its documented payload. Prefill is a synthetic catalog example. Use JSON mode for batches or connected workflows.

## `payload` (type: `object`):

Structured fields for the selected operation. See the README examples. Synthetic prefill is for catalog only; replace it when choosing another operation.

## `source_url` (type: `string`):

HTTPS URL ending in .pdf, .csv or .xlsx. Redirects and private networks are blocked.

## `column_mapping` (type: `object`):

Map the output field names to exact source column headers. Required when importing a public catalog URL.

## `decimal_separator` (type: `string`):

Decimal mark used by numeric columns in the imported catalog. This setting does not change the output currency.

## `invoice_file` (type: `string`):

For invoice, purchase order and delivery matching. Needs SKU, quantity and unit price columns. Upload a file or paste a public HTTPS link.

## `order_file` (type: `string`):

For invoice matching. Needs SKU, quantity and unit price columns.

## `delivery_file` (type: `string`):

For invoice matching. Needs SKU and quantity. Without it, the invoice is compared with the order only.

## `required_file` (type: `string`):

For supplier quote comparison. Needs SKU and quantity columns.

## `offers_file` (type: `string`):

For supplier quote comparison. Needs supplier, SKU and unit price columns; optional shipping and lead time columns. A quote without a quantity covers the quantity you need.

## `stock_file` (type: `string`):

For inventory planning. Needs SKU, stock on hand and units sold columns; optional pack size, unit cost and lead time columns.

## `number_format` (type: `string`):

How decimals and thousands are written in uploaded CSV or PDF files. Excel number cells are read exactly.

## `currency` (type: `string`):

Three-letter currency used when a file has no currency column or symbol.

## `budget` (type: `string`):

Purchase budget for supplier comparison or stock planning, for example 150.

## `max_lead_days` (type: `integer`):

For supplier comparison: offers slower than this are marked not eligible.

## `period_days` (type: `integer`):

For stock planning: how many days the units-sold figure in your stock file covers.

## `lead_days` (type: `integer`):

For stock planning when your stock file has no lead time column.

## `jobs` (type: `array`):

Run 1 to 100 jobs. Each item must contain operation and payload. When supplied, this batch replaces the single operation and payload fields above. Each completed report can be billed separately.

## Actor input object example

```json
{
  "operation": "catalog",
  "payload": {
    "products": [
      {
        "sku": "A1",
        "name": "Example product",
        "unit_price": "12.50",
        "evidence": {
          "source": "example.csv",
          "page": 1
        }
      }
    ]
  },
  "column_mapping": {
    "sku": "SKU",
    "name": "Name",
    "unit_price": "Price"
  },
  "decimal_separator": ".",
  "number_format": "auto",
  "currency": "EUR",
  "period_days": 30
}
```

# Actor output Schema

## `results` (type: `string`):

One record per processed job, including status, summary, evidence and review findings.

## `files` (type: `string`):

Report files and workflow step exports. Failed operations have a result JSON but no completed-report workbook.

## `summary` (type: `string`):

Completed/failed counts and SDK report-event counts. Owner-test event counts are not paid customer revenue.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "payload": {
        "products": [
            {
                "sku": "A1",
                "name": "Example product",
                "unit_price": "12.50",
                "evidence": {
                    "source": "example.csv",
                    "page": 1
                }
            }
        ]
    },
    "column_mapping": {
        "sku": "SKU",
        "name": "Name",
        "unit_price": "Price"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ryanbot_research/islem-b2b-automation").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "payload": { "products": [{
                "sku": "A1",
                "name": "Example product",
                "unit_price": "12.50",
                "evidence": {
                    "source": "example.csv",
                    "page": 1,
                },
            }] },
    "column_mapping": {
        "sku": "SKU",
        "name": "Name",
        "unit_price": "Price",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ryanbot_research/islem-b2b-automation").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "payload": {
    "products": [
      {
        "sku": "A1",
        "name": "Example product",
        "unit_price": "12.50",
        "evidence": {
          "source": "example.csv",
          "page": 1
        }
      }
    ]
  },
  "column_mapping": {
    "sku": "SKU",
    "name": "Name",
    "unit_price": "Price"
  }
}' |
apify call ryanbot_research/islem-b2b-automation --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ryanbot_research/islem-b2b-automation"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Cm1gfeWeQJjyOcQ9E/builds/9MO3PzWFaW1b4n6O5/openapi.json
