How to add sale badges to product feed images
Step-by-step: how to add sale badges to product feed images at scale, which channels allow them, and how to drive badge text from feed data so it never goes stale.
First, decide where the badge is even allowed
Before you design a single badge, sort your channels into two buckets. Google Shopping and Microsoft Shopping do not allow promotional overlays on the main product image, so a SALE badge there will get the product disapproved. For those channels, you express the sale through the sale_price field and Google draws the discount tag itself.
Meta, TikTok, Snapchat, and Pinterest do allow badged product images, and a clear sale badge tends to earn attention because the image is the ad. So the practical answer is almost always: badge the social and discovery images, keep the shopping-engine images clean. A good workflow produces both from one product without you maintaining two image libraries by hand.
What makes a sale badge work
A sale badge has one job: communicate the offer in the half-second a shopper scans the feed. The badges that work are simple, legible at thumbnail size, and consistent with your brand. The badges that fail are cluttered, cover the product, or fight the channel's own UI.
- Keep it to one message: a percentage, a saved amount, or a short word like SALE.
- Place it in a corner so it never hides the product itself.
- Use high contrast so it survives down-scaling to a small thumbnail.
- Match your brand color and font so it reads as yours, not as platform chrome.
- On TikTok, do not imitate TikTok's own official badges or labels.
The wrong way: editing images one at a time
The obvious approach is to open a design tool, drop a badge on each photo, and export. This works for a handful of hero products and collapses for a real catalog. The badge text depends on each product's discount. The discount changes whenever the price changes. And a catalog of thousands means thousands of manual edits, repeated every time you run a promotion.
The deeper failure is staleness. The moment a sale ends or a price moves, every hand-badged image is wrong, and a wrong discount on a live ad is worse than no badge at all. Manual badging guarantees your creative drifts out of sync with your feed.
The right way: drive the badge from feed data
The reliable method is to make the badge a template bound to feed fields and rendered automatically. You design the badge once, tell it which fields to read, and set a rule for when it appears. The pipeline does the rest for every product, and re-renders whenever the underlying data changes.
- 1Map your feed so price and sale_price are clean, typed fields.
- 2Create a badge template and bind its text to a computed discount (for example, round((price - sale_price) / price * 100)).
- 3Add a condition: show the badge only when sale_price is present and lower than price.
- 4Choose which channels get the badged image (Meta, TikTok, Snapchat, Pinterest) and which get the clean image (Google, Microsoft).
- 5Let the worker render and store each image at a stable URL, then point the export feed at it.
- 6Refresh the feed on a schedule so badges recalculate automatically when prices change.
How MartechFlow does it
In MartechFlow, the badge lives in the same pipeline as your feed. A quick badge gets you a sale flag in a couple of clicks for the channels that allow overlays. The template editor gives you full canvas control when you want branded frames and precise placement. Both read live feed data, so the discount on the image is the same number that goes into your export, and both re-render on the next refresh.
That single-source approach is the whole point. You never maintain a second image library, you never ship a badge that contradicts your price, and you never accidentally send an overlaid image to a channel that bans them.