# WooCommerce CSV Import Checker & Catalog Diff (`overbifrost/woocommerce-csv-import-checker-catalog-diff`) Actor

Compare current and proposed WooCommerce catalog CSVs before import. SKUFuse flags significant price changes, stock going to zero, unmatched SKUs, duplicates, and rows requiring manual review. Comparison only — it never writes to your store.

- **URL**: https://apify.com/overbifrost/woocommerce-csv-import-checker-catalog-diff.md
- **Developed by:** [Lasse](https://apify.com/overbifrost) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.007 / comparison completed

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Compare the WooCommerce catalog you have now with the CSV update you are about to import. **SKUFuse** surfaces risky price, stock, SKU, product-type, and variation changes before anything is written to your store.

This is a **WooCommerce CSV import preflight and catalog comparison tool**, not an importer. It never connects to WooCommerce, edits products, or writes stock.

### WooCommerce CSV import checker: what it catches

Depending on the selected profile, SKUFuse can flag:

- Price drops or increases beyond your configured thresholds
- Stock changing from a positive value to zero
- Duplicate, unmatched, ambiguous, or uncheckable SKUs
- Product identity and product-type changes
- WooCommerce variation ordering and parent problems
- Variation creation risks under WooCommerce's **Update existing products** import mode
- Stock inheritance changes on variations
- Incomplete coverage instead of silently guessing

A generic CSV diff tells you that two cells differ. SKUFuse evaluates those differences in a **WooCommerce import context** and produces explicit review findings before you import the update.

### Best for

- WooCommerce merchants reviewing product CSV updates before import
- Agencies handling recurring catalog updates for clients
- Wholesalers and suppliers processing large price and stock files
- Automated catalog workflows that need deterministic review output before the write step

### Quick start: check a WooCommerce CSV before import

1. Keep **Run synthetic demo** enabled and press **Start** for a safe first run.
2. Review the built-in 3-row example with a ~90% price drop and stock going to zero.
3. For real data, turn the demo off and choose the appropriate comparison profile.
4. Upload the current WooCommerce catalog CSV and the proposed import CSV.
5. Confirm the required declarations, run the comparison, and open **Review report (HTML)**.

You can also use inline CSV, public HTTPS URLs, Apify datasets, or a saved SKUFuse baseline.

### WooCommerce comparison profiles

| Profile | Best for |
|---|---|
| `woo_simple_price_stock_v1` | Simple products with SKU, regular price, and stock review |
| `woo_product_variations_v2` | Variable products and variations, including identity, parent, ordering, creation-risk, and stock-inheritance checks |

The variations profile requires `confirmUpdateExistingProducts: true` because its import-sensitive checks model WooCommerce's **Update existing products** behavior.

### Outputs for human review and automation

Every completed comparison produces:

- **`REVIEW.html`** — readable review report
- **`OUTPUT`** — canonical JSON comparison report
- **`FINDINGS.csv`** — spreadsheet-ready findings
- **Default dataset item** — the canonical report for downstream Apify workflows
- **`RUN_METADATA`** — operational and billing metadata

The report distinguishes review findings from unmatched or uncheckable data and uses bounded output for large catalogs.

### Saved baselines, schedules, and webhooks

SKUFuse can store named catalog baselines for later comparisons. For recurring checks, save the Actor input as an Apify Task and attach an Apify Schedule. An optional `reviewWebhook` can send a small summary only for selected statuses such as `review_required` or `incomplete`.

SKUFuse itself does not schedule imports or write to WooCommerce.

### Pricing

Pay per event, with platform usage included. **All prices below are USD per event**, not per 1,000 events.

| Event | Free | Starter | Scale | Business |
|---|---:|---:|---:|---:|
| `comparison-completed` | $0.01 | $0.009 | $0.008 | $0.007 |
| `row-evaluated` | $0.00001 | $0.00001 | $0.00001 | $0.00001 |
| `apify-actor-start` | $0.00005 | $0.00005 | $0.00005 | $0.00005 |

- **Comparison:** the primary, infrequent event; charged at most once when a completed report evaluates at least one proposed row.
- **Rows:** one event per evaluated row, including unchanged rows. Multiple findings on one row still count as one row event.
- **Start:** charged by Apify, including failed runs. One event at up to 1 GB; higher memory adds start events.

| Example, at up to 1 GB | Free | Starter | Scale | Business |
|---|---:|---:|---:|---:|
| Built-in example: 3 evaluated rows | $0.01008 | $0.00908 | $0.00808 | $0.00708 |
| Comparison: 1,000 evaluated rows | $0.02005 | $0.01905 | $0.01805 | $0.01705 |

**Maximum cost per run is a spending cap, not a minimum bill.** The minimum allowed cap is $0.011. That covers the built-in example at up to 1 GB; for 1,000 evaluated rows on Free, use $0.021 or more.

Unmatched rows, uncheckable rows, header-only files, and insufficient-budget runs are not billed as evaluated-row events. Custom events are charged after report delivery and a complete-cost budget check. The [Pricing tab](https://apify.com/overbifrost/woocommerce-csv-import-checker-catalog-diff/pricing) is authoritative.

### Important boundaries

- **Comparison only:** no import, store connection, live-state verification, repair, or automatic approval.
- A report with no findings is **not a guarantee that a later import is safe**.
- Matching is deterministic; ambiguous identities are not guessed.
- SKU matching is exact and case-sensitive where the selected profile uses SKU identity.
- Catalog comparisons support up to **100,000 data records per file** under the documented limits.
- Remote CSV sources are HTTPS-only and subject to strict size and network limits.

### API

Use the Actor technical name:

```text
overbifrost/woocommerce-csv-import-checker-catalog-diff
```

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('overbifrost/woocommerce-csv-import-checker-catalog-diff').call(input);
```

### Related SKUFuse Actors

- [Shopify CSV Import Checker & Catalog Diff](https://apify.com/overbifrost/shopify-csv-import-checker-catalog-diff) — review Shopify product and variant CSV changes before import.
- [Inventory CSV Diff & Stock Change Checker](https://apify.com/overbifrost/inventory-csv-diff-stock-change-checker) — review inventory snapshot and stock-sync changes by SKU or SKU + location.

### FAQ

#### Does SKUFuse import or modify WooCommerce products?

No. It only compares the current and proposed data and produces review outputs. The write/import step stays outside SKUFuse.

#### Is this only a WooCommerce CSV validator?

No. A validator checks whether one file is structurally acceptable. SKUFuse compares **current vs. proposed** data and highlights material import changes, ambiguity, unsupported rows, and incomplete coverage.

#### Can I try it without preparing files?

Yes. Leave **Run synthetic demo** on and start the Actor. The default Store run uses fixed synthetic data and produces a normal review report and dataset item.

#### Can I run recurring checks?

Yes. Saved baselines can be combined with Apify Tasks, Schedules, and the optional conditional review webhook for recurring pre-import review.

# Changelog

This Actor's version history is a separate document: https://apify.com/overbifrost/woocommerce-csv-import-checker-catalog-diff/changelog.md

# Actor input Schema

## `demoMode` (type: `boolean`):

Recommended first run. Uses a fixed 3-row example with a large price drop and stock going to zero. Turn this off before comparing your own files. The demo is billed like a normal 3-row comparison.

## `schemaVersion` (type: `string`):

Use Simple products for ordinary SKU, price, and stock files. Use Products & variations when variable products, parent relationships, IDs, or stock inheritance matter.

## `currentCsvFile` (type: `string`):

Upload the catalog CSV that represents the current state (up to 10 MB). Use exactly one current source.

## `proposedCsvFile` (type: `string`):

Upload the WooCommerce CSV you plan to import (up to 10 MB). Use exactly one proposed source.

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

Required for real comparisons. Enter the three-letter ISO 4217 code used by both files, for example USD. SKUFuse labels the report with this currency; it does not convert prices.

## `confirmComparablePrices` (type: `boolean`):

Required for real comparisons. Confirm that both files use the same currency and price basis, such as both net or both gross.

## `confirmSimpleProducts` (type: `boolean`):

Only needed when either CSV lacks the Type column. This asserts that rows without Type are simple products.

## `confirmUpdateExistingProducts` (type: `boolean`):

Required only for Products & variations. Confirm that the planned WooCommerce import has Update existing products enabled.

## `rules` (type: `object`):

Control which price and stock changes are highlighted for review.

## `maxFindings` (type: `integer`):

Limit the retained finding list to 1–1000 entries. SKUFuse still counts all findings when the list is capped.

## `currentCsv` (type: `string`):

Alternative to file upload: paste the current CSV as text (max 512 KB). Use exactly one current source.

## `proposedCsv` (type: `string`):

Alternative to file upload: paste the proposed CSV as text (max 512 KB). Use exactly one proposed source.

## `currentCsvUrl` (type: `string`):

Public HTTPS URL returning the current CSV (max 10 MB). HTTPS port 443 only; redirects and URL credentials are rejected.

## `proposedCsvUrl` (type: `string`):

Public HTTPS URL returning the proposed CSV (max 10 MB). HTTPS port 443 only; redirects and URL credentials are rejected.

## `csvDelimiter` (type: `string`):

Delimiter used by uploaded, pasted, or URL CSV files. Dataset and saved-baseline sources use canonical comma CSV.

## `currentDataset` (type: `string`):

Alternative current source: select an Apify dataset. SKUFuse requests READ-only access.

## `proposedDataset` (type: `string`):

Alternative proposed source: select an Apify dataset containing the planned update. SKUFuse requests READ-only access.

## `currentDatasetMapping` (type: `object`):

Optional visual mapping when current dataset field names differ from WooCommerce columns.

## `proposedDatasetMapping` (type: `object`):

Optional visual mapping when proposed dataset field names differ from WooCommerce columns.

## `baseline` (type: `object`):

Optional recurring workflow. Save, replace, inspect, delete, or compare against a named catalog baseline without writing JSON.

## `reviewWebhook` (type: `object`):

Optional encrypted webhook configuration for API or Task input. Hidden from the Form view so customers are never asked to enter JSON.

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

Platform-provided integration envelope for chained Apify runs.

## Actor input object example

```json
{
  "demoMode": true,
  "schemaVersion": "woo_simple_price_stock_v1",
  "currency": "USD",
  "confirmSimpleProducts": false,
  "maxFindings": 1000,
  "currentCsvUrl": "https://example.com/exports/current.csv",
  "proposedCsvUrl": "https://example.com/exports/proposed.csv"
}
```

# Actor output Schema

## `reviewHtml` (type: `string`):

No description

## `findingsCsv` (type: `string`):

No description

## `report` (type: `string`):

No description

## `datasetItem` (type: `string`):

No description

## `runMetadata` (type: `string`):

No description

## `errorRecord` (type: `string`):

No description

# 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 = {
    "demoMode": true,
    "schemaVersion": "woo_simple_price_stock_v1"
};

// Run the Actor and wait for it to finish
const run = await client.actor("overbifrost/woocommerce-csv-import-checker-catalog-diff").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 = {
    "demoMode": True,
    "schemaVersion": "woo_simple_price_stock_v1",
}

# Run the Actor and wait for it to finish
run = client.actor("overbifrost/woocommerce-csv-import-checker-catalog-diff").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 '{
  "demoMode": true,
  "schemaVersion": "woo_simple_price_stock_v1"
}' |
apify call overbifrost/woocommerce-csv-import-checker-catalog-diff --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,overbifrost/woocommerce-csv-import-checker-catalog-diff"
        }
    }
}
```

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/r4hgNENY5bFRdbiAk/builds/zpPwozhQXbgjG69OU/openapi.json
