# Feed Stack: One Inventory from Several Feed URLs

Source: https://ducted.app/help/kb/feed-stack
Category: Data sources

Some inventories are published as several feed URLs that together make one data set - most often a dealership with one feed for **New** vehicles, one for **Used** and sometimes a third for **Certified**. Feed Stack reads them all in one project and stacks their records into one inventory.

## Feed Stack or Feed Mixer?

**Feed Stack adds rows, Feed Mixer adds columns.**

- Use **Feed Stack** when each URL holds *different records* of the same inventory, in the same columns: the New feed and the Used feed list different vehicles.
- Use **[Feed Mixer](https://ducted.app/help/kb/feed-mixer)** when a second source holds *extra columns for the records you already have*, matched on a shared ID: a pricing sheet or a stock file.

Both live on the project's **Data Sources** tab, the Feed Stack card above the Feed Mixer. A project can use both: the parts are stacked first, then the Mixer joins its columns onto the whole inventory.

## What one stacked project gives you

- **One inventory.** Every refresh reads every part and serves their records together: Source Data, your channel feeds and their live URLs carry the whole stack.
- **One Main ID and one Sold Source Data.** A record that leaves any part is tracked as removed, like in any other project.
- **One set of feeds.** You map once; the parts share the project's feeds and do not add to your feed count.
- **One record limit**, counted over every part together.

Feed Stack works on projects that read a feed URL. Stores whose items are read one by one, or whose records are read from their web pages, cannot be stacked; the card says so on those projects. It is included on some plans - see [Plans and Billing](https://ducted.app/help/kb/plans-and-billing) for how many feed URLs each plan stacks.

## Adding a part

On the Data Sources tab the **Main source** is the project's own feed URL (you change it on the Settings tab). Click **+ Add part** and choose how to find the next one:

- **Feed URL** - paste the part's feed address, for example the Used inventory file your vendor publishes.
- **Dealer website** - paste the dealership's website address and Ducted finds its inventory feed, the same way as when you create a project.

Give the part a label if you like (*Used*, *Certified*), then click **Check feed**. Ducted reads the feed's first page and compares it with the main source:

- The project's **Main ID** column must be in the feed, so every record can still be told apart.
- At least **80%** of the main source's columns must be in it. With fewer, the part is refused and the missing columns are listed.
- The main source's address, or another part's, cannot be added a second time.
- **IDs that already exist** in another part are a warning, never a refusal: the earlier part's record is kept and the later copy is dropped, the main source first and then the parts in their order. A duplicate-ID finding in Feed health on a stacked project therefore means duplicates *within* one part.

Fetch the main source at least once before you add a part - the check compares against it. When the check passes, click **Add part**: every part is read straight away.

### Recognised platforms

When the main source comes from a recognised platform and the new part is on the same site, the part is read the same way where that platform allows it. Otherwise the part is read as a plain feed URL, and the check result says so. To keep a platform's columns for another dealer on that platform, add the part through **Dealer website**.

## Parts without a condition column

New and Used feeds often do not say which they are: every record of the Used feed is used, so the feed never writes it. Give a part a **Fixed value**, a column and a value stamped on every record of that part - for example `condition` = `used` on the Used part, and `condition` = `new` on the main source.

- **Always overrides the feed's value** (on by default): every record of the part gets the value, whatever the feed says.
- Switched off, only records whose cell is empty or missing get it.

A changed fixed value applies from the next refresh to every record of the part, also while the part is serving its last records. The column check counts a part's fixed column as present. The main source's fixed value belongs to the stack: removing the last part removes it too, and the confirmation says so.

## When a part cannot be read

A part that cannot be read on a refresh - its address is down or blocked, or the feed comes back empty - **keeps serving its last records**. The other parts are read as usual, so one failed part never shrinks the inventory and none of its records land in Sold Source Data.

- **On screen.** The part's row on the Data Sources tab says when it could not be read and the date its records are from; the Data Sources tab and the Source Data row on the Feeds tab show how many parts are on their last records.
- **By email.** When a part cannot be read during a **scheduled** refresh, Ducted emails you right away. You get at most one such email per project per 24 hours, and none for a fetch you run yourself - you see the result on screen. Switch it off per project under **Settings → Alerts → Part problems (Feed Stack)**; like every alert email it also needs the account-level **System alerts** email preference to be on.
- **After 3 days** without a good read, the project's Alerts page gets one **Part on old records** alert, and our team is told as well. It comes once per failing stretch: a new one only after the part read again and then failed for another 3 days.

Nothing is dropped automatically: a part keeps serving its last records until it reads again or you remove it. A part that has **never** been read successfully has nothing to serve, so when it fails the whole refresh fails and your existing data is kept until the part reads or you remove it.

## Changing, pausing and removing a part

- **Changing a part's feed URL** reads and checks the new address before it is saved, like adding a part. The part then starts over from the new address: the old address's records are no longer what it serves when a read fails.
- **Removing a part** takes its records out of your feeds at once. They are not added to Sold Source Data - removing a part is not a sale.
- **Moving to a plan that stacks fewer feed URLs** pauses the parts over the new limit, and their records leave your feeds the same way. Nothing is deleted: after you upgrade again you switch them back on yourself from the Data Sources tab.
