Deals websites
Build a deals site with Content Egg — ready-made deal pages, a deals archive, voting, and deals that expire on their own.
A deals site publishes one page per offer: a product, its current price, what it used to cost, and a button to the store. What separates a good deals site from a stale one is freshness: a deal that sold out or went back up in price should stop being shown as a deal.
Content Egg has a Deals feature built for exactly this. It adds a Deal post type whose pages assemble themselves from your product data, a deals archive with sorting and filters, visitor voting, and a lifecycle that expires deals automatically. It works with any theme, in both the free and the Pro version.

How deals work
A deal is a post of its own type, not a regular post. Deals get their own archive (
/deals/), their own store and category pages, and their own list in wp-admin.A deal is one offer from one store. You add products to a deal the usual way, and one of them is the deal's main offer. Its price, discount and stock decide the deal's status. Other products you add appear lower on the page as "All offers".
The page builds itself. You write a line or two about the deal. Price, discount, store, the buy button, price history, a price alert form, the store's coupons and related deals are all added automatically.
Deals expire on their own. When the product goes out of stock, its price rises, or the deal's end date passes, the deal is marked expired. It stays online, greyed out, so the page keeps its search traffic.
Step 1: Turn deals on
Go to Content Egg → Settings → Deals and tick Enable deals. A new Deals menu appears in wp-admin.

Enable deals
Adds the Deal post type, the deals archive, voting and the Deals block.
Deal URL slug
The URL base of a single deal. Default deal, e.g. /deal/my-deal/.
Deals archive slug
The URL of the deals listing. Default deals, i.e. /deals/. Must differ from the deal slug.
Expire when the price rises by (%)
A deal expires when its price rises more than this above the price it was published at. Default 5.
Reactivate automatically
Brings a deal back when the product is back in stock or its price falls back. Deals that ended, or that you expired by hand, never come back on their own.
Hide expired deals from listings
Removes expired deals from the archive and from Deals blocks. Their pages stay online either way.
Noindex expired deals
Asks search engines not to index a deal page once it has expired.
Deal button text
The text of the buy button on a deal page. Leave empty for Get deal at and the store name (Get deal when the store is unknown). Supports %MERCHANT%, %DOMAIN%, %PRICE% and %STOCK_STATUS%, e.g. Get it for %PRICE%.
Deal voting
Shows up/down voting on deals.
Only logged-in users can vote
Restricts voting to registered users.
Hot deal score
Deals whose vote score reaches this number get a Hot badge on their card and page. 0 turns the badge off. Default 50.
Deals per archive page
How many deals the archive shows per page. Default 24.
Step 2: Choose where deals come from
Deals use your existing Content Egg modules, so a deal can come from any store you already work with.
Amazon, Walmart, eBay, Best Buy and other API modules (Pro): the best fit when you post deals from marketplaces.
Feed modules (free and Pro): import an affiliate network's product feed and create deals from it, including automatically. See Feed Import.
Offer module: add a deal from any store by URL, with a price you enter yourself.
Whichever you use, the module's Price update setting decides how often a deal's price and stock are re-checked, and so how quickly an expired deal is noticed. See Price update.
Step 3: Add deals
There are three ways to add deals. Most sites use more than one.
From a list of product links
Deals → Add deals opens Bulk Import with the built-in Deal preset already selected. Paste product URLs or keywords, one per line, choose the module, and run it. Each line becomes a deal.

The Deal preset creates deals as drafts, titled after the product and with the product's description as the text, so you can add a line of your own before publishing. The imported product becomes the deal's main offer.
You can create your own deal presets too: in Import Presets, set Post Type to Deal. Deals are filed under Deal Categories, not post categories, so use Dynamic categories to create them from the product's category, or set them after import.
One deal at a time
Deals → Add New Deal, then add a product with Content Egg's product search as you would in any post. The first product with a price becomes the main offer. Write a short description and publish.
Automatically, with "real discounts only"
An Auto Import rule with a Deal preset keeps adding deals from a keyword list on a schedule. Two rule settings keep it to real deals:
Minimum discount (%): imports only products at least this much below their old price. Products the source reports no saving for are skipped.
In-stock products only: skips products that are out of stock.

The rule's log shows how many products were skipped, e.g. Skipped by discount or stock rule: 7.
Managing a deal
When you edit a deal, the Deal panel in the editor sidebar shows its state and lets you change it.

Main offer
Choose which product the deal is about, when it has several. Choosing one resets the deal's reference price to that product's current price.
Deal ends
Set a date and time when the deal ends. The page shows a countdown, and the deal expires when the time comes. Clear removes the end date.
Mark expired / Mark active again
Expire a deal by hand, or bring an expired deal back. Bringing it back resets the reference price to today's price.
Coupon code / Coupon note
Give the deal its own coupon code, with an optional one-line note. See Deals with a coupon code.
Refresh
Reload the panel after you add or remove products.
The panel also shows the deal's votes.
Deals → All Deals lists every deal with its price, discount, status, votes, and when its price was last checked. The status filter shows only active or only expired deals.

Deals with a coupon code
Many deals need a code at checkout. Enter it in the Deal panel under Coupon code, add a Coupon note if the code needs explaining (e.g. Extra 20% off at checkout), and click Save coupon.
The code then appears on the deal page, next to the price and the buy button, with a Copy button. The deal's card in the archive and in blocks gets a Coupon label.

The coupon belongs to the deal. It has no end date of its own: set Deal ends if the code expires, and the deal expires with it.
Remove in the panel deletes the coupon.
Shop-wide coupons from Shops & coupons still appear lower on the deal page, as before.
When deals expire
A deal's status is re-checked every time its price is updated, and once an hour for end dates.
Expired: out of stock
The main offer is out of stock.
Yes, when it is back in stock.
Expired: the price went up
The price rose more than your threshold above the price the deal was published at.
Yes, when the price falls back.
Expired: no longer available
The main offer was removed from the deal.
Yes, when it is added back.
Expired: the deal has ended
The deal's end date has passed.
No. Set a new end date or use Mark active again.
Expired
You expired it by hand.
No. Use Mark active again.
"Comes back on its own" applies only while Reactivate automatically is on.
An expired deal stays online. Its page and card are greyed out with the reason, voting is closed, and the button reads Check current price instead of Get deal. By default, expired deals are hidden from the archive and from Deals blocks.

What visitors see
The deal page
From top to bottom, each part appears only when there is something to show:
breadcrumbs: Home › Deals › category › deal;
the product image with a discount badge; the store, the deal's category and when it was posted; the title; the price, old price and discount, with a Hot badge for highly voted deals;
Checked N hours ago: when the price was last verified;
Lowest price in 30 days: shown only when the price history covers at least 30 days, the price was higher earlier in that period, and today's price is the lowest in it. New deals earn this badge over time;
a countdown, when the deal has an end date;
the deal's coupon code, if it has one;
the buy button (Get deal at and the store name by default, or your Deal button text), which uses your affiliate link redirects when they are on, and voting;
your description, under Deal details;
price history (once the product has at least two recorded prices) and a price alert form for the main offer;
All offers, when the deal has products from more than one store;
the store's coupons from Shops & coupons;
related deals from the same category or store;
comments.
Deal pages also output Product structured data with a single Offer for the main offer, including priceValidUntil when the deal has an end date.
The deals archive
/deals/ lists all active deals as cards. A row of category links sits under the title. Visitors can sort by Newest, Biggest discount, Popular or Ending soon, filter by store and category, and show only deals With coupon.

Every store and every category has its own page too, e.g. /deals/store/amazon-com/ and /deals/category/electronics/. Stores are created automatically from the deal's shop, so a new store needs no setup. You can rename a store, or add a description to it, under Deals → Stores.
Store and category pages
Breadcrumbs appear on every deal page, the archive and each store and category page. They include BreadcrumbList structured data, unless Yoast SEO or Rank Math is active: those plugins output their own.
A store page starts with the store's logo, its number of deals, its description and a Visit link to the store. It also shows the store's coupons from Shops & coupons. If the store has an About text in Shops, that text appears below the deals.
With Cashback Tracker installed, a store page also links to that store's Cashback Tracker shop page, where members earn cashback.
A category page shows links to its subcategories.

Voting
Visitors can vote a deal up or down, once per deal. The score appears on the deal and its card, and Popular sorts by it. Voting closes when a deal expires.
The Deals block
Put deals anywhere on your site, such as a homepage, a sidebar or a category page, with the Deals block from the Content Egg block category.

Sort
Newest, Biggest discount, Popular, Ending soon
Number of deals
1–48
Columns
1–6
Only deals from the last N days
e.g. 1 for "Today's deals", 7 for "Top this week"; 0 for all
Store slugs
comma-separated, e.g. amazon-com
Category slugs
comma-separated
Hide expired deals
on or off
Only deals with a coupon code
on or off (coupon_only=1 in the shortcode)
In the classic editor, or in a widget, use the shortcode with the same options:
A few layouts that work well on a homepage:
Hot right now:
sort=popular days=7Biggest discounts:
sort=discountEnding soon:
sort=endingToday's deals:
sort=new days=1
A recommended workflow
Start with one or two stores you already have affiliate access to, and turn deals on.
Post your first deals by hand with Add deals, so you see how pages and expiry behave with your modules.
Set the module's Price update to a schedule that suits your deals. Once or twice a day is enough for most sites.
Build the homepage from Deals blocks: popular this week, biggest discounts, ending soon.
Add Auto Import rules with a minimum discount once you trust a source, and keep their preset on Draft at first.
Keep expired deals hidden from listings but online. Turn on Noindex expired deals only if many thin, expired pages start to hurt your site.
Customizing the look
Deal pages follow your theme's header, footer and fonts, and they work with classic and block themes.
Colors and spacing are CSS custom properties. Set any of them in your theme's CSS, on :root or on any wrapper:
Templates can be overridden from your theme. To replace a whole page, copy it into your theme's folder under the same name: single-cegg_deal.php, archive-cegg_deal.php, taxonomy-deal_store.php or taxonomy-deal_category.php.
To change one part, copy it into yourtheme/content-egg/deals/:
_hero.php
The top of the deal page: image, price, button, voting
_sections.php
Price history, price alert, all offers, coupons, related deals
_card.php
A deal card in the archive and in blocks
_coupon.php
The coupon code box on the deal page
_votes.php
The voting widget
_toolbar.php
The archive's sort links and filters
_breadcrumbs.php
The breadcrumbs
_term_header.php
The header of a store or category page
_chips.php
The row of category links
Two filters change the navigation from code: cegg_deal_breadcrumbs edits the breadcrumb trail (return an empty array to hide it), and cegg_deal_store_cashback_url changes or removes the Cashback Tracker link on a store page.
The Hot badge can also be tuned from code. cegg_deal_hot_score changes the threshold, and cegg_deal_is_hot decides per deal:
Copy the originals from content-egg/application/deals/views/.
FAQ
Do I need a special theme? No. Deals work with any theme, classic or block.
Does it work in the free version? Yes. All deal features are in the free version. The only difference is which modules you can use: Amazon and Walmart, for example, are Pro modules.
Why does my new deal not show the "Lowest price in 30 days" badge? The badge needs at least 30 days of price history for the deal's product, and it only appears when today's price is the lowest in that period. It shows up on its own once the history exists.
Can I use deals and regular posts on the same site? Yes. Deals have their own post type, archive and menu, and they don't change your posts.
What happens to my deals if I turn the feature off? The deal pages and the archive go offline, but the deals themselves stay in your database. Turn the feature back on and they return as they were.
Last updated