Migrating from PushPress
Move your members, schedule, and plans into OurGym — three uploads, one review screen, nothing goes live until you commit.
Updated September 9, 2026
If your gym runs on PushPress today, you can bring your members, staff, weekly schedule, and plan catalog into OurGym without rebuilding them by hand. The whole migration is three things you provide — two CSV exports, your public booking-site address, and a few screenshots — plus one review screen where you approve what gets created. You never have to say which file is which: CSVs and screenshots are recognized automatically.
You need the owner or admin role. Nothing here touches your PushPress account: you export your data and hand it to us. OurGym never signs in to PushPress or any other system on your behalf.
How it works
While your gym is still being set up, OurGym asks you the question directly: “Are you moving from another gym system?” appears on Settings → Getting started and on the Today page’s setup card, with Yes, import my gym and No, I’m starting fresh to answer it. Your answer is remembered, so you’re only asked once — the assistant won’t re-ask it in a later chat either.
Answering yes opens the import wizard on Settings → Getting started and starts the conversation with your assistant at the same time. The two are the same migration: every step below can be done either on the wizard panel (drop files, type your booking address, open the review screen) or by talking to the assistant — and progress made on one side always shows on the other. When you confirm a step in chat, the assistant carries straight on to the next one.
Said no and changed your mind? A Coming from another system after all? link stays on Settings → Getting started — declining is never a one-way door. And you can return to a half-finished migration any time: the wizard stays on Settings → Getting started with your live progress while a run is open.
The question, and the import itself, need the owner or admin role; coaches and front-desk staff don’t see it.
Everything you provide is staged, not imported: rows land on a review screen (Setup → Import) where you approve, fix, or skip them. Nothing is created in your gym until you commit each section there.
Sandbox: your members can’t be messaged or charged while you migrate
The moment a migration run starts, your gym enters sandbox mode, and a banner across the top of every screen says so until you go live. In sandbox:
- No member is charged. No card on file is billed — not by the automatic billing run, and not by a sale you ring up at the front desk. Selling a plan, topping up a wallet, selling a gift card, or taking a paid event registration will politely refuse until you’re live.
- No member is messaged. No emails, texts, or push notifications — no welcome emails, no invoice notices, no waiver requests.
So you can’t accidentally blast, or bill, a few hundred imported members with a half-configured gym.
Everything else works normally. You can keep setting up, keep importing, and keep collecting cards from members — saving a card is not a charge, and having them on file is exactly what makes going live smooth. Staff sign-in codes are unaffected, and so are staff alerts.
Invoices are still created while you’re in sandbox, so you can see exactly what each cycle would have billed. They’re never collected — see Going live for what happens to them.
Step 1 — Export and attach your two CSVs
In PushPress:
- People → Members tab → the download icon → Export.
- People → Staff tab → the download icon → Export.
Drop both files on the wizard’s upload zone — or attach them in the assistant chat with the paperclip button, by dragging them onto the conversation, or by pasting them straight into the message box, in the assistant panel and on the full-page Chat screen alike. Both at once is fine: each file is recognized as the members or staff export from its own columns, so you’re never asked which is which. Members stage with their plans, balances, and pause or cancel dates; staff arrive as invitations with the matching role (your OurGym account stays the one owner).
A member who is paused arrives paused, with their hold dates. A member set to cancel arrives with that end date and no final charge scheduled — they run out their paid period and stop, rather than being billed once more on the way out.
A member whose PushPress plan is flagged alert — live, but the card keeps declining — arrives as Payment failing, not as a healthy member. Those are the memberships worth finding on your first day, so they are carried across as what they are rather than quietly rounded up to active.
Two billing safety rails, on every member row:
- A member with a live recurring plan but no next billing date is flagged for review — they can never be imported into a state where billing silently stops.
- Imported phone numbers always start opted out of SMS (that consent doesn’t transfer); members re-opt-in themselves.
Step 2 — Give it your booking site
Type your public booking address into the wizard — yourgym.pushpress.com, or
just the yourgym part — or tell the assistant. OurGym reads your public
class calendar and drafts your weekly schedule from it: class types plus
recurring time slots, with each class’s length, capacity and usual coach
where your calendar publishes them (so there is usually nothing left to fill
in). It reads several weeks, not one, so a coach who rotates across a slot is
recognized as one class rather than several. A class you never assigned a type
to in PushPress keeps the name on the calendar rather than PushPress’s own
“General” placeholder. One-off events that never repeat are left out and called
out, so they don’t become permanent weekly classes — add any that are still
running by hand.
Step 3 — Screenshot your plans, discounts, and products
Take screenshots of the Plans, Discounts, and Products pages of
your PushPress admin, and drop them on the wizard — or attach, drag, or
paste them straight into chat. Several at once is fine: each screenshot is
recognized for what it shows, so you never have to say “these are my plans.”
The rows in each screenshot are read and staged for your review — if a list
spans several pages, you’re asked for the next page. Prices are cross-checked
against what your members CSV says people actually pay, and disagreements are
flagged rather than guessed. A plan’s billing period is taken from wherever the
screen puts it — the price cell ($225.00 / per month) counts just as much as
a “Monthly” column — so a monthly plan never lands as a one-time pass.
Expect the screenshots and the members CSV to disagree about which plans exist, and that is fine: the screens list plans nobody is on yet, and the CSV carries archived plans that still have members enrolled. Both sides are kept, so a archived plan with live members doesn’t vanish because your catalog forgot it.
Step 4 — Review and commit
The wizard’s last step stays locked until the three steps above are settled — so you don’t land on a half-empty review screen, or triage memberships whose plans aren’t staged yet. A step counts as settled once its data is staged, or once you tick its Ignore this step — I have nothing to bring over here box: no products to move across, or a timetable you’d rather rebuild by hand, and that step stops holding up the review. The box sits on the step it skips, so it’s always clear which one you’re waiving.
Once it opens, the last step (and the assistant, once staging is done) opens Setup → Import: one tab per kind of thing (plans, schedule, staff, members, memberships, …), each split into clean rows, needs review (each row says exactly what’s wrong and offers fixes), and skipped. Every tab opens on the first of those with anything in it, so you never land on an empty “needs review” and have to go hunting for the work. Every row links back to its source — the CSV line, the screenshot, or the calendar — and to the matching record in PushPress.
Clean rows still need your approval — looking fine is not the same as being imported. Open the clean tab and they arrive already ticked: Approve all N approves the lot in one click, and the tick box in the table header selects or clears the whole page if you’d rather go through them yourself.
Anything OurGym can’t accept is caught here, not later. If a row is missing something we require, it waits in needs review with the exact field to fill in — and that field is an input on the row itself, in the Quick fix column, so you can go down a page of them without opening anything. Just type the value: it saves itself a moment after you stop typing, the row re-checks, and when that was the last thing wrong with it the row leaves needs review — you get a note saying so by name, and the cursor moves to the next row, so a page of missing numbers is one pass. The common ones: a plan with no billing period is a one-time pass, so it has to say how many visits it’s worth (1 for a drop-in, 10 for a ten-pack) — or tick Unlimited use and give it a billing period instead, which is what an unlimited plan actually is; a staff member needs an email address, because staff are imported by inviting them; a membership set to cancel needs the date it ends. You can also map a row onto something you already have, merge a probable duplicate, or skip it.
Suggestions come with the button that acts on them. Where we spot a pseudo-plan — a “Staff Only” access plan, a $0 waiver or free-trial plan — the row offers to skip it and the memberships on it in one go. Those members still import; they just arrive without a billing plan, which is what those plans always meant. Skipping the plan on its own would leave its memberships waiting for a plan that never arrives.
Each tab shows the fields you actually decide on, so you can triage from the list without opening rows one at a time: staff show their email and role, members their email, phone and the plan they’re on, plans their price and how many members were on them. A membership is listed under the member it belongs to — with its plan, status and next charge date beside it — because a membership is one person’s enrollment, not a second copy of the plan’s name. A dash means your export didn’t carry that field — worth knowing before you commit, since a member with no email can’t be invited. (PushPress’s staff export has no phone column, so staff rows show email and role only.)
Opening a row shows what will be created next to what your export actually said, field by field, so you can see exactly which value came from where.
A membership can be moved onto a different plan from that panel — pick any plan in this import from the Plan list. That is the fix for the two things that strand enrollments: an export that spelled one plan two ways and split its members between them, and a plan you skipped (a “Staff Only” or free-trial pseudo-plan) whose members should sit on a real plan instead of arriving with none.
Committing runs in dependency order (plans before members before memberships), and re-running a commit is always safe: the same source row never creates a duplicate. Commit shows a dry run first — the exact effect, per row — and then does it. If everything lands, you get a confirmation and go straight on to the next tab. If anything is refused, only the refused rows stay on screen with the reason and a Fix this row button; nothing else was touched, and you fix, re-approve, and commit again. The memberships tab also shows a money check — what your CSV says your active memberships bill vs. what OurGym will charge over the next 30 days — which must reconcile before memberships commit.
Step 5 — Bring your cards on file across
This step is why the migration doesn’t end with your members asking “why do I have to enter my card again?”.
If your gym has been charging through Stripe, those customers and their saved cards are on your own Stripe account, and they stay there. Connect that account (Settings → Payments — see Connecting Stripe), then run this step from the wizard or the assistant. OurGym reads the customers already on the account and matches them to your members on the Cards on file tab:
- an exact email match is made for you;
- a name-and-phone match is suggested and waits for you to confirm;
- everything else waits for you to pick the member — or to skip it, if the customer isn’t one of your members.
That caution is deliberate and it is the whole design. A wrong match would point one member’s future payments at another member’s card, so nothing but an exact email is ever decided without you. Duplicates — the same person with two Stripe customers — are flagged with a note about which one carries the live card, and customers with no card at all are marked so you know who to ask.
The step tells you how many customers it read, how many it matched automatically, and how many are waiting on you, and Check the matches takes you straight to that tab. Look at the automatic ones too: those are the matches nobody has confirmed. If the read finds no customers at all, it says so rather than looking like nothing happened — usually that means the account connected isn’t the one your old system charged on.
You don’t have to wait for Stripe to finish verifying you. The read and the review work as soon as the account is connected; only the cancelling of the old subscriptions waits until Stripe has enabled charges.
Committing a row does four things: records which Stripe customer the member is, makes their saved card the default we charge, sets their first OurGym billing date to the date their old subscription is paid through, and cancels that old subscription at the end of that period rather than immediately.
So nobody is billed twice for one month, and nobody loses days they already paid for. If an old subscription can’t be cancelled, your staff get an email — two systems billing the same member is the one failure we won’t let pass quietly.
Going live
When you’ve committed what you want, tell us and we turn the keys: your gym leaves sandbox, normal member communications start, and cards start being charged again.
Nobody is billed for the time you spent migrating. Any cycles raised while you were in sandbox are voided at go-live, and billing starts fresh from your next cycle. So a member whose gym took three weeks to migrate is not charged for those three weeks — there’s no backlog waiting to land on them, and no reason to rush your review to avoid one. The voided cycles stay visible in your billing history, marked void, so you can still see what they were.
One exception: if a member had already paid one of those held invoices themselves — from wallet credit or a gift card — we leave that invoice alone rather than unwinding a payment they chose to make. We’ll flag any of those to you at go-live so you can decide what to do.
Until then you can take your time — the staged data keeps for the length of your migration, and raw uploads are automatically deleted on a schedule afterwards.
What doesn’t migrate
- Cards on file, if you don’t connect Stripe. Cards live on your Stripe account, so they come across only when you connect that same account and run step 5. Until then, imported memberships carry their price and next billing date but charge nobody. Cards on a DIFFERENT processor cannot be moved at all — nobody can move them, including your old system.
- Old subscriptions, as subscriptions. They are always cancelled and replaced by OurGym billing, never adopted — see step 5 for how the dates line up.
- Member passwords. OurGym has no passwords — members sign in with a one-time code to their email or phone, so there’s nothing to migrate.
- SMS consent. Deliberately not carried over (see step 1).
- Attendance history and messages. Historical check-ins and conversations stay in your old system; OurGym starts your history fresh.
Where to go next
- Onboarding from zero — everything around the migration: gym details, waiver, front desk, staff
- Scheduling classes — tune the imported schedule, capacity, and waitlists
- Onboarding staff and staff roles — the roles your imported staff arrive with
Something here out of date, or a step that didn't work? Tell us at support@ourgym.app.