Contents

Chapter 7. Importing From Another Subscription System

Step 2: Say Where the Data Is

When you chose Something else: I'll say where the data is, or clicked Change where the data is read from, the wizard shows 3. Say where the data is. PaddleSubs fills in what it can guess from the names of the old system's tables and columns. Check every choice: a guess is only a starting point.

Procedure 7.2. Describe the old system's data
  1. In Name of the old system, enter its name, such as Membership Pro. It appears in the note of every imported Access Subscription, and the suggested Name for this source is made from it.

  2. Under Users, choose the Table that holds the customers, and in Identifies a row the column whose value is different for every customer, usually the id. Open Sample to see a few rows and recognise the columns (passwords are hidden). Then choose the column for each detail: Email address (required), Name, Username, Password (hashed), Blocked and Registration date. Choose - Not read - for what the old system doesn't have.

  3. Under Products, choose the table of what the old system sold, such as its plans or levels, and its Identifies a row column. Choose the column of its Name (required) and Description; they are used for the product to create. If the old system has no table of products, because each plan or level is sold at one price, choose its table of prices here too.

    Rows to import: - Every row - imports every product. To import only some, such as the ones still for sale, choose the column that tells them apart and tick the values of the products to import. The prices of the other products are not offered in the next step, and the access to them is skipped.

  4. Under Prices, choose the table that says what a product was sold for and for how long, and its Identifies a row column. A product can have several prices. Then:

    Product (required)

    The column that names the price's product, with the values of the products table's Identifies a row column. When the prices table is also the products table, choose the column that identifies a row: each price is then its own product.

    Name, Amount and Currency

    Used for the price to create. When the table doesn't say the currency, the price gets the one in Currency when the table does not say, chosen from the currencies Paddle takes.

    Duration and Duration counted in

    How long a purchase gives access. The unit is read from a column, written the usual ways: day, days or d, week or w, month, mo or m, year, yr or y, in any case, as well as monthly, annually and quarterly (three months). Or choose one under - The same for every price - (days unless you choose otherwise). A duration that carries its unit, such as 30d, 1 month or P1Y, needs no unit. A unit PaddleSubs doesn't recognise leaves the length empty in the next step, for you to fill in.

    Recurring, Lifetime and Access ends on a fixed date

    Suggest the Billing Type of the price to create: Recurring for a price that renews by itself, with the duration as its billing cycle; Lifetime for access for life; Fixed Date when an end date is read. Lifetime and a fixed date come first. Otherwise the price is Non-Recurring, with the duration as its expiry period. You can change each in the next step.

  5. Under Access, choose the table with one row for each period of access a customer had, and its Identifies a row column. Then:

    User (required)

    The column that names the customer. Its values must be those of the users table's Identifies a row column. If the old system keeps the customer's email address on the access row and has no users table, choose the access table under Users too, with the email column as Identifies a row and as User.

    Price (required)

    The column that names the price, with the values of the prices table's Identifies a row column. The price says the product, so the access needs no product column. Each price becomes a line of the next step, where you choose the price here it becomes.

    Enabled

    Whether the old system gives access for the row. Values such as 1, true and yes mean yes; access whose window hasn't started is then imported pending. If it is not read, everything is imported unpublished, and the lifecycle task doesn't publish it. The AkeebaSubs preset also reads the payment state, so that a paid renewal the old site keeps switched off until it starts is imported pending.

    Access starts (required) and Access ends

    For each date, say whether the column holds A date and time, such as 2025-04-30 13:00:00 or A Unix timestamp, such as 1746018000. Dates are read as UTC. An empty end date, a zero date, or - Not read - means the access never ends. Some systems store "forever" as a date far in the future; enter it in Dates on or after this one mean it never ends. A row without a start date is not imported.

  6. Click Continue. The wizard checks the mapping against the old data. If something required is missing it says what; otherwise it goes on to the next step, where Change where the data is read from brings you back here.

A field a preset reads in a way the editor can't show (a value translated by a list, text put together from columns, a value inside a JSON column) shows As the preset reads it. Leave it, or choose a column to read it from instead.

Tip

Click Save this mapping to download it as a file. Next time, for a newer copy of the same data or on another site, choose Something else: I'll say where the data is and open the file under Load a saved mapping. Rehearse on your sandbox or a demo site, save the mapping, and use it for the real import.