# Lifecycle of a data product

URL: /products/data/lifecycle · Id: `page:products/data/lifecycle`

> A Dataset moves from draft to selling to retired by its Offers; its records are refreshed, corrected and kept, and nothing is purged.

A [Dataset](/business/nouns/dataset) moves from `draft` to `selling` to `retired` by its [Offers](/business/nouns/offer). Its records live longer than any Offer: each is refreshed, corrected and kept, and every past value still reads back.

## The product

The Dataset is `draft` until a published Offer sells it. [`Offer.publish`](/business/nouns/offer/publish) and the [Live](/business/lifecycle/states/live#entry-checks) gate refuse a Dataset with any [Source](/business/nouns/source) that is not licensed, collected within its terms, or synthetic. It is `retired` when its last Offer is withdrawn, and each [Customer](/business/nouns/customer) keeps what its license let it store.

## Each record
| Moment | What happens | Read |
| --- | --- | --- |
| Read from its Source | It arrives as a [Resource](/business/nouns/resource), with `mirroredAt` set | [Sources and refresh](/products/data/sources-and-refresh) |
| Refreshed | A changed value keeps the one it replaced | [Dataset refresh](/products/data/refresh), status `planned` |
| Corrected | A value that was wrong when served is fixed, with its reason | [Corrections](/products/data/corrections), status `planned` |
| Read as it stood | Any earlier value returns with `at` | [As-of reads](/products/data/as-of-reads) |
| Deleted | It leaves every list and keeps its history | [`Thing.restore`](/business/nouns/thing/restore) brings it back |

A takedown request removes a person from the next delivery, and each `redistribute` buyer gets the removal in its next file. [Handle a takedown](/workflows/processes/takedowns/handle-takedown) has the steps.

## Its Sources
A Source can lapse: a feed's terms end, or a wrapped Source's [Integration](/business/nouns/integration) needs re-approval. [`Integration.refresh`](/business/nouns/integration/refresh) renews its token before it expires, and a refused refresh moves it to `needsReauth`. Records already read stay, each with the time it was last refreshed.

## Versions
The Dataset's definition is versioned like any other: its [Noun](/business/nouns/noun), its Sources, its coverage and its refresh. A [Version](/business/nouns/version) is a build of the definition, not of the records, which change on their own schedule.