# Move a store from Recharge

Move every active subscription from Recharge, or from Skio, Appstle, Loop, Seal or Shopify Subscriptions with an export file, keeping each one's date, price and schedule. Nobody is emailed, and nobody is charged twice. Most stores do it in an afternoon.

## Two ways in

**Connect Recharge** (best): Usual reads Recharge directly, so nothing goes stale. Cards Recharge keeps at Stripe, Braintree or Authorize.net come too, and switching billing cancels each subscription in Recharge without emailing the customer.

**Upload an export** from any app as CSV. We recognise each app's column names.

## 1a. Connect and fetch

The store creates a Recharge API token (Tools and apps → API tokens) with read and write access to Subscriptions, and read access to Customers and Payment methods, then connects it in **Usual → Import**, or with an API key:

```bash
curl -X POST https://regular-subs.fly.dev/api/v1/imports/connections \
  -H "Authorization: Bearer $USUAL_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source": "recharge", "token": "sk_..."}'

curl -X POST https://regular-subs.fly.dev/api/v1/imports/connections/recharge/fetch \
  -H "Authorization: Bearer $USUAL_KEY" \
  -H "Content-Type: application/json" -d '{}'
```

The token is checked with Recharge, stored encrypted, and never shown or logged.

## 1b. Or upload a file

```bash
curl -X POST https://regular-subs.fly.dev/api/v1/imports \
  -H "Authorization: Bearer $USUAL_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile csv subscriptions.csv '{csv: $csv, filename: "subscriptions.csv", source: "recharge"}')"
```

## 2. Review what was found

Every subscription is checked against the store: the customer, a saved card, the products and the next charge date. Nothing is created yet.

```bash
curl https://regular-subs.fly.dev/api/v1/imports/imp_123 -H "Authorization: Bearer $USUAL_KEY"
```

Wait for `status: "ready"`. `problems` groups anything that can't be imported, with examples and how to fix it: a customer not in the store, a product that's gone, a card held at Stripe that needs Stripe connected to Shopify. Fix what you can and fetch (or upload) again; subscriptions already imported are skipped.

## 3. Import

Try a few first, then the rest:

```bash
curl -X POST https://regular-subs.fly.dev/api/v1/imports/imp_123/start \
  -H "Authorization: Bearer $USUAL_KEY" \
  -H "Content-Type: application/json" -d '{"limit": 10}'
```

Each becomes a Shopify subscription with the same date, price and schedule. They don't bill yet.

## 4. Switch billing over

```bash
curl -X POST https://regular-subs.fly.dev/api/v1/imports/imp_123/release-billing \
  -H "Authorization: Bearer $USUAL_KEY" \
  -H "Content-Type: application/json" -d '{}'
```

For a connected import, each subscription is first checked in Recharge for anything the customer changed since the import (a skip, a cancellation, a product removed), then cancelled there without emailing them, then billed here. For an uploaded file, only do this once the old app has stopped charging.

If the store's Klaviyo flows email customers when a Recharge subscription is cancelled, pause those first.

## With an AI agent

*"We're moving from Recharge. Walk me through it."* The `get_import` tool carries these steps, and switching billing is high risk, so it always waits for someone at the store to approve it.
