Import

7 operations. Every schema and example on this page is generated from the platform contract.

Run the import.

Writes staged rows to live tables: customers (merge-or-create), memberships in awaiting-payment state, class-pack balances and historical visits. No member is contacted, nothing is charged, no Stripe objects are created. Exactly-once per row via DB unique guards; a 7-day undo window opens on completion.

Request body

store_idstring · uuidrequired
job_idstring · uuidrequired

Response, 200

startedbooleanrequired
progressobjectrequired
3 child fields
totalnumberrequired
donenumberrequired
countsobjectrequired
curl -X POST "https://www.membber.com/api/v1/import/commit" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "job_id": "bb2be0dd-0000-4000-8000-d0c5000000bb"
  }'
Response, 200
{
  "started": true,
  "progress": {
    "total": 1,
    "done": 1,
    "counts": {}
  }
}

Invite imported members to claim their membership.

Sends the store-branded claim invite (transactional service-transfer notice) to imported members who have not yet claimed their account. Explicit merchant action only, the import itself never contacts members. One initial wave and one reminder wave per import.

Request body

store_idstring · uuidrequired
job_idstring · uuidrequired
waveenumrequired

'initial' then 'reminder' (day 3) then 'reminder2' (day 7 final); each sends once. Reminders also fire automatically via the hourly journey cron.

initialreminderreminder2

Response, 200

sentnumberrequired
already_claimednumberrequired
no_emailnumberrequired
failednumberrequired
curl -X POST "https://www.membber.com/api/v1/import/invites" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "job_id": "bb2be0dd-0000-4000-8000-d0c5000000bb",
    "wave": "initial"
  }'
Response, 200
{
  "sent": 1,
  "already_claimed": 1,
  "no_email": 1,
  "failed": 1
}

Get import-wizard state.

Job header, uploaded file summaries, plan-match decisions, dry-run report and live row progress for the store’s import.

Parameters

store_idstring · uuidqueryrequired

Store whose import job to fetch (authorises the merchant).

job_idstring · uuidqueryoptional

Specific job; defaults to the most recent job for the store.

Response, 200

stateobjectrequired
5 child fields
jobobjectrequired
9 child fields
idstringrequired
store_idstringrequired
sourcestringrequired
statusenumrequired
draftparsingmappedpreviewedimportingdonefailedundone
countsobjectrequired
dry_run_reportobjectrequired
committed_atstring, nullablerequired
undo_deadlinestring, nullablerequired
created_atstringrequired
filesarray of objectrequired
5 child fields
idstringrequired
kindenumrequired
clientsautopayspassesvisits
original_namestringrequired
row_countnumberrequired
created_atstringrequired
plan_matchesarray of objectrequired
3 child fields
source_namestringrequired
actionenumrequired
mapcreateskip
matched_plan_idstring, nullablerequired
progressobjectrequired
3 child fields
totalnumberrequired
donenumberrequired
countsobjectrequired
funnelobjectrequired

Re-card funnel, present once the import is committed.

6 child fields
imported_membersnumberrequired
claimednumberrequired
active_billingnumberrequired
awaitingnumberrequired
monthly_value_pencenumberrequired
invitesobjectrequired
6 child fields
initial_atstring, nullablerequired
initial_sentnumberrequired
reminder_atstring, nullablerequired
reminder_sentnumberrequired
reminder2_atstring, nullablerequired
reminder2_sentnumberrequired
curl -G "https://www.membber.com/api/v1/import/jobs" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"
Response, 200
{
  "state": {
    "job": {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "store_id": "6659c139-0000-4000-8000-d0c500000066",
      "source": "<source>",
      "status": "draft",
      "counts": {},
      "dry_run_report": {},
      "committed_at": "<committed_at>",
      "undo_deadline": "<undo_deadline>",
      "created_at": "<created_at>"
    },
    "files": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "kind": "clients",
        "original_name": "<original_name>",
        "row_count": 1,
        "created_at": "<created_at>"
      }
    ],
    "plan_matches": [
      {
        "source_name": "<source_name>",
        "action": "map",
        "matched_plan_id": "1c4475d6-0000-4000-8000-d0c50000001c"
      }
    ],
    "progress": {
      "total": 1,
      "done": 1,
      "counts": {}
    },
    "funnel": {
      "imported_members": 1,
      "claimed": 1,
      "active_billing": 1,
      "awaiting": 1,
      "monthly_value_pence": 1500,
      "invites": {
        "initial_at": "<initial_at>",
        "initial_sent": 1,
        "reminder_at": "<reminder_at>",
        "reminder_sent": 1,
        "reminder2_at": "<reminder2_at>",
        "reminder2_sent": 1
      }
    }
  }
}

Start (or resume) a Mindbody import job.

Creates a draft import job for the store, or returns the existing editable one. Files are attached via the multipart upload endpoint; nothing is written to live tables until commit.

Request body

store_idstring · uuidrequired

Store starting (or resuming) a Mindbody import. Authorises the merchant.

Response, 200

jobobjectrequired
9 child fields
idstringrequired
store_idstringrequired
sourcestringrequired
statusenumrequired
draftparsingmappedpreviewedimportingdonefailedundone
countsobjectrequired
dry_run_reportobjectrequired
committed_atstring, nullablerequired
undo_deadlinestring, nullablerequired
created_atstringrequired
curl -X POST "https://www.membber.com/api/v1/import/jobs" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "job": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "source": "<source>",
    "status": "draft",
    "counts": {},
    "dry_run_report": {},
    "committed_at": "<committed_at>",
    "undo_deadline": "<undo_deadline>",
    "created_at": "<created_at>"
  }
}

Decide how a Mindbody contract maps to a Membber plan.

Records the merchant’s mapping decision for one Mindbody contract/pass name. Idempotent upsert per (job, name).

Request body

store_idstring · uuidrequired
job_idstring · uuidrequired
source_namestringrequired

The Mindbody contract/pass name being decided.

actionenumrequired

'map' links to an existing Membber plan; 'skip' leaves these rows unimported.

mapskip
plan_idstring · uuid, nullablerequired

Required when action is 'map'.

Response, 200

okbooleanrequired
curl -X POST "https://www.membber.com/api/v1/import/plan-match" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "job_id": "bb2be0dd-0000-4000-8000-d0c5000000bb",
    "source_name": "<source_name>",
    "action": "map",
    "plan_id": "e28fa9f1-0000-4000-8000-d0c5000000e2"
  }'
Response, 200
{
  "ok": true
}

Undo a committed import (7-day window).

Deletes customers, awaiting-payment memberships and imported visit history created by this job. Customers who have since claimed their account or hold a live billing membership are kept (never deleted by undo).

Request body

store_idstring · uuidrequired
job_idstring · uuidrequired

Response, 200

okbooleanrequired
deletednumberrequired
keptnumberrequired
curl -X POST "https://www.membber.com/api/v1/import/undo" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "job_id": "bb2be0dd-0000-4000-8000-d0c5000000bb"
  }'
Response, 200
{
  "ok": true,
  "deleted": 1,
  "kept": 1
}

Upload one Mindbody export CSV.

Parses, sniffs (clients/autopays/passes/visits), validates and stages one Mindbody export. Re-uploading the same kind replaces it. Returns merchant-readable issue counts and the refreshed dry-run preview; live tables are untouched.

Request body

store_idstring · uuidrequired
job_idstring · uuidoptional

Existing job; a draft is created/resumed when absent.

kindenumoptional

Which Mindbody export this is; auto-detected from headers when omitted.

clientsautopayspassesvisits
file_namestringrequired
contentstringrequired

The raw CSV text (UTF-8). Mindbody exports are comfortably under this cap; split visit exports by date range if needed.

Response, 200

job_idstringrequired
kindenumrequired
clientsautopayspassesvisits
summaryobjectrequired
6 child fields
kindenumrequired
clientsautopayspassesvisits
totalnumberrequired
validnumberrequired
warningsnumberrequired
errorsnumberrequired
issue_countsobjectrequired
previewobjectrequired
curl -X POST "https://www.membber.com/api/v1/import/upload" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "file_name": "<file_name>",
    "content": "<content>"
  }'
Response, 200
{
  "job_id": "bb2be0dd-0000-4000-8000-d0c5000000bb",
  "kind": "clients",
  "summary": {
    "kind": "clients",
    "total": 1,
    "valid": 1,
    "warnings": 1,
    "errors": 1,
    "issue_counts": {}
  },
  "preview": {}
}
WhatsApp
Book a Call
Start Free