One static ad format that has worked well for us is advertising deals that are live on Zomunk. Say there’s a Bangalore–Dubai deal for ₹18,000. Earlier, we’d send it to our designer, wait for the creative, then upload it through Meta Ads Manager. The usual process.
We've now moved on to ChatGPT to build a "control centre" that handles the creative, ad creation and expiry tracking.
| Measure | Rating (out of 5) |
|---|---|
| Time saved | ⏰⏰⏰ |
| Money saved | 💲💲 |
Watch it
In the demo, we selected the live New Delhi–Rome deal at ₹37,840, reviewed its creative, created the ad and confirmed it appeared in Meta.
Here's how it works: When a deal goes live, Zomunk’s backend sends a JSON payload to a webhook endpoint in the app. It includes the deal ID, route, price, destination image URL and other details. The same endpoint receives deal updates and expiry events.
The app verifies the webhook’s signature and saves the deal. I can then select it in the panel and review a ready-made ad preview which is created using the deal details and destination image (both included in the JSON).
The creative uses a fixed layout with the deal’s existing photo and fare. The app renders it as a 1080 × 1920 PNG using a browser canvas. ChatGPT helped build the tool; we don’t need an image-generation model or AI credits for each ad, so there are no image-generation charges per creative.
Creating ads
After reviewing the preview, I click Create ad.
The server calls Meta’s Marketing API, which runs through the Graph API. It uploads the PNG, creates the ad creative, and creates an ad inside our configured India ad set. The app also adds tracking parameters and names the ad using the country, route, price and deal ID.
The app saves the Meta ad ID against the Zomunk deal ID. That lets it identify the exact ad when a later deal event arrives.
Pausing the deal
An expiry event can contain only the event type, a unique event ID and the stable deal ID. Here’s an example payload with illustrative IDs:
{
"event": "deal.expired",
"event_id": "expiry-event-001",
"deal_id": "deal-example-001"
}
The app looks up the associated Meta ad and sends a pause request. The request body is form-encoded:
POST https://graph.facebook.com/v26.0/<META_AD_ID>
Content-Type: application/x-www-form-urlencoded
status=PAUSED
The server authenticates the request with its stored Meta access token. If Meta doesn’t confirm the pause, the app records it as pending and returns an error asking the sender to retry the same event.
Human in the loop
I still choose which deals to advertise, review the creative, adjust the photo crop or labels when needed, and decide the campaign setup. The tool handles rendering, uploading, naming and pausing the associated ad when it receives an expiry event.
A process that could take a few hours across the designer handoff and campaign setup now takes me roughly 10 seconds of interaction for a straightforward deal.