Import and export lifecycle data
You can change lifecycle states, successors, seasons and the never-out-of-stock flag for many products at once with a spreadsheet. The products import reads eight lifecycle columns, and the products export writes the same eight, so you can export, edit and import again. This page lists each column, the rules it follows and the messages you can see.
For the import itself (template, upload, mapping, preview), see Import products from a spreadsheet. Every other product column is in the Importable product columns reference.
Before you begin
- To import, you need the Import permission under Products.
- To change a lifecycle or successor column, you also need the Lifecycle permission under Products. Without it, you can still import a file whose lifecycle cells match what the products already have. See Permission below.
- To export, you need the Export permission under Products.
- Seasons must exist first. Add any season codes your file uses under Settings → Products → Product seasons. See Set up seasons and carryover.
Where the columns appear
| Where | What you get |
|---|---|
| Products Template in the import dialog | The Import Here sheet has the eight columns as headers. The Field Guide sheet describes each one under the Lifecycle group. |
| Export on the products list | Show the Lifecycle column in the table before you export. It exports as all eight columns, under the headings in the table below. |
| Open in Google Sheets on the products list | Same as the export, when the Lifecycle column is shown. Pull & review and Pull & apply read the columns back, matching rows by ID. |
| The AI assistant | When you ask it to import a products file, it maps all eight columns too. |
The import's column mapping matches a file header to its field by either the template header or the export heading. An exported file maps back on its own.
The columns
A blank cell always means "leave this as it is". It never clears a value.
| Template header | Export heading | Required? | Format | Accepted values | Notes |
|---|---|---|---|---|---|
lifecycle_state | Lifecycle State | No | Text | A state's key or its name from Settings → Products → Product Lifecycle, for example active, phasing_out, discontinued, or Phasing out. Not case-sensitive. | Moves the product to this state. The export writes the key. |
lifecycle_reason | Lifecycle Reason | No | Text | A reason's key or name: brand_decision (Brand decision), supplier_discontinued (Supplier discontinued it), seasonal_end (Seasonal end), low_performance (Low performance), replaced (Replaced by a new product), quality_issue (Quality issue), other (Other). | Left blank while changing to Phasing out or Discontinued, the reason is recorded as Other, with a warning. The export writes the key. |
discontinue_on | Discontinue On | Only with Phasing out | Date: YYYY-MM-DD, MM/DD/YYYY or M/D/YYYY | A date after today | The day a Phasing out product becomes Discontinued. Ignored for other states. |
last_order_date | Last Order Date | No | Date, as above | On or before Discontinue On | The last day a Phasing out product can be bought without a final-buy warning. Ignored for other states. |
successor_sku | Successor SKU | No | Text | An existing SKU, or one created in this same file | The product that replaces this one. A product can't be its own successor. |
successor_pack_factor | Successor Pack Factor | No | Number | Greater than 0 | How many units of the successor replace one unit of this product. An old 6-pack replaced by a 12-pack is 0.5. Defaults to 1. Ignored without a Successor SKU. |
seasons | Seasons | No | Season codes separated by a pipe | Codes that already exist, for example SS26|AW26 | A value replaces the product's seasons. |
noos | Never Out Of Stock | No | Yes or No | Yes, No, Y, N, 1, 0, true, false | A core item that should always be in stock. A value that differs from the product's current flag pins your choice. A value that matches it changes nothing. |
How the columns behave
- Match key. Rows are matched to products by SKU, not case-sensitive. If you map an ID column, it matches by ID instead.
- Update or create. A row whose SKU matches a product updates it. A row with a new SKU creates a product, which starts in Active and then takes the lifecycle in its row.
- Lifecycle is applied last. The lifecycle and successor columns are applied after every row is saved. That's why a successor created further down the same file still resolves.
- A row that changes nothing writes nothing. If a row restates the product's current state, dates and reason, no history row is added. An export you import again unchanged leaves no trace.
- Restating a state keeps its dates. A row with the product's current state and a blank date keeps the date it already has. Dates that were valid when they were set aren't checked against today again.
- Changes are recorded as CSV import. Each change shows CSV import in the Source column of the product's lifecycle history.
- Matrix products don't pass changes down. A state on a matrix product's row changes only that row's product. List each variant on its own row to change the variants.
- Successor settings keep their values. Importing a successor sets only the successor and its pack factor. For a new link, the other settings start at their defaults: all of the sales history carries over until 12 months after the discontinue date (or after today when there's none), the old stock is used up first and nothing is substituted automatically. For an existing link, they're kept. Change them on the product. See Link a successor product.
- You can't remove a successor by import. A blank Successor SKU cell leaves the link alone. Remove it on the product.
- Never Out Of Stock pins only on a change. SKU.io sets the flag automatically each night from stock history. A file value that differs from the current flag pins your choice, so the nightly update leaves it alone. Exporting and importing again keeps automatic products automatic.
Permission
Changing a lifecycle or successor column needs the Lifecycle permission. Without it:
- A row whose lifecycle cells match the product's current values is accepted and changes nothing. The Lifecycle column of an export says
activeon most rows, so an unedited export imports cleanly. - A row that changes any of those cells is an error. It starts "You need the Manage lifecycle permission", names the columns you changed, such as Lifecycle State and Discontinue On, and asks you to put back the exported values, clear those cells or ask an admin for the permission.
The Seasons and Never Out Of Stock columns don't need the Lifecycle permission.
Errors and warnings in the preview
The preview step checks every row before anything is saved. A row with an error isn't imported. A warning doesn't stop the row.
| Message | Type | Fix |
|---|---|---|
| "Unknown lifecycle state 'value'. Valid states: …" | Error | Use one of the states listed in the message, by key or name. |
| "Unknown lifecycle reason 'value'. Valid reasons: …" | Error | Use one of the reasons listed, by key or name. |
| "Discontinue On 'value' is not a valid date (use YYYY-MM-DD)." | Error | Write the date as YYYY-MM-DD. The same message names Last Order Date when that cell is wrong. |
| "Discontinue On is required when Lifecycle State is Phasing out." | Error | Add a discontinue date. |
| "Discontinue On must be after today for Phasing out." | Error | Use a future date. To end it today, use Discontinued. |
| "Last Order Date must be on or before Discontinue On." | Error | Move the last order date earlier. |
| "A product cannot be its own successor." | Error | Use another SKU. |
| "Successor SKU 'value' was not found." | Error | Use an existing SKU, or add the successor as a row in the same file. |
| "Successor Pack Factor must be a number greater than zero." | Error | Use a positive number. |
| "Unknown season code: … Add it under Settings → Products → Product seasons first." (or "Unknown season codes: … Add them …" when there are several) | Error | Add the seasons first, or fix the codes. |
| "Never Out Of Stock must be Yes or No, not 'value'." | Error | Use Yes or No. |
| "You need the Manage lifecycle permission …" | Error | See Permission. |
| “No lifecycle reason given; recorded as "Other".” | Warning | Add a reason if you want a specific one. |
| "Successor Pack Factor is ignored without a Successor SKU." | Warning | Add the successor, or clear the pack factor. |
Problems after the rows are saved
A few lifecycle changes can only be refused when they're applied, after the rows are saved. Examples are a successor that would loop back on itself, or a discontinue date that passed between the preview and the import. The row itself is still saved and counted as imported, but its lifecycle isn't changed.
The import result then says, for example, "2 rows were saved, but part of them was not applied:", and lists each row with a message that starts "Lifecycle not changed:". Up to 50 rows are listed. Fix those products by hand or in a new file.
Exports with lifecycle data
The products export
Show the Lifecycle column on the products list, then click Export. The file gets all eight columns:
- Lifecycle State and Lifecycle Reason hold keys, such as
discontinuedandsupplier_discontinued. - Discontinue On and Last Order Date are written as
YYYY-MM-DD. - Seasons lists season codes separated by a pipe.
- Never Out Of Stock says
YesorNo.
See Export products.
The Sell-through export
On the Sell-through tab of PIM → Lifecycle, click Export. With rows checked, the button reads Export N selected and exports only those rows. Otherwise it exports every row that matches your filters. Either way it includes only the columns shown in the table.
The full file has these columns: ID, SKU, Product, Variant, State, Since, Reason, Units at discontinue, Units sold since, Units received since, Sell-through %, On hand, FBA units, Value at cost, 30-day velocity, Weeks of cover, Projected sell-out, Target date, Status, Clearance plan, Markdown step, Successor, FBA clock and Removal order by. ID is always included.
Up to 1,000 rows download straight away. Above that, the export runs in the background and the download appears in the job tray. You need the Export permission under Products. See Work the Lifecycle workspace.
The Inventory Valuation report
On the Inventory Valuation report, add Lifecycle under Group By to see a subtotal per state. Its export then has a Lifecycle column. You can also use the report's Lifecycle filter to value only products in some states, such as the Discontinued stock you're selling through.
Closeout files
The closeout CSV and PDF linesheet are covered in Sell off closeout stock.
Purchase order imports
A purchase order import follows the Adding to purchase orders row of the policy matrix. A product whose state blocks purchase orders is an error on that line. A product whose state warns is imported, and the final-buy warning is listed with the results. Lines already on an existing purchase order aren't checked again. See the Lifecycle policy matrix reference.
What you can't import or export
These lifecycle settings live only in the app. Change them on screen.
| Data | Where to change it |
|---|---|
| Scheduled lifecycle changes | The Scheduled tab of PIM → Lifecycle, or Change lifecycle with a date. See Schedule lifecycle changes. |
| Successor settings other than the SKU and pack factor | The product's lifecycle panel, or the Successors tab of PIM → Lifecycle. |
| Clearance plans and their steps | PIM → Clearance Plans. |
| The list of seasons | Settings → Products → Product seasons. |
| Lifecycle history | The product's lifecycle history. |
| The FBA checklist | The FBA checklist tab of PIM → Lifecycle. |
| States and their policies | Settings → Products → Product Lifecycle. |
Next steps
- Import products from a spreadsheet: the full import flow.
- Change lifecycle for many products or variants: change states without a file.
- Lifecycle states reference: every state, reason and source.