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
- 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).
- Retire sold cars by marking them unavailable rather than deleting them, so audiences and catalog history stay intact.
- Count purchases only when there is a real click trail; a manually entered channel is not attribution.
- 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.
- 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.
05
How it works
- Customer
- System
- Team
- Team
Car listed
The vehicle is published on the website, which is the inventory source.
- System
Feeds and catalog
The portal feed, the Meta catalog via API and the catalog used by the WhatsApp assistant are generated.
- 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.
- Customer
Contact
The WhatsApp click goes through a redirect that logs the event and passes the car reference to the chat.
- Team
CRM and sale
The contact enters sales follow-up (ZoDesk) and, if they buy, the sale is linked to its source.
- System
Signal back
The conversion goes back to Google with hashed data; the WhatsApp signal to Meta is built but switched off.
- 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 productionInventory-generated content
Per-vehicle pieces: creatives with UTMs per car, descriptions and video ideas for salespeople.
In productionDynamic 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
- In production
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.
- Connected
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.
- Pending
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.
- Proposal
Audiences of people who saw their result and left no details
Documented request to the website team in November 2026.
- Built
Google Merchant Center feed
Exists, but Google vehicle ads are not available in Panama; it was not connected.
“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
Marketing connected to data and operations
Marketing and Sales Process Automation
I connect inventory, campaigns, CRM and email so what you advertise exists, what you measure is true and what breaks raises an alert.
Advertising you can measure
Ads management and control
We set up and run campaigns so you know what works, what each lead costs and where the next dollar should go.
Advertising profitability
Advertising ROI measurement
Connect spend, leads, sales and margin to see which campaigns actually return money.
Connected cases
Data-driven scripts and content
From metric to hypothesis, from hypothesis to script, and back to the data.
Monitoring and action dashboards
Dashboards that don't stop at the number: every out-of-range indicator suggests a concrete action.
Financing chatform
A credit form turned into a conversation: one question at a time, with guidance and context for the salesperson.