
Meta Ads Integration
- 138 installs
- 41 repo stars
- Updated March 13, 2026
- finsilabs/awesome-ecommerce-skills
Integrate Meta Ads APIs with an ecommerce stack to sync catalogs, track conversions, create custom audiences, and automate campaign events from storefront and checkout data.
About
Ecommerce Meta ads integration skill from awesome-ecommerce-skills for building technical connections to Facebook and Instagram advertising. Covers catalog sync, pixel and CAPI events, audience creation, and campaign automation hooks tied to storefront orders and customer data.
- Connects product catalogs to Meta Business tools
- Implements conversion and pixel event tracking
- Supports custom audience and retargeting flows
- Handles API auth and ecommerce-specific payloads
Meta Ads Integration by the numbers
- 138 all-time installs (skills.sh)
- Ranked #2,664 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill meta-ads-integrationAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 138 |
|---|---|
| repo stars | ★ 41 |
| Last updated | March 13, 2026 |
| Repository | finsilabs/awesome-ecommerce-skills ↗ |
What it does
Integrate Meta Ads APIs with an ecommerce stack to sync catalogs, track conversions, create custom audiences, and automate campaign events from storefront and checkout data.
Files
Meta Ads Integration
Overview
Meta (Facebook/Instagram) is the dominant paid social channel for ecommerce, but reliable attribution requires pairing the browser-based Meta Pixel with server-side Conversions API (CAPI). Post-iOS 14, browser signals alone under-report 30–60% of conversions; CAPI restores signal fidelity by sending purchase events directly from your server. For Shopify, WooCommerce, and BigCommerce, official integrations handle both Pixel and CAPI automatically — no custom code required. Custom code only belongs in the Custom/Headless section.
When to Use This Skill
- When setting up Meta advertising for a new ecommerce store
- When conversion data in Ads Manager looks under-reported after iOS 14 rollout
- When launching Dynamic Product Ads (DPA) and needing catalog feed sync
- When ROAS is declining and you need to restore the signal quality Meta's algorithm relies on
- When adding retargeting audiences based on product viewers and add-to-cart events
Core Instructions
Step 1: Choose your integration approach
| Platform | Recommended Method | CAPI Support | Catalog Sync |
|---|---|---|---|
| Shopify | Native Meta Sales Channel | Yes (built-in) | Yes (automatic) |
| WooCommerce | Facebook for WooCommerce plugin | Yes (built-in) | Yes (automatic) |
| BigCommerce | Meta channel in Channel Manager | Yes (built-in) | Yes (automatic) |
| Custom / Headless | Meta Pixel + facebook-nodejs-business-sdk | Manual CAPI implementation | Manual feed generation |
All three major platforms have official Meta integrations that install both the Pixel and CAPI in a single setup — use these rather than manually pasting Pixel code.
Step 2: Connect your platform to Meta
---
Shopify
1. Go to Shopify Admin → Sales Channels → + → Facebook & Instagram 2. Install the Facebook & Instagram sales channel 3. Connect your Meta Business Manager account and select your Facebook Page and Ad Account 4. Under Data Sharing, select Maximum — this enables server-side CAPI in addition to the browser Pixel 5. Shopify automatically:
- Installs the Meta Pixel on all pages
- Fires ViewContent, AddToCart, InitiateCheckout, and Purchase events
- Sends the same events via CAPI from Shopify's servers (deduplication handled automatically)
- Syncs your product catalog to Meta Commerce Manager for Dynamic Product Ads
6. Go to Facebook & Instagram → Overview to verify pixel connection status 7. In Meta Events Manager → Data Sources → [Your Pixel]: check Event Match Quality (EMQ) score — aim for 7+/10
---
WooCommerce
1. Install Facebook for WooCommerce (free, official Meta plugin) from the WordPress plugin directory 2. Go to WooCommerce → Facebook → Get Started and connect your Meta Business Manager account 3. Under Facebook Connection → Data Sharing Level: select Maximum 4. The plugin installs the Meta Pixel across all pages and fires standard events automatically 5. CAPI is enabled automatically under the Maximum data sharing setting 6. Go to WooCommerce → Facebook → Product Sync to trigger an initial product catalog sync to Meta Commerce Manager 7. Verify catalog sync status in Meta Commerce Manager → Catalog → Data Sources
---
BigCommerce
1. Go to BigCommerce Admin → Channel Manager → Add a Channel 2. Select Facebook & Instagram 3. Connect your Meta Business Manager account 4. Enable Enhanced Conversions (CAPI) during setup 5. BigCommerce syncs your product catalog automatically and registers it in Meta Commerce Manager for Dynamic Product Ads 6. Check product sync status in Channel Manager → Facebook & Instagram → Products
---
Custom / Headless
For headless stores, you must install both the browser Pixel and server-side CAPI manually.
Browser-side Pixel (add to `<head>` on every page):
// Replace YOUR_PIXEL_ID with your Pixel ID from Meta Events Manager
fbq('init', 'YOUR_PIXEL_ID');
fbq('track', 'PageView');
// Product page
fbq('track', 'ViewContent', {
content_ids: [product.sku],
content_type: 'product',
value: product.price,
currency: 'USD',
});
// Purchase — pass eventID for deduplication with CAPI
const purchaseEventId = `purchase-${orderId}`;
fbq('track', 'Purchase', {
content_ids: order.lineItems.map(i => i.sku),
value: order.subtotal,
currency: order.currencyCode,
order_id: order.id,
}, { eventID: purchaseEventId });Server-side CAPI (send from your order webhook):
import { FacebookAdsApi, ServerEvent, UserData, CustomData, EventRequest } from 'facebook-nodejs-business-sdk';
FacebookAdsApi.init(process.env.META_CAPI_ACCESS_TOKEN!);
async function trackPurchaseCapi(order: Order, req: Request) {
const eventId = `purchase-${order.id}`; // MUST match the eventID passed to fbq()
const userData = new UserData()
.setEmail(order.customerEmail) // SDK hashes PII automatically (SHA-256)
.setPhone(order.customerPhone)
.setFirstName(order.customerFirstName)
.setLastName(order.customerLastName)
.setZip(order.shippingAddress?.zip)
.setCountry(order.shippingAddress?.countryCode)
.setClientIpAddress(req.ip)
.setClientUserAgent(req.headers['user-agent'] as string)
.setFbp(req.cookies['_fbp']) // _fbp cookie = browser identity signal
.setFbc(req.cookies['_fbc']); // _fbc cookie = click identity signal
const customData = new CustomData()
.setValue(order.subtotal)
.setCurrency(order.currencyCode)
.setContentIds(order.lineItems.map(i => i.sku))
.setContentType('product')
.setNumItems(order.lineItems.length)
.setOrderId(order.id);
const event = new ServerEvent()
.setEventName('Purchase')
.setEventId(eventId)
.setEventTime(Math.floor(Date.now() / 1000))
.setUserData(userData)
.setCustomData(customData)
.setActionSource('website');
await new EventRequest(process.env.META_CAPI_ACCESS_TOKEN!, process.env.META_PIXEL_ID!)
.setEvents([event])
.execute();
}Product Catalog Feed for Dynamic Product Ads: Generate a CSV feed and serve it at a stable URL. Register it in Meta Commerce Manager → Catalog → Data Sources → Add Data Feed.
// Generate CSV with required columns: id, title, description, availability, condition, price, link, image_link, brand
// Schedule regeneration every 4 hours — serve at a stable /feeds/meta-catalog.csv endpointStep 3: Campaign structure for ecommerce
Build a three-tier campaign structure in Meta Ads Manager:
Campaign 1: Prospecting
- Objective: Sales → Purchases
- Budget: 60% of total Meta budget
- Audience: Broad (US 18–65, no interest targeting) — use Advantage+ targeting
- Ads: 3–5 creatives (static image, video, carousel, UGC)
- Use Advantage+ Shopping Campaigns (ASC) — Meta's automated format consistently outperforms manual campaign structures for ecommerce
Campaign 2: Retargeting
- Budget: 30% of total Meta budget
- Ad Set 1: Viewed product but did not add to cart (last 7 days)
- Audience: Website custom audience → ViewContent event, last 7 days
- Ads: Dynamic Product Ads (DPA) carousel showing viewed products
- Ad Set 2: Added to cart but did not purchase (last 3 days)
- Audience: Website custom audience → AddToCart, last 3 days; exclude Purchases last 3 days
- Ads: DPA + urgency messaging
Campaign 3: Retention / LTV
- Budget: 10% of total Meta budget
- Ad Set: Customer list audience (upload from Shopify → Customers export)
- Exclude customers who purchased in the last 30 days
- Ads: New arrivals, cross-sell products
- Ad Set: 1% Lookalike of top purchasers (great for prospecting)
Step 4: Set up Dynamic Product Ads
For Shopify and WooCommerce, the official integrations auto-sync the product catalog. Verify setup:
1. Go to Meta Commerce Manager → Catalogs → [Your Catalog] 2. Check Data Sources — confirm your platform's feed is syncing and last updated within 24 hours 3. Check Items — verify products show correct prices, availability, and images 4. In Ads Manager → Create Ad Set: select your catalog under Catalog Sales campaign objective 5. Choose Dynamic formats and creatives — Meta automatically selects the best ad format per user
Step 5: Verify Event Match Quality
In Meta Events Manager → Data Sources → [Your Pixel] → Overview:
| Signal | How to Improve |
|---|---|
| EMQ below 6 | Send more user data (email, phone, fbp/fbc cookies) |
| CAPI not firing | Check platform integration is set to Maximum data sharing |
| Duplicate conversions | Verify deduplication — eventID must match between Pixel and CAPI |
| ViewContent not firing | Check the platform integration is active and pixel is on product pages |
Best Practices
- Use Advantage+ Shopping Campaigns (ASC) for prospecting — Meta's automated campaign type consistently outperforms manual structure for ecommerce; start here, not manual campaigns
- Set data sharing to Maximum on Shopify/WooCommerce — this single setting enables CAPI and is worth significantly more accurate attribution than the default
- Pass `_fbp` and `_fbc` cookies in CAPI — these are the strongest identity signals for iOS 14+ attribution; include them in every CAPI event
- Use `order_id` as the deduplication key — prevents duplicate conversion counting when both Pixel and CAPI fire for the same purchase
- Exclude recent purchasers from prospecting — add a 30-day purchaser exclusion to cold campaigns to protect budget
- Refresh creative every 4–6 weeks — Meta campaigns show creative fatigue quickly; rotate 3–5 variations per ad set
Common Pitfalls
| Problem | Solution |
|---|---|
| Duplicate purchase conversions in Ads Manager | Ensure eventID is identical in both Pixel and CAPI calls for the same event; Shopify's native integration handles this automatically |
| Conversions under-reported after iOS 14 | Set data sharing to Maximum in the Shopify Facebook channel settings or enable CAPI in WooCommerce Facebook plugin |
| Dynamic Product Ads show wrong price | Shopify/WooCommerce catalog syncs happen up to every 24 hours; for time-sensitive price changes, trigger a manual sync |
| Low EMQ score despite native integration | Go to Meta Events Manager → check that both browser and server events are showing; verify the integration is fully authorized |
| iOS 14+ campaign reach is low | Go to Meta Business Manager → Brand Safety → Domains → Verify your domain; enable Aggregated Event Measurement |
| Ad account disabled | Never send raw (unhashed) PII through the API; use the official SDK which hashes all data automatically |
Related Skills
- @google-ads-ecommerce
- @tiktok-ads-integration
- @google-shopping-feed
- @email-marketing-automation
- @marketing-attribution-dashboard
{
"context": "Tests whether the agent correctly implements a Meta Conversions API (CAPI) server-side purchase event handler using the official Node.js SDK, with proper deduplication, identity signals, and event structure.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Official SDK package",
"max_score": 10,
"description": "Uses 'facebook-nodejs-business-sdk' (not a custom HTTP client, axios-based approach, or unofficial package)"
},
{
"name": "SDK initialization",
"max_score": 8,
"description": "Calls FacebookAdsApi.init() with the access token before making any API calls"
},
{
"name": "action_source set to website",
"max_score": 8,
"description": "Sets action_source (or calls setActionSource) to 'website' on the ServerEvent"
},
{
"name": "eventTime in Unix seconds",
"max_score": 8,
"description": "Sets eventTime as Unix epoch seconds (e.g. Math.floor(Date.now() / 1000)), NOT milliseconds"
},
{
"name": "eventId present",
"max_score": 8,
"description": "Sets a unique eventId (or event_id) on the CAPI event for deduplication purposes"
},
{
"name": "fbp cookie passed",
"max_score": 8,
"description": "Includes the _fbp cookie value in the userData (via setFbp or fbp field)"
},
{
"name": "fbc cookie passed",
"max_score": 8,
"description": "Includes the _fbc cookie value in the userData (via setFbc or fbc field)"
},
{
"name": "clientIpAddress passed",
"max_score": 8,
"description": "Includes the client IP address in userData (via setClientIpAddress or equivalent)"
},
{
"name": "clientUserAgent passed",
"max_score": 8,
"description": "Includes the User-Agent header value in userData (via setClientUserAgent or equivalent)"
},
{
"name": "Webhook-triggered CAPI",
"max_score": 8,
"description": "CAPI event is fired from a webhook/server-side handler, not from browser-only code"
},
{
"name": "Subtotal used for value",
"max_score": 8,
"description": "Uses order subtotal (not the total including tax/shipping) as the value field in customData"
},
{
"name": "EventRequest execution",
"max_score": 10,
"description": "Creates an EventRequest with the pixel ID and calls execute() (or equivalent) to send the event"
}
]
}
Server-Side Purchase Tracking for Ecommerce Platform
Problem Description
A mid-sized ecommerce company recently migrated to a headless storefront. Their marketing team has noticed that reported purchase conversions in Meta Ads Manager have dropped by roughly 40% compared to their previous platform — a known issue after iOS 14 privacy changes that caused browsers to block or restrict tracking pixels.
The engineering team needs to implement server-side purchase tracking that fires from the backend when an order is confirmed. The company already uses Node.js/TypeScript on their backend. They have a META_CAPI_ACCESS_TOKEN and META_PIXEL_ID available as environment variables. The backend receives a webhook payload when an order is paid, containing the customer details, shipping address, order line items, and request metadata.
Your task is to write the server-side CAPI integration module and the webhook handler that uses it. The solution should send reliable purchase signals from the server that Meta's algorithm can use for optimization, using the strongest available identity signals to maximize attribution quality.
Output Specification
Produce the following files:
capi-client.ts— A reusable CAPI client module that initializes the Meta SDK and exposes asendCapiEventfunctionpurchase-webhook.ts— A webhook handler function (trackPurchaseCapi) that calls the CAPI client when an order is paidpackage.json— Package manifest listing the required dependencies
The implementation should be production-quality TypeScript. Include comments explaining key decisions.
Input Files
The following type definitions describe the data available in the webhook handler. Extract them before beginning.
=============== FILE: types.ts =============== export interface Order { id: string; subtotal: number; // order subtotal before tax and shipping totalWithTax: number; // full amount including tax and shipping currencyCode: string; customerEmail: string; customerPhone?: string; customerFirstName: string; customerLastName: string; shippingAddress?: { zip?: string; countryCode?: string; }; lineItems: Array<{ sku: string; quantity: number; price: number }>; }
export interface WebhookRequest { ip: string; headers: Record<string, string>; cookies: Record<string, string>; body: { order: Order }; }
{
"context": "Tests whether the agent correctly implements browser-side Meta Pixel standard events with deduplication, uses subtotal for purchase value, and properly hashes PII for a customer audience sync function.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Pixel in <head>",
"max_score": 8,
"description": "The Meta Pixel base code is placed inside the HTML <head> element (not in the body or footer)"
},
{
"name": "ViewContent event",
"max_score": 6,
"description": "Fires fbq('track', 'ViewContent', ...) on the product detail page with content_ids and value fields"
},
{
"name": "AddToCart event",
"max_score": 6,
"description": "Fires fbq('track', 'AddToCart', ...) when a product is added to cart"
},
{
"name": "Purchase event",
"max_score": 6,
"description": "Fires fbq('track', 'Purchase', ...) on the order confirmation page"
},
{
"name": "content_type is 'product'",
"max_score": 8,
"description": "All standard events that include content_type use the value 'product' (not 'product_group' or other values)"
},
{
"name": "Subtotal not total for value",
"max_score": 8,
"description": "The Purchase event uses order subtotal (pre-tax) for the value field, not the total including tax/shipping"
},
{
"name": "eventID in Purchase pixel call",
"max_score": 9,
"description": "The Purchase fbq() call includes an eventID option (third argument object with eventID key) for deduplication"
},
{
"name": "Matching dedup IDs",
"max_score": 9,
"description": "The eventID passed to fbq() and the eventId passed to CAPI use the same value for the same Purchase event"
},
{
"name": "order_id in Purchase event",
"max_score": 8,
"description": "The Purchase pixel event includes order_id (or orderId) field in the event data"
},
{
"name": "SHA-256 PII hashing",
"max_score": 9,
"description": "Customer PII (email, phone, name) is hashed with SHA-256 before being sent to any Meta API"
},
{
"name": "Lowercase+trim before hashing",
"max_score": 9,
"description": "PII values are normalized to lowercase and trimmed of whitespace before SHA-256 hashing"
},
{
"name": "Phone normalization",
"max_score": 9,
"description": "Phone numbers have non-digit characters removed (or are normalized to E.164 format) before hashing"
},
{
"name": "CSP allows connect.facebook.net",
"max_score": 5,
"description": "The Content Security Policy configuration or documentation includes connect.facebook.net in an allowed domain list"
}
]
}
Ecommerce Checkout Tracking and Customer Audience Sync
Problem Description
A growing online apparel brand has been running Meta ads for two years but is struggling with attribution gaps. Their marketing analyst notices that the number of purchases reported in Meta Ads Manager is consistently lower than what their order database shows — the gap has been widening since a recent iOS update. The dev team suspects their tracking is incomplete: they may be missing events on some pages, and they haven't set up server-side redundancy yet.
Beyond the immediate tracking gaps, the growth team also wants to start building high-value retargeting audiences by syncing their existing customer list to Meta so they can create lookalike audiences from their top spenders. The customer data is stored internally and must be handled carefully before being sent anywhere outside the company.
The engineering lead has asked you to: 1. Implement complete browser-side funnel tracking across the product detail page, cart, and checkout confirmation 2. Add a server-side customer audience sync function that sends hashed customer data to Meta's Marketing API 3. Document the Content Security Policy domains that must be allowed for the Pixel to function
Produce working TypeScript/JavaScript code and an HTML snippet. The solution will be reviewed by the security team, so PII handling must be correct.
Output Specification
Produce the following files:
pixel-events.js— Browser-side JavaScript implementing Pixel tracking for all key funnel stages (product view, add to cart, checkout start, purchase confirmation). Include a noscript fallback snippet in a comment.audience-sync.ts— TypeScript function that hashes customer PII and syncs a customer list to a Meta custom audience via the Meta Marketing APIcsp-config.md— A short document listing the domains that must be whitelisted in the Content Security Policy for Meta Pixel to load and fire correctlydedup-flow.md— A brief explanation of how the deduplication ID is generated client-side and passed to the server
Input Files
The following files describe the data models available. Extract them before beginning.
=============== FILE: storefront-types.ts =============== export interface Product { sku: string; name: string; price: number; }
export interface CartItem { sku: string; quantity: number; price: number; }
export interface Cart { items: CartItem[]; totalValue: number; }
export interface Order { id: string; subtotal: number; // pre-tax, pre-shipping totalWithTax: number; // full amount customer paid currencyCode: string; lineItems: CartItem[]; }
export interface Customer { email: string; phone?: string; firstName: string; lastName: string; }
{
"context": "Tests whether the agent generates a Meta-compliant product catalog feed CSV with the correct required fields, proper data transformations (title/description limits, price format, HTML stripping), and appropriate scheduling configuration.",
"type": "weighted_checklist",
"checklist": [
{
"name": "csv-writer package",
"max_score": 9,
"description": "Uses the 'csv-writer' package (createObjectCsvWriter) rather than a custom CSV serializer or a different CSV library"
},
{
"name": "id field present",
"max_score": 6,
"description": "Feed includes an 'id' column (product SKU or unique identifier)"
},
{
"name": "title field present",
"max_score": 5,
"description": "Feed includes a 'title' column"
},
{
"name": "description field present",
"max_score": 5,
"description": "Feed includes a 'description' column"
},
{
"name": "availability field present",
"max_score": 5,
"description": "Feed includes an 'availability' column with values like 'in stock' or 'out of stock'"
},
{
"name": "condition field present",
"max_score": 5,
"description": "Feed includes a 'condition' column"
},
{
"name": "price field present",
"max_score": 5,
"description": "Feed includes a 'price' column"
},
{
"name": "link field present",
"max_score": 5,
"description": "Feed includes a 'link' column (product URL)"
},
{
"name": "image_link field present",
"max_score": 5,
"description": "Feed includes an 'image_link' column"
},
{
"name": "brand field present",
"max_score": 5,
"description": "Feed includes a 'brand' column"
},
{
"name": "google_product_category field",
"max_score": 5,
"description": "Feed includes a 'google_product_category' column"
},
{
"name": "Title truncated to 150 chars",
"max_score": 8,
"description": "Title values are truncated to a maximum of 150 characters"
},
{
"name": "Description HTML stripped",
"max_score": 8,
"description": "HTML tags are stripped from description values before writing to the feed"
},
{
"name": "Description truncated to 5000 chars",
"max_score": 8,
"description": "Description values are truncated to a maximum of 5000 characters"
},
{
"name": "Price format X.XX USD",
"max_score": 8,
"description": "Price values are formatted as '<amount> USD' with exactly 2 decimal places (e.g. '19.99 USD'), not just a number"
},
{
"name": "4-hour schedule",
"max_score": 8,
"description": "Feed regeneration is scheduled to run every 4 hours (e.g. cron expression '0 */4 * * *' or equivalent)"
}
]
}
Dynamic Product Ad Catalog Feed for Ecommerce Store
Problem Description
An ecommerce retailer wants to launch Dynamic Product Ads (DPA) on Meta (Facebook/Instagram) to automatically retarget customers who browsed products but didn't purchase. To power these ads, Meta requires a product catalog feed that lists all active inventory with structured product data. The feed needs to be machine-readable, regularly refreshed so prices and availability stay accurate, and conform to Meta's catalog specification.
The backend is built with Node.js/TypeScript. The products are already available in a database abstraction layer (provided below). The team needs a catalog feed generator script and a scheduled job configuration that keeps the feed up to date. Since product prices and inventory can change throughout the day, the feed should never become stale — the team was burned before by ads showing outdated prices after a flash sale.
Output Specification
Produce the following files:
generate-catalog-feed.ts— A TypeScript script that generates the catalog CSV feed from the product datacron-schedule.md— A short document describing the cron schedule to use and the command to run, with a brief explanation of the chosen frequency
Run the script to produce catalog-feed.csv using the sample data provided below.
Input Files
The following files provide sample product data and the database abstraction layer. Extract them before beginning.
=============== FILE: sample-products.json =============== [ { "sku": "SHOE-001", "name": "CloudWalk Running Shoe", "description": "<p>The <strong>CloudWalk</strong> is our best-selling running shoe. <br/>Featuring responsive foam cushioning and a breathable mesh upper, it handles everything from track workouts to marathon training. Available in 12 colors.</p><p>Recommended for neutral runners.</p>", "stockQuantity": 142, "price": 89.99, "slug": "cloudwalk-running-shoe", "images": [{ "url": "https://cdn.example.com/shoes/cloudwalk-main.jpg" }], "brandName": "SwiftStep", "gpcCategory": "187" }, { "sku": "SHOE-002", "name": "TrailBlazer Hiking Boot — Waterproof Edition with Advanced Gore-Tex Lining for Extended Backcountry and Multi-Day Trek Adventures", "description": "Built for serious terrain. The TrailBlazer features a Gore-Tex waterproof membrane, Vibram outsole, and full-grain leather upper. Tested in conditions from the Scottish Highlands to the Himalayas.", "stockQuantity": 0, "price": 219.00, "slug": "trailblazer-hiking-boot", "images": [{ "url": "https://cdn.example.com/shoes/trailblazer-main.jpg" }], "brandName": "SwiftStep", "gpcCategory": "187" }, { "sku": "SHIRT-045", "name": "Performance Dry-Fit Training Tee", "description": "<ul><li>Moisture-wicking fabric</li><li>Anti-odor treatment</li><li>Flatlock seams</li></ul>Great for gym or casual wear.", "stockQuantity": 88, "price": 34.50, "slug": "performance-dry-fit-tee", "images": [{ "url": "https://cdn.example.com/shirts/dry-fit-tee-main.jpg" }], "brandName": "SwiftStep", "gpcCategory": "212" } ]
=============== FILE: db.ts =============== import products from './sample-products.json';
interface Product { sku: string; name: string; description: string; stockQuantity: number; price: number; slug: string; images: Array<{ url: string }>; brandName: string; gpcCategory: string; }
export const db = { products: { findAll: async (_opts?: unknown): Promise<Product[]> => { return products.filter((p: Product) => p.stockQuantity > 0 || true); }, }, };
const STORE_URL = process.env.STORE_URL ?? 'https://shop.example.com'; const STORE_NAME = process.env.STORE_NAME ?? 'SwiftStep';
export { STORE_URL, STORE_NAME };
{
"name": "finsi/meta-ads-integration",
"version": "0.1.0",
"summary": "Set up and optimize Meta (Facebook/Instagram) ad campaigns with Conversions API server-side tracking, dynamic product ads, and catalog sync for ecommerce",
"skills": {
"meta-ads-integration": {
"path": "SKILL.md"
}
}
}