3 KiB
scripts/
One-off admin and migration scripts. None of these run in CI.
helcim-plan-consolidation.js
Consolidates Helcim payment plans from the legacy per-tier model (multiple plans at $15/$30/$50) to two unified plans (Monthly Membership at $15, Annual Membership at $150), and backfills Mongo members.
Required env
HELCIM_API_TOKEN=<token>
MONGODB_URI=<mongodb connection string>
Copy .env.example → .env if you haven't already.
Usage
# Dry-run (default) — no mutations, writes backup file
node scripts/helcim-plan-consolidation.js
# Execute all steps: delete subs, delete legacy plans, create new plans, update Mongo
node scripts/helcim-plan-consolidation.js --confirm
# Mongo cleanup only — skips all Helcim steps (use if Helcim steps already ran)
node scripts/helcim-plan-consolidation.js --mongo-only
What it does
- Backup — always written to
.migration-backup-<timestamp>.json, even in dry-run. Contains all Helcim subscriptions, payment plans, and Mongo members withhelcimSubscriptionId. - Delete subscriptions — deletes all Helcim subscriptions (
--confirmonly). - Delete legacy plans — deletes plan IDs
20162,21596,21597,21598, plus any plan whose name matches the legacy pattern (e.g. "Ghost Guild - Member ($15)"). - Create Monthly Membership — $15/month. Idempotent: skipped if a plan named "Monthly Membership" already exists.
- Create Annual Membership — $150/year. Same idempotency. Uses
billingPeriod: "yearly"(Helcim v2 convention); if Helcim returns 4xx, the script aborts and prints the full error so you can correct the field name. - Mongo cleanup —
updateManywithrunValidators: falseon all members withhelcimSubscriptionId: setscontributionTier: '0'andbillingCadence: 'monthly', unsetshelcimSubscriptionId. Does not changestatus.
At the end, prints new plan IDs formatted for copy-paste into .env.
Recovery
If something goes wrong mid-run, the backup JSON contains the pre-migration state. You can use the backup to:
- Identify which subscriptions existed before deletion.
- Identify which plan IDs to recreate manually in Helcim.
- Identify which members had
helcimSubscriptionIdbefore it was unset.
Backup files are gitignored (.migration-backup-*.json).
migrate-contribution-amount.cjs
One-time migration: converts Member.contributionTier (String enum) to
Member.contributionAmount (Number). Idempotent — only touches documents that
still have the legacy field.
Usage
node scripts/migrate-contribution-amount.cjs # dry-run
node scripts/migrate-contribution-amount.cjs --apply # write
What it does
Iterates members with contributionTier still set, parses each value as an integer
(valid: "0", "5", "15", "30", "50"), and writes the converted value to
contributionAmount. Unsets the old field. Skips any record that cannot be parsed.
Safe to re-run: only matches members where contributionTier still exists.