Token导航 LogoToken导航TokenDH.com
研究检索敏感数据github未标认证来源可访问许可证需确认审计通过

erp-integrationERP 集成

Agent Skill

erp-integration 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

659

周安装

28

GitHub Stars

19

下载量

231
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:erp-integration(ERP 集成)
来源仓库:https://github.com/finsilabs/awesome-ecommerce-skills
仓库路径:skills/erp-integration
安装命令:
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill erp-integration
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill erp-integration

简介

erp-integration 构建电商与 ERP 系统间的双向数据同步,覆盖订单、库存与客户信息流转。

  • 支持 SAP、NetSuite、Odoo 等平台对接,采用事件驱动、轮询与中间件多种架构模式。
  • 重点解决数据映射、冲突处理与幂等同步问题,保障交易一致性。
  • 安装命令为 npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill erp-integration,建议确认权限与维护状态。
  • 注意该技能可能触发联网、命令执行或文件读写,需评估安全风险后再使用。

SKILL.md

ERP Integration

Overview

Build integrations between e-commerce platforms and ERP systems (SAP, NetSuite, Odoo, Microsoft Dynamics) for bidirectional sync of orders, inventory, customers, and products. This skill covers integration architecture patterns (event-driven, polling, middleware), data mapping, conflict resolution, error handling with retry strategies, and idempotent sync that prevents duplicate records.

When to Use This Skill

  • When connecting a storefront to an ERP for automated order fulfillment
  • When syncing real-time inventory levels from an ERP/WMS to the e-commerce catalog
  • When building customer master data sync between the storefront and ERP
  • When implementing product and pricing feeds from the ERP to the storefront
  • When designing a middleware layer to handle multiple integration points

Core Instructions

Step 1: Determine your platform and integration approach

PlatformIntegration OptionRecommended Approach
ShopifyShopify Admin API + webhooks for order dataUse Zapier (no-code, $20/month) or Celigo (iPaaS) for standard ERP connectors; for NetSuite use the official NetSuite Connector for Shopify app; for custom needs use Shopify webhooks
WooCommerceWooCommerce REST API + WordPress hooksUse Zapier for simple flows; install the Zynk WooCommerce connector (from £500) for SAP/NetSuite; or build a custom integration using WooCommerce's REST API
BigCommerceBigCommerce API + webhooksUse Celigo or Boomi for enterprise ERP connectors; BigCommerce has pre-built connectors for NetSuite, SAP, and Microsoft Dynamics in the App Marketplace
Custom / HeadlessFull API access — build a middleware serviceImplement event-driven order sync (store webhooks → queue → ERP adapter), polling-based inventory sync (scheduled job → ERP API → update catalog), and a dead-letter queue for failed syncs

Step 2: Platform-specific ERP integration


Shopify

Use a pre-built connector for standard ERPs:

  1. For NetSuite: Install the official NetSuite Connector for Shopify from the Shopify App Store ($150-$300/month). It syncs orders, inventory, and customers bidirectionally with no custom code
  2. For SAP: Use Celigo's SAP + Shopify integration template or contact your SAP partner for their Shopify connector
  3. For Odoo: Install the Odoo Shopify Connector module in Odoo (free, community edition) — configure your Shopify API credentials in Odoo's settings

For custom ERP connections using Shopify webhooks:

  1. In your Shopify admin, go to Settings → Notifications → Webhooks
  2. Click Create webhook and add endpoints for orders/create, orders/paid, and inventory_levels/update
  3. Your ERP middleware endpoint receives order data in JSON and transforms it to the ERP's format
  4. For inventory sync back to Shopify, use the Inventory API to update levels after each ERP poll

WooCommerce

Use Zapier for simple, low-volume ERP sync:

  1. Connect WooCommerce and your ERP (NetSuite, Odoo, Sage) in zapier.com
  2. Create a Zap: trigger = New Order in WooCommerce, action = Create Sales Order in NetSuite
  3. Map the WooCommerce order fields to your ERP's required fields in Zapier's field mapper
  4. Zapier polls WooCommerce every 15 minutes on the free plan; upgrade to Starter ($19.99/month) for faster polling

For higher volume or custom ERP connections:

  1. Install WP Webhooks (free, wordpress.org) to send WooCommerce events to your middleware
  2. Use the WooCommerce REST API (/wp-json/wc/v3/orders) with OAuth 1.0a for your middleware to pull orders
  3. For inventory sync from ERP to WooCommerce, use the WooCommerce Products API (PUT /wp-json/wc/v3/products/{id}) to update stock_quantity

Custom / Headless

Integration architecture — choose the pattern that fits your ERP:

Event-Driven (recommended for real-time order sync):
  Storefront → Webhook/Event → Message Queue (SQS/BullMQ) → ERP Adapter

Polling (for ERPs without webhooks, like legacy SAP installations):
  Scheduler → Poll ERP API → Transform → Update Storefront

Middleware Platform (for complex multi-system environments):
  Storefront ↔ Celigo / MuleSoft / Workato ↔ ERP

Idempotent order sync service:

// lib/erp/order-sync.ts
export async function syncOrder(orderId: string): Promise<void> {
  const order = await db.orders.getWithItems(orderId);

  // Check if already synced
  const existingSync = await db.syncLog.findByOrderId(orderId);
  if (existingSync?.status === 'synced') return;

  // Check ERP for existing record (guards against retries after partial failure)
  const existing = await erpAdapter.findOrderByExternalReference(order.orderNumber);
  if (existing) {
    await db.syncLog.upsert({ orderId, externalId: existing.erpOrderId, status: 'synced' });
    return;
  }

  try {
    const erpOrder = mapOrderToERP(order);
    const { erpOrderId } = await erpAdapter.createSalesOrder(erpOrder);
    await db.syncLog.upsert({ orderId, externalId: erpOrderId, status: 'synced', syncedAt: new Date() });
    await db.orders.updateMetadata(orderId, { erpOrderId });
  } catch (error) {
    await db.syncLog.upsert({ orderId, status: 'failed', lastError: error.message });
    throw error; // Let the retry mechanism handle it
  }
}

function mapOrderToERP(order: Order): ERPSalesOrder {
  return {
    externalReference: order.orderNumber,
    orderDate: order.createdAt.toISOString().split('T')[0],
    customer: {
      externalId: order.customer?.erpCustomerId || null,
      email: order.email,
      name: `${order.shippingAddress.firstName} ${order.shippingAddress.lastName}`,
    },
    shippingAddress: {
      line1: order.shippingAddress.street1,
      city: order.shippingAddress.city,
      state: order.shippingAddress.state,
      postalCode: order.shippingAddress.postalCode,
      country: order.shippingAddress.country,
    },
    lineItems: order.lineItems.map(item => ({
      sku: item.sku,
      quantity: item.quantity,
      unitPrice: item.unitPrice / 100,   // Convert cents to dollars for ERP
      taxAmount: item.taxAmount / 100,
    })),
    orderTotal: order.totalPrice / 100,
    currency: order.currency,
  };
}

BullMQ queue for reliable order sync with exponential backoff retries:

import { Queue, Worker, QueueEvents } from 'bullmq';

const orderSyncQueue = new Queue('order-sync', {
  connection: { host: process.env.REDIS_HOST, port: 6379 },
  defaultJobOptions: {
    attempts: 5,
    backoff: { type: 'exponential', delay: 5000 }, // 5s, 10s, 20s, 40s, 80s
    removeOnComplete: { count: 1000 },
    removeOnFail: { count: 5000 },
  },
});

// Producer: enqueue when order is placed
export async function onOrderPlaced(orderId: string) {
  await orderSyncQueue.add('sync-order', { orderId }, {
    jobId: `order-sync-${orderId}`, // Prevents duplicate queue entries
  });
}

// Consumer: process sync
new Worker('order-sync', async (job) => {
  await syncOrder(job.data.orderId);
}, { connection: { host: process.env.REDIS_HOST, port: 6379 }, concurrency: 5 });

Inventory sync (polling-based, ERP to storefront):

// lib/erp/inventory-sync.ts — run via scheduled job every 5 minutes
export async function syncInventoryLevels(): Promise<void> {
  const lastSyncAt = await redis.get('erp:inventory:last_sync');
  let page = 1, hasMore = true;

  while (hasMore) {
    const { items, hasMore: more } = await erpAdapter.getInventoryLevels({
      page, pageSize: 500,
      modifiedSince: lastSyncAt ? new Date(lastSyncAt) : undefined,
    });

    for (const item of items) {
      // Available = On Hand - Reserved - Safety Stock
      const available = Math.max(0, item.onHandQuantity - item.reservedQuantity - (item.safetyStock || 0));
      const current = await db.inventory.getQuantityBySku(item.sku);
      if (current === available) continue; // Skip unchanged

      await db.inventory.updateBySku(item.sku, { quantity: available, lastSyncedAt: new Date() });
      // Update Redis cache for real-time product page availability
      const productId = await db.inventory.getProductIdBySku(item.sku);
      if (productId) await redis.setex(`inventory:${productId}`, 3600, String(available));
    }

    hasMore = more;
    page++;
  }

  await redis.set('erp:inventory:last_sync', new Date().toISOString());
}

Best Practices

  • Make every sync operation idempotent — use external references (order number, SKU) to check for existing ERP records before creating; this prevents duplicates from retries
  • Use a message queue for order sync — never call the ERP synchronously during checkout; enqueue and process asynchronously with retries
  • Implement a dead-letter queue — after all retries are exhausted, move failed jobs to a DLQ for manual inspection; never silently drop messages
  • Use delta sync, not full sync — query the ERP for records modified since the last sync timestamp; full syncs don't scale past a few thousand records
  • Store the ERP record ID on your local records — after syncing an order, save the ERP order ID on your record for cross-referencing and future status lookups
  • Calculate available inventory correctlyavailable = onHand - reserved - safetyStock and clamp to zero; never use raw on-hand quantity from the ERP

Common Pitfalls

ProblemSolution
Duplicate orders in ERP from retry logicUse the e-commerce order number as an external reference and check for its existence before creating; most ERPs support duplicate-check on external IDs
Inventory quantities go negative after syncClamp available quantity to zero; Math.max(0, onHand - reserved - safetyStock)
ERP rate limits cause sync failuresImplement per-operation rate limiters (token bucket) and use the ERP's bulk/feed API for large batches instead of individual item calls
Price sync overwrites promotional pricesSeparate base prices (from ERP) from promotional prices (managed in your commerce platform); never let ERP sync overwrite active promotions
Large initial data load times outBreak the initial sync into batches with checkpointing so you can resume after a failure; process in parallel with concurrency limits

Related Skills

  • @webhook-architecture
  • @marketplace-connectors
  • @monitoring-alerting-commerce
  • @product-information-management

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

36.48%
按下载量换算84

Claude

28.48%
按下载量换算66

Cursor

20.13%
按下载量换算47

Gemini CLI

9.14%
按下载量换算21

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills