# Shopify & WooCommerce Catalog Feed Normalizer (`deepaksheoran172/catalog-feed-normalizer`) Actor

Extract, normalize, and audit Shopify & e-commerce product catalogs into clean JSON/CSV. Built for Clay.com enrichment, n8n workflows, Google Merchant feeds, and price intelligence. Pay-per-event PPE.

- **URL**: https://apify.com/deepaksheoran172/catalog-feed-normalizer.md
- **Developed by:** [Deepak Sheoran](https://apify.com/deepaksheoran172) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 catalog feed normalization runs

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

<p align="center">
  <img src="https://raw.githubusercontent.com/deepakshe/apify-b2b-super-actors/main/assets/actor_icons/catalog-feed-normalizer.png" width="96" height="96" alt="Shopify Supplier Feed & CSV Normalizer Icon" style="border-radius: 20px; box-shadow: 0 8px 24px rgba(0,0,0,0.18);" />
</p>

<p align="center">
  <a href="https://apify.com/deepaksheoran172/catalog-feed-normalizer"><img src="https://img.shields.io/badge/Apify_Store-Active_PPE-blue?style=for-the-badge&logo=apify" alt="Apify Store" /></a>
  <a href="https://apify.com/deepaksheoran172/catalog-feed-normalizer"><img src="https://img.shields.io/badge/Launch_Discount-60%25_OFF-success?style=for-the-badge" alt="60% Launch Discount" /></a>
  <img src="https://img.shields.io/badge/Architecture-Zero--Proxy_Fast-informational?style=for-the-badge" alt="Zero-Proxy Fast" />
  <img src="https://img.shields.io/badge/QA_Validation-Verified_Pass-brightgreen?style=for-the-badge" alt="Verified QA Pass" />
</p>

## Shopify Catalog Feed Normalizer — Automated Multi-Variant CSV Engine

> **Stop Paying $200–$500/Month for Rigid Catalog SaaS. Normalize 10,000+ Raw Supplier SKUs into Standardized, Schema-Compliant Shopify Product Feeds for $0.05 Base Fee ($50 / 1,000 runs).**

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue?logo=apify)](https://apify.com/deepaksheoran172/catalog-feed-normalizer)
[![Pricing](https://img.shields.io/badge/Pricing-Pay--Per--Event%20\($0.05%20base\)-green)](#cost-anchoring--pricing)
[![Validation Guarantee](https://img.shields.io/badge/🛡️%20Validation-Audit%20Report%20Guaranteed-orange)](#validation--quarantine-guarantee)
[![MCP Ready](https://img.shields.io/badge/MCP%20Server-Ready-purple)](https://mcp.apify.com/?actors=deepaksheoran172/catalog-feed-normalizer)

***

### 🎯 Pre-Configured 1-Click Task Pages

Run pre-configured, validated task workflows directly on the Apify Store:

- **[Normalize Supplier CSV for Shopify Import](https://apify.com/deepaksheoran172/catalog-feed-normalizer/examples/normalize-supplier-csv-shopify)**: Standardize raw multi-variant supplier feeds into RFC 4180 Shopify CSVs with currency formatting and formula escaping.
- **[Validate Product CSV Before Shopify Import](https://apify.com/deepaksheoran172/catalog-feed-normalizer/examples/validate-product-csv-shopify)**: Run pre-import diagnostic audits to catch duplicate SKUs, missing handles, and malformed prices before importing to Shopify Admin.

***

### ⚡ The Pain vs. Instant Relief

Manual CSV formatting and broken spreadsheet imports cost e-commerce agencies dozens of wasted billable hours:

- **The Catastrophic Cost of Broken Imports:** A single missing variant handle, unescaped comma in HTML descriptions, or raw price notation (`1.499,00 €`) corrupts Shopify imports, causes silent variant overwrites, or triggers immediate Google Shopping feed suspension.
- **The 1-Click Solution:** Feed in messy, raw vendor CSVs from dropshippers or distributors. This Actor automatically groups variants under parent handles, normalizes currencies to clean two-decimal floats, sanitizes formula injections (`=`, `+`, `-`, `@`), and outputs 100% compliant RFC 4180 Shopify product import CSVs in seconds.

#### 🔄 What This Actor Does to Your Raw Data (Before & After)

| Raw Vendor CSV Input (Dirty) | Clean Shopify Import Output (Normalized) |
|---|---|
| `Title`: `"Men's Running Shoe =SUM(A1:A10)"` | `Title`: `"'Men's Running Shoe =SUM(A1:A10)"` (Formula escaped) |
| `Price`: `"1.499,00 €"` | `Variant Price`: `1499.00` (Strict 2-decimal float) |
| `Option 1`: `"Red / XL / Cotton"` | `Option1 Name`: `"Color"`, `Option1 Value`: `"Red"` |
| `Handle`: `""` (Missing handle) | `Handle`: `"mens-running-shoe"` (Deterministic slug) |

***

### 💰 Cost Anchoring vs. Legacy SaaS

| Solution | Cost | Setup Time | Limitations |
|---|---|---|---|
| **Enterprise PIM / Matrixify Plans** | **$200 – $500 / month** | Days / Complex Config | Strict row tiers, monthly lock-in, seat charges |
| **Manual VA / Freelance Cleanup** | **$15 – $25 / hour** | 24–48 hours turnaround | Human error, missing variant links, unescaped quotes |
| **Shopify Catalog Feed Normalizer** | **$0.05 per run ($50 / 1,000 runs)** | **Instant (Zero Setup)** | **Unlimited volume, 100% RFC 4180 standard, serverless** |

*(Pay-Per-Event Primary Event `feed-normalization-run` assessed at $0.05 upon run start. Secondary per-item event \[$0.0005/item] is uninvoked by code; entire batch normalizes under the base fee. Standard platform compute credits apply; Free plan includes $5.00/month).*

***

### 🛡️ Validation & Quarantine Guarantee

> **Automated Audit Quarantine:** If your supplied supplier feed contains unparseable syntax or missing mandatory columns, this Actor does not fail silently. It outputs detailed diagnostics and quarantined records in **`VALIDATION_REPORT.json`**, allowing your team to identify and correct supplier data anomalies instantly.

***

### 🚀 Key Capabilities

- **Automatic Multi-Variant SKU Grouping:** Groups sibling variant rows under clean Shopify handles while preserving `Option1`, `Option2`, and `Option3` matrices (Size, Color, Material).
- **RFC 4180 & Spreadsheet Protection:** Neutralizes Excel/Google Sheets formula injection attacks and enforces strict CSV escaping.
- **Currency & Decimal Normalization:** Converts European punctuation (`1.299,50 €`), negative parentheticals, and currency symbols to exact two-decimal numbers.
- **Audit Validation Report:** Produces a downloadable `VALIDATION_REPORT.json` flagging duplicate SKUs, missing barcodes, and orphan images.

***

### 🔌 Plug-and-Play Integrations

#### 1. Claude Desktop & Cursor IDE (MCP Server)

Connect directly to your AI development environment via Model Context Protocol:

```json
{
  "mcpServers": {
    "catalog-normalizer": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-fetch", "https://mcp.apify.com/?actors=deepaksheoran172/catalog-feed-normalizer"]
    }
  }
}
```

#### 2. Clay.com HTTP Enrichment

Enrich your e-commerce supplier databases automatically inside Clay tables:

- **Method:** `POST`
- **URL:** `https://api.apify.com/v2/acts/deepaksheoran172~catalog-feed-normalizer/run-sync-get-dataset-items`
- **Headers:**
  - `Authorization: Bearer YOUR_APIFY_TOKEN`
  - `Content-Type: application/json`
- **Body:**
  ```json
  {
    "rawCsv": "{{supplier.raw_csv}}",
    "defaultVendor": "{{supplier.brand_name}}"
  }
  ```

#### 3. n8n & Make.com Automated Cron

Import our pre-built n8n template (`tool1_catalog_normalizer_n8n.json`) to automatically fetch vendor CSVs via FTP/HTTP, run normalization, and upload the clean dataset directly to Shopify Admin REST/GraphQL APIs on a daily schedule.

***

### 📥 Input Parameters & 1-Click Prefill

Ready to test immediately without typing — click **"Start"** on Apify Store with the prefilled sample data:

| Parameter | Type | Required | Description |
|---|---|---|---|
| `rawCsv` | String | Optional\* | Direct vendor CSV content. Pre-filled with multi-variant test data. |
| `csvUrl` | String | Optional\* | Remote URL to download supplier CSV catalog feed. |
| `mapping` | Object | Optional | Custom column overrides (e.g. `{"vendor_title": "Title"}`). Auto-detected if omitted. |
| `defaultVendor` | String | Optional | Default brand name fallback (Prefill: `ApexSuppliers Inc.`). |
| `defaultStatus` | String | Optional | Product publication status (`active` or `draft`). |

*\*Provide either `rawCsv` or `csvUrl`.*

***

### 📤 Output Artifacts

1. **Dataset**: Structured Shopify product records ready for downstream table visualization or webhook consumption.
2. **Key-Value Store**:
   - `OUTPUT_SHOPIFY_CSV.csv`: 1-click importable file for Shopify Admin (`Products > Import`).
   - `VALIDATION_REPORT.json`: Complete audit log with SKU counts, rejected rows, and field mapping summaries.

***

### ❓ High-Intent B2B FAQs

##### Q: How does it group multi-variant products together?

**A:** The normalizer detects identical product titles or parent SKU patterns and groups subsequent rows under the same URL handle, populating `Option1 Name`, `Option1 Value`, and leaving parent fields padded in strict compliance with Shopify import rules.

##### Q: Will this protect against spreadsheet formula injection?

**A:** Yes. Any field prefixed with formula evaluation triggers (`=`, `+`, `-`, `@`) is safely escaped to prevent remote code execution or spreadsheet formula exploitation.

##### Q: Can I run this directly in our agency's custom Python backend?

**A:** Yes. Run via the Apify Python SDK or execute offline using standard CLI:

```bash
python cli.py convert vendor_catalog.csv -o shopify_import.csv
```

***

### 🚀 Ready to Normalize Your Supplier Catalog?

Clean messy vendor feeds into Shopify-compliant import CSVs in seconds:

1. Click **Try for free** at the top right of this page.
2. Paste sample CSV text or provide a supplier feed URL.
3. Download `OUTPUT_SHOPIFY_CSV.csv` and import directly into **Shopify Admin > Products > Import**.

[![Try Free on Apify](https://img.shields.io/badge/Run%20on%20Apify-Try%20Free%20\($5%20Credit\)-blue?style=for-the-badge\&logo=apify)](https://apify.com/deepaksheoran172/catalog-feed-normalizer)

# Changelog

This Actor's version history is a separate document: https://apify.com/deepaksheoran172/catalog-feed-normalizer/changelog.md

# Actor input Schema

## `rawCsv` (type: `string`):

Paste vendor catalog CSV content directly. Pre-filled with ready-to-test supplier data.

## `csvUrl` (type: `string`):

Public HTTP/HTTPS URL to download the vendor CSV from.

## `mapping` (type: `object`):

Custom mapping dictionary from vendor CSV columns to Shopify fields (title, price, sku, etc.). Leave empty for automatic column detection.

## `defaultVendor` (type: `string`):

Fallback vendor or brand name to apply when vendor column is missing or blank.

## `defaultStatus` (type: `string`):

Default status for imported products in Shopify.

## Actor input object example

```json
{
  "rawCsv": "SKU,Title,Price,Description,Inventory,Option1 Name,Option1 Value\nPROD-CHAIR-01,Ergonomic Mesh Chair - Black,299.00,Commercial ergonomic high-back desk chair,45,Color,Black\nPROD-CHAIR-02,Ergonomic Mesh Chair - Gray,299.00,Commercial ergonomic high-back desk chair,30,Color,Gray\nPROD-DESK-01,Motorized Standing Desk 60in,549.00,Dual-motor adjustable height workstation,15,Color,Walnut",
  "defaultVendor": "ApexSuppliers Inc.",
  "defaultStatus": "active"
}
```

# Actor output Schema

## `results` (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 = {
    "rawCsv": `SKU,Title,Price,Description,Inventory,Option1 Name,Option1 Value
PROD-CHAIR-01,Ergonomic Mesh Chair - Black,299.00,Commercial ergonomic high-back desk chair,45,Color,Black
PROD-CHAIR-02,Ergonomic Mesh Chair - Gray,299.00,Commercial ergonomic high-back desk chair,30,Color,Gray
PROD-DESK-01,Motorized Standing Desk 60in,549.00,Dual-motor adjustable height workstation,15,Color,Walnut`,
    "defaultVendor": "ApexSuppliers Inc.",
    "defaultStatus": "active"
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepaksheoran172/catalog-feed-normalizer").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 = {
    "rawCsv": """SKU,Title,Price,Description,Inventory,Option1 Name,Option1 Value
PROD-CHAIR-01,Ergonomic Mesh Chair - Black,299.00,Commercial ergonomic high-back desk chair,45,Color,Black
PROD-CHAIR-02,Ergonomic Mesh Chair - Gray,299.00,Commercial ergonomic high-back desk chair,30,Color,Gray
PROD-DESK-01,Motorized Standing Desk 60in,549.00,Dual-motor adjustable height workstation,15,Color,Walnut""",
    "defaultVendor": "ApexSuppliers Inc.",
    "defaultStatus": "active",
}

# Run the Actor and wait for it to finish
run = client.actor("deepaksheoran172/catalog-feed-normalizer").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 '{
  "rawCsv": "SKU,Title,Price,Description,Inventory,Option1 Name,Option1 Value\\nPROD-CHAIR-01,Ergonomic Mesh Chair - Black,299.00,Commercial ergonomic high-back desk chair,45,Color,Black\\nPROD-CHAIR-02,Ergonomic Mesh Chair - Gray,299.00,Commercial ergonomic high-back desk chair,30,Color,Gray\\nPROD-DESK-01,Motorized Standing Desk 60in,549.00,Dual-motor adjustable height workstation,15,Color,Walnut",
  "defaultVendor": "ApexSuppliers Inc.",
  "defaultStatus": "active"
}' |
apify call deepaksheoran172/catalog-feed-normalizer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deepaksheoran172/catalog-feed-normalizer"
        }
    }
}
```

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/3RSgUjqJxd7SkycfH/builds/UmhcbKEaH1i3DsMUd/openapi.json
