Dev.to WebDev 🛠 Dev 👁 0 📖 2 min read

One product catalog, three ad platforms: keeping Google, Meta and TikTok feeds honest

We sell building materials and tools at ramo.co.il — a Next.js store on Vercel with a few thousand SKUs. Ads work better when the catalog each platform sees matches the storefront. That sounds obvious. Keeping it true ev

We sell building materials and tools at ramo.co.il — a Next.js store on Vercel with a few thousand SKUs. Ads work better when the catalog each platform sees matches the storefront. That sounds obvious. Keeping it true every day is the boring part.

The failure mode nobody notices

A product goes out of stock on the site. The Google feed still has it. Someone clicks an ad, lands on a page that says "unavailable", and leaves. Meta and TikTok keep showing yesterday's price. Support gets the same question twice: "why is the ad wrong?"

None of that shows up as a red dashboard. It shows up as wasted spend and a quiet drop in trust.

What we ship from one source

We generate three feeds from the same product table:

  1. Google Merchant Center — title, description, link, image, price, availability, GTIN/MPN when we have them, and a clean canonical URL.
  2. Meta catalog — similar fields, with Meta's id and availability conventions.
  3. TikTok catalog — same core data, plus whatever image format their upload expects (including price-overlay images when the channel needs them).

One job, three serializers. If a field is wrong in the database, all three feeds are wrong together — which is better than three feeds drifting apart.

Rules that saved us headaches

  • Availability is a live field, not a weekly export. If stock hits zero, the next feed run marks it out of stock.
  • Price is the price the customer sees, tax rules included. Ads that undercut the checkout total get rejected or refunded by the platforms.
  • Titles stay human. Keyword stuffing in feed titles gets filtered and looks bad on the product page too.
  • Images must load. A 404 image link is a silent disapproval. We check the image URL before writing the row.
  • IDs stay stable. Renaming a SKU mid-flight creates duplicate items. The feed id is the permanent product id.

How the job fits the stack

On a schedule, a worker reads active products, maps them through each platform's schema, writes the feed files (or pushes the API), and logs how many rows were added, updated, or skipped. Skipped rows get a reason: missing image, zero price, draft status, blocked brand. That log is what we open when a campaign "randomly" stops showing a hero SKU.

We keep pixel IDs and API secrets in env. Catalog shape, price rules, and which categories go into which feed live in the database so merchandising can change them without a deploy.

What to check this week

If you run paid traffic into a store:

  1. Pick five products that are live in ads.
  2. Open each feed row and the live product page side by side.
  3. Compare price, availability, and the main image.

If any of those three disagree, fix the feed pipeline before you touch bidding. Ads that point at the wrong catalog are just expensive confusion.

We keep the same discipline on our tools and materials catalog — one source of truth, three honest exports.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.