Skip to content

Case 01 · Marketing · Automation · CRM

Every available car should have its ad, and no sold car should keep one.

A used-car dealership's inventory changes every week. I connected that inventory to ad catalogs, content, measurement and sales follow-up, so the ads talk about what is actually on the lot and sales go back to the platforms as a signal.

Project
Inventory-driven dynamic marketing
Context
Champion Motors · used-car dealership in Panama
By Antonio Duque
Reviewed against the code and documentation on

01

Context and need

The dealership advertises on Meta, Google, TikTok and classifieds portals, and receives contacts through forms and WhatsApp. Reviewing the setup I found three leaks: the Meta catalog kept showing sold cars and missed available ones, sales never went back to the platforms (so bidding optimized for conversations, not buyers), and the WhatsApp button dropped the click identifier.

The need was not “more ads” but a single source of truth: the inventory published on the website, with its source, interest and outcome connected.

02

My responsibility

  • I have worked in the dealership's marketing since 2016. Here I set the strategy, diagnosed the leaks, defined the business rules and directed the build of the technical layer.
  • A media buyer on the team configures and runs the campaigns day to day; my role is to audit, decide what to measure and request changes with evidence.
  • The work was built on the dealership's website (Laravel, on a third-party commercial base) and later extracted as my own product: FreedomShop, formerly called Torre.

03

Strategy and decisions

  1. Keep three things apart that are often mixed up: dynamic marketing (the catalog mirrors inventory), inventory-generated content (per-vehicle pieces) and dynamic remarketing (showing someone the car they viewed).
  2. Retire sold cars by marking them unavailable rather than deleting them, so audiences and catalog history stay intact.
  3. Count purchases only when there is a real click trail; a manually entered channel is not attribution.
  4. Do not send the car's price as the conversion value: a sale's value is not the vehicle price, and it would distort bidding.
  5. Watch for silent failures: an integration that stops without an error looks exactly like one that works.

04

What I built

  • An inventory XML feed for a classifieds portal, with a one-hour cache that is invalidated when inventory changes.
  • Hourly Meta vehicle catalog sync via API: it reconciles inventory and catalog, retires sold cars, runs as a dry run by default and stops if it would retire more than 80% of the catalog.
  • A daily alert when the catalog stops syncing or stops matching inventory, plus a coverage alert: published cars with no ad and live ads for sold cars.
  • Pixel and Conversions API with vehicle-view, WhatsApp-contact, form and purchase events, deduplicated between browser and server.
  • Capture of UTMs and Google, Meta and TikTok click IDs in a 90-day cookie, and a WhatsApp redirect that carries the car's reference into the conversation.
  • Spend per car from Meta, analytics per car, and a phone-based contact journey that compares the declared channel with the evidence.

Real screenshots

Screens from the real system. ZoDesk ones come from its demo mode, with an invented dealership; those marked “Live” are public pages captured on November 14, 2026.

“Cars on the website” in ZoDesk: what gets published here feeds the website and the catalogs.

“Cars on the website” in ZoDesk: what gets published here feeds the website and the catalogs.

ZoDesk's Cars on the website module with fifteen fictitious cars published, their price and buttons to unpublish or edit.

05

How it works

  • Customer
  • System
  • Team
  1. Team

    Car listed

    The vehicle is published on the website, which is the inventory source.

  2. System

    Feeds and catalog

    The portal feed, the Meta catalog via API and the catalog used by the WhatsApp assistant are generated.

  3. Customer

    Ad and listing

    The visitor lands on the listing with a UTM or click ID; the source is stored and the view is recorded.

  4. Customer

    Contact

    The WhatsApp click goes through a redirect that logs the event and passes the car reference to the chat.

  5. Team

    CRM and sale

    The contact enters sales follow-up (ZoDesk) and, if they buy, the sale is linked to its source.

  6. System

    Signal back

    The conversion goes back to Google with hashed data; the WhatsApp signal to Meta is built but switched off.

  7. Team

    Decision

    Spend per car, aging stock and per-vehicle performance feed ad and pricing decisions.

Demo

The three layers

Three layers that are often confused

Diagram

  • Dynamic marketing

    Catalog and feeds mirror inventory: available cars go in and sold cars come out.

    In production
  • Inventory-generated content

    Per-vehicle pieces: creatives with UTMs per car, descriptions and video ideas for salespeople.

    In production
  • Dynamic remarketing

    Show each person the car they viewed. It needs the event and the catalog to share the same ID.

    Pending

06

Tools and what they do

Laravel and Filament
Inventory layer, feeds, scheduled commands and internal panel.
Meta Marketing API
Vehicle catalog sync and spend per product.
Pixel and Conversions API
Browser and server events deduplicated by ID.
Google Ads and GA4
Hashed-data conversions and per-vehicle analytics.
ZoDesk
Lead intake, sales follow-up and matching with the sale.

Available evidence

  • Catalog sync code with its dry run and safety limits; the first retirement of sold cars ran without errors in August 2026.
  • A written catalog diagnosis and the alert that came out of it.
  • The server scheduler with the syncs, alerts and data pulls.
  • Request documents between ZoDesk and the website recording what is built and what is missing.

07

Current status

  • Meta catalog synced with inventory

    Scheduled hourly on the server, with a daily consistency alert.

    In production
  • Classifieds portal feed

    Generated from inventory with a cache invalidated on change.

    In production
  • Pixel, Conversions API and source capture

    Events installed and deduplicated; UTM and click-ID capture is active.

    Connected
  • Offline conversions to Google

    The closed-sale signal needs a sale with an associated click; there are still few.

    Connected
  • Dynamic remarketing of the car viewed

    Event and catalog IDs do not match yet; it is not verified that the ad shows the exact car.

    Pending
  • WhatsApp conversions to Meta

    Built and switched off: the dataset still has to be linked to the WhatsApp Business account.

    Pending
  • Audiences of people who saw their result and left no details

    Documented request to the website team in November 2026.

    Proposal
  • Google Merchant Center feed

    Exists, but Google vehicle ads are not available in Panama; it was not connected.

    Built

“In production” is only used when the project’s documentation confirms it. “Built and tested” means automated tests exist, not that it is in use. “Proposal” is a documented idea, not something built.

Next steps

  • Unify the product ID between events and catalog to enable real dynamic remarketing.
  • Turn on the WhatsApp conversion signal to Meta and measure how many sales arrive with a click.
  • Build per-car, month-by-month ad budgeting, which is so far only an agreed design.

08

Lessons learned

A silent failure and a healthy system look exactly the same, so every sync has its alert.
Meta can answer “OK” while rejecting items; read the validation status, not just the response code.
With manual campaign tagging, the click ID was lost on every visit until the middleware was fixed. Measurement starts with not losing the data.

Related services

Connected cases