# Build push content from a feed

**Product recommendations** and **News feed** presets pull their content from your [Product Catalog](/product/content/product-catalog) or a registered news feed instead of a fixed title and message. Pick one of these two options when you [create the preset](/product/content/push-presets/), then configure it here.

## Compose the message

The push title and push message fields work the same as for a [Push notification](/product/content/push-presets/#add-a-push-message) preset, with one difference: they now become the fixed parts around the rows the feed returns.

* The push title is sent once, as typed. You can add a feed token to it by typing one yourself, such as `{{product.title}}`. There's no insert button for this field, unlike **Item template** below.
* The push message becomes the intro: text sent once, before the repeated rows. It also accepts a typed feed token the same way.
* **Item template**, below in **Content source**, repeats once for every row the feed returns.
* **Outro**, also in **Content source**, is sent once, after the rows.

<Aside type="note">
Intro, item template rows, and outro are joined with a line break.
</Aside>

## Configure the content source

Scroll to **Content source** below the message fields.

1. Set **Items** to how many rows to pull, from 1 to 3. It defaults to 3.
2. Set **Category** to filter which rows the rule can pick from, or leave it as **Any category**.
3. Configure the rest of the rule, which depends on the option you picked when creating the preset:

### Product recommendations

Set **Strategy** to how products are picked:

* **Bestsellers, 7 days** or **Bestsellers, 30 days:** products with the most units sold in that window. Needs `PW_OrderCreated` and `PW_OrderUpdated` events with an `items` array.
* **Newest:** the latest products added to the catalog. Ranks from catalog data only.
* **Back in stock:** products that recently came back in stock. Ranks from catalog stock changes.
* **Price drop:** products with a recent price decrease. Ranks from catalog price changes.
* **Bought together:** products frequently purchased alongside an anchor product. Needs product activity events and a device tag that holds the anchor product ID, set in the **Anchor tag** field that appears. Without a tag, Pushwoosh ignores the strategy and returns products using just **Category** and **Sort by**.
* **Recently viewed:** products the recipient recently browsed. Needs product activity events from your backend.

**Bestsellers**, **Bought together**, and **Recently viewed** need events from your backend, the same ones that power the [Products block in email](/product/content/email-content/drag-and-drop-email-editor/blocks/#get-recommended-products). See [How to set up product recommendations in email](/product/how-to-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/) for what to send.

Also set **Sort by** (**Newest**, **Price, lowest first**, **Price, highest first**, or **Title**) to order the rows the rule returns.

<Aside type="caution" title="Bought together and Recently viewed can't be previewed">
These two strategies are picked per recipient, so the editor has nothing to show for them. See [Preview a feed-driven push](#preview-a-feed-driven-push).
</Aside>

### News feed

* **Feed:** one of your account's registered feeds, or **All feeds** to pull from every feed. Feeds are registered under **Content > News Feeds**. This panel only picks a feed. It doesn't register one.
* **Ranking:**
  * **Newest:** the latest articles by publish date.
  * **Trending:** the articles with the most recent opens on your site and clicks in your emails.

<Aside type="note" title="How Trending works">
Pushwoosh counts two signals: [`PW_SiteOpened`](/product/audience-data-and-segmentation/events/default-events/#pw_siteopened), which needs the Pushwoosh Web SDK on your site, and [`PW_EmailLinkClicked`](/product/audience-data-and-segmentation/events/default-events/#pw_emaillinkclicked), which fires automatically when you send emails through Pushwoosh. Without the Web SDK, **Trending** ranks on email clicks alone, a weaker signal. When there isn't enough recent activity, **Trending** falls back to **Newest**.
</Aside>

## Fill in the item template and outro

1. Fill in **Item template**. Click **Title**, **Price**, **Category**, or **Link** (for News feed: **Title**, **Summary**, **Category**, **Author**, or **Link**) to insert a token like `{{product.title}}` at the cursor. This block repeats once per row.
2. Choose **Separator between items**: **Comma** puts rows on one line, **New line** puts each row on its own line.
3. Fill in **Outro**. The same token buttons are available here. This block is sent once, after the rows.
4. Optionally, set **Trim product title to** (or **Trim article title to**) a character count. Leave it at 0 for no trimming.

<Aside type="note">
There's no button to insert a picture token. The picture is set separately, as the push's one banner, in the next section.
</Aside>

## Show the feed's image as the banner

Enable **Use the leading item's picture as the banner** to set the push's banner to the picture of the first row the feed returns. This works whether or not **Media content** is expanded. While it's on, the **Banner URL** field under **Media content** shows this setting's name instead of an editable URL, since Pushwoosh rebuilds that URL when you save.

## Point the action at the feed

A new **Product recommendations** or **News feed** preset starts with **Open the leading item's link** already enabled in **On-click actions**, so it opens the feed's own content by default instead of a [manual action](/product/content/push-presets/#define-the-next-step-for-users-who-click-on-the-notification). Pushwoosh shows a read-only line in place of the usual action controls: "The push opens the link of the first item the feed returns."

<Aside type="caution">
Turning this toggle on or off clears whatever manual action was set, with no way to get it back. Turn it off and you'll need to set up the deep link or web page again from scratch. Link shortening is also unavailable while the toggle is on, because the link is only known once the push renders, and shortening happens before that.
</Aside>

## Set a fallback for an empty feed

Under **If the feed returns nothing**, choose what happens when the rule finds no rows:

* **Do not send to this recipient:** Pushwoosh skips the send to that recipient instead of delivering an empty push.
* **Send this text instead:** send the fallback text you type in the field that appears.

## Preview a feed-driven push

The preview panel shows the push resolved with real rows, fetched the same way the send would fetch them: product rows come from a live ranked preview of your catalog, and news rows come from reading the feed directly.

When there's nothing to show, the preview explains why instead of just going blank:

* For **Bought together** or **Recently viewed**, a note says the strategy is picked per recipient and there's nothing to preview here.
* If Pushwoosh can't read the catalog or the feed, a note says so.
* If the rule matches zero rows, a note says nothing is sent because the rule returns no products or articles. This note shows regardless of your **If the feed returns nothing** choice. If you set **Send this text instead**, the fallback text is what actually goes out despite the note. Only **Do not send to this recipient** really results in nothing being sent.

## Save the preset

When you save a **Product recommendations** or **News feed** preset, Pushwoosh checks that the assembled title, subtitle, and message compile as Liquid, the same check the send path runs. If a template doesn't compile, saving is blocked and Pushwoosh points to the field and language that failed.