> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gohaven.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate donations from another platform

> Bring over your donation form configuration, designations, recurring donor list, and historical donation records. The migration scraper handles the form automatically; CSV import handles the rest.

When Haven migrates a club from WildApricot (or any other platform), donations come over in two passes: an automatic scrape of your `/donate` page configuration, and a manual CSV import for recurring donors and historical donation records.

## Automatic: form + designations

When the migration scraper visits your old `/donate` page, it extracts:

* The donation form's heading and description
* Preset amount buttons (in cents)
* Whether custom amounts were allowed
* Fundraising goal + thermometer state
* Anonymity option visibility
* Which recurring frequencies were offered (monthly, quarterly, semi-annually, annually)
* The list of fund designations donors could choose from, with the default selection preserved

Whatever Haven extracts is seeded into your new org's **Donations → Form** and **Donations → Designations** tabs automatically — the public `/donate` page works on day one of your new Haven site.

The raw extracted shape is also stored in `donation_forms.wa_form_config` for audit purposes, so you can see exactly what the scraper read from the source.

<Tip>
  After migration, visit **Donations → Form** and **Donations → Designations** to confirm the imported configuration matches what you want. AI-driven extraction is best-effort against undocumented HTML — verify before relaunching donor-facing communications.
</Tip>

## Manual: CSV import for recurring donors and history

Recurring donor subscriptions and historical donation records can't be scraped from a public donate page — they live in your old platform's admin database. Export them to CSV and use the **Donations → Import** tab to bring them over.

### Recurring donors

<Steps>
  <Step title="Export from your old platform">
    Pull a CSV of every active recurring donor. The export should include at minimum donor name, email, recurring amount, and frequency. WildApricot's recurring donations export covers all of these.
  </Step>

  <Step title="Open the Import tab">
    In your admin sidebar, go to **Donations → Import**. Click **Choose CSV file** under "Recurring donors".
  </Step>

  <Step title="Run the import">
    Click **Import**. Haven parses the file row-by-row and creates one `recurring_donations` row per donor with status **`pending_reauthorization`**.
  </Step>

  <Step title="Review the result panel">
    The result panel reports how many rows imported successfully. Any rows with errors (missing fields, invalid frequency strings, etc.) are listed below with row numbers so you can fix the source CSV and retry.
  </Step>
</Steps>

#### Expected CSV columns

Header names are matched case-insensitively. Synonyms are accepted where common:

| Field                               | Accepted column names                                                                                          | Required |
| ----------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------- |
| Donor name                          | "Donor name", "Donor", "Name", "Full name"                                                                     | ✅        |
| Email                               | "Email", "Donor email"                                                                                         | ✅        |
| Recurring amount                    | "Amount", "Recurring amount", "Donation amount"                                                                | ✅        |
| Frequency                           | "Frequency", "Recurring frequency", "Schedule" — text like "Monthly", "Quarterly", "Semi-annually", "Annually" | ✅        |
| Designation                         | "Designation", "Fund", "Designation name"                                                                      | Optional |
| Last charged date                   | "Last charged", "Last donation date", "Last payment"                                                           | Optional |
| Subscription id (from old platform) | "Subscription id", "WA recurring id", "WA subscription"                                                        | Optional |

Designation names match against your existing `donation_designations` rows by lowercased name. Donors whose designation can't be resolved get assigned to the implicit general fund (NULL designation).

### Why pending\_reauthorization?

Imported recurring donors land in the **`pending_reauthorization`** status because their saved payment method lives in the old platform (typically Personify Payments for WildApricot migrations) and can't be transferred to Stripe. The donor must re-enter their payment method on Haven to convert their subscription.

Until then:

* The subscription is **not active** — Stripe isn't charging the donor yet.
* The row is visible in your **Recurring** tab with status badge "Awaiting payment", so you can track conversion attrition.
* You can communicate with affected donors via the **Messages** tab to walk them through reauthorization.

<Warning>
  The full reauthorization workflow (tokenized email link → Stripe Payment Element page that resumes the subscription) is on the roadmap but not yet built. For now, treat pending\_reauthorization rows as a worklist for personal donor outreach. Conversion is a known migration risk — set expectations with the migrating club's leadership before importing.
</Warning>

### Historical donations

For donor portal display, donor-history reports, and audit completeness, you can also import a CSV of past one-time donations. Each row creates a `payment_records` row with a sequential receipt number for the audit trail.

<Steps>
  <Step title="Export historical donations from your old platform">
    Most platforms support an "all donations" or "donation history" export. Pull at minimum the donor name (or email), amount, and donation date.
  </Step>

  <Step title="Use the Historical donations import">
    In the same **Donations → Import** tab, choose your CSV under "Historical donations" and click **Import**.
  </Step>

  <Step title="Review the result">
    Imported rows are visible in your Donations tab and on each donor's portal donation history. PDF receipts are downloadable per imported donation.
  </Step>
</Steps>

#### Expected CSV columns

| Field         | Accepted column names                                                                                 | Required |
| ------------- | ----------------------------------------------------------------------------------------------------- | -------- |
| Amount        | "Amount", "Donation amount"                                                                           | ✅        |
| Donation date | "Date", "Donation date", "Paid at"                                                                    | ✅        |
| Donor name    | "Donor name", "Donor", "Name", "Full name"                                                            | Optional |
| Email         | "Email", "Donor email" — when matched to an existing Haven member, the row links to their `member_id` | Optional |
| Designation   | "Designation", "Fund"                                                                                 | Optional |
| Anonymous     | "Anonymous", "Is anonymous" — accepts Yes/No, True/False, 1/0                                         | Optional |

<Note>
  Historical donations are NOT re-receipted. The original receipts came from your old platform; the imported rows exist for portal display + audit only. The `receipt_sent_at` field is set to the donation date so the system knows not to re-send.
</Note>

### Imports are one-shot

Both CSV importers are best-effort and one-shot — they don't deduplicate against existing rows. Importing the same CSV twice creates duplicate records. Run each import exactly once per source file, and review the result panel for any rows that errored.

If a row fails (e.g. missing required field), Haven keeps the rows that succeeded and reports the failures. Fix the source CSV and re-import only the failed rows — don't re-upload the whole file.
