Bam Good Time: Mahjong Club
League & tournament scoring
Free · In‑App Purchases
The #1 app for running American Mahjong clubs, leagues, and events.
Whether you organize weekly games for 12 players or monthly tournaments for 200, Bam Good Time gives you everything you need — registration, scoring, leagues, and member management — right from your phone.
Used by club organizers across the US and Canada.
——— FOR ORGANIZERS ———
◆ Events & Registration
Create events in seconds. Players register, join waitlists, and check in with a tap. QR code check-in available.
◆ Scoring & Leagues
Enter scores round by round. Track league standings with automatic rotation patterns and rankings.
◆ Member Management
Import contacts via CSV. Send SMS and email invitations. Manage your entire roster and directory.
◆ Series & Punch Cards
Sell multi-event packages. Players buy once, RSVP to each session. Punch cards for flexible attendance.
◆ Analytics & Payments
See attendance trends, revenue reports, and growth metrics. Accept payments through Stripe.
——— FOR PLAYERS ———
◆ Browse events and register in seconds
◆ Purchase series passes and punch cards
◆ Check in from your phone — no paper needed
◆ View game history and league standings
◆ Manage your profile across multiple clubs
——— GET STARTED ———
1. Create your free club at bamgoodtime.com
2. Download Bam Good Time
3. Sign in and start managing
Free to download. Club plans from $19/month unlock unlimited events, analytics, and more.
——— LEGAL ———
Terms of Use: https://bamgoodtime.com/terms
Privacy Policy: https://mahjic.org/privacy
Standard Apple EULA: https://www.apple.com/legal/internet-services/itunes/dev/stdeula/
more This app has saved my wife an enormous amount of time and frustration and enable her to enjoy getting people together to play this wonderful game.
This app has saved my wife an enormous amount of time and frustration and enable her to enjoy getting people together to play this wonderful game.
So easy to sign up and find events. Even in towns I am visiting!!
So easy to sign up and find events. Even in towns I am visiting!!
Clubs can set a member price for a whole series, and members see that price before they buy.
When a series is full, members can join its waitlist instead of seeing Buy.
Admins can close or reopen registration for an event, and players see when it is closed.
On a league night, Mark Absent can ask your sub list to cover the seat.
Club owners can email the players on an attendance report.
Check-in screens can show the club's welcome message and a link to its rules.
Plus smaller fixes and clearer messages.
1.1.33 1d ago
New for Tables: when a club offers it, tap "I'm interested" on a table time. If the table reaches 4 players by the club's cutoff, you're seated. If not, nothing is charged and no pass is used. You can Withdraw while you wait. A club's booking link now opens on its next open day.
New for tournaments: the Registration phase shows "Checked in X of Y" live as players check in at the door, with All, Checked in and Not yet filters and a name search. Close Registration says why it can't start, right beside the button. The check-in screen now says whose account is checking in.
New for events: a club can take payment outside the app with Other (pay elsewhere), and your seat shows the club's own instructions for paying.
For league admins: Invite Sub now offers members who never signed up for the night, declined or cancelled.
Also fixed: guest-pass Share sends your club's own link and name, Check In All and Undo All skip a row that only records who a sub covered for, and the feature list on the welcome screens wraps cleanly.
1.1.32 3d ago
New for the Scramble: when your club turns on "Allow tables of three (Bob)", three players can start a match on the match day. A full table can also mark a player who never came as a no-show and play on as three. Clubs can set a no-show penalty, and the standings say when one applies. Share Challenge sends a link to your table while it has a free seat, and a No scores Scramble closes each match with We played.
New for events: an event can have two labelled prices, and you pick one when you sign up. Tap "I'm interested" to let the club know you'd like to come. A free event can say donations are welcome, and admins get sign-up QR codes for an event or the club's upcoming lists.
New for leagues and tournaments: choose how many nights or weeks count toward the standings, drag a name onto a seat to choose who sits East, and every member can see the nights that need a sub.
For admins: Holdings on the member sheet, change the day a pass expires, and register players who said they're interested. Hold a chat reaction to see who reacted.
Also fixed: the Check In All and Undo All counts, refund messages, dates that could show a day off, and many smaller wording fixes.
1.1.31 4d ago
New: waive a seat. From the roster's payment menu, settle a player's seat at no charge and leave them exactly where they are, with no refund and no cancellation email. It works from the tournament console too.
New: settle a booked table seat with the member's monthly pass or punch card, right from the table's Mark Paid menu. If Mark Paid can't go through, the app now tells you why.
New: open any row in a league's standings to see where that player's season total came from, round by round. Follow Up After an Event, under Settings > Preferences, shows whether your thank-you email is on, when it sends, and what it says.
Table names you add on the web now show on your iPhone, and saving seating from the phone no longer erases them. Adding someone to one night of a class series tells you which series that night belongs to.
Also fixed: the event screen could crash for admins on some iPhones, and chat could freeze when you came back to the app. A club that hasn't finished Stripe setup now gets Continue Setup instead of a dashboard button that couldn't open. If an event's extras fail to load, registration says so and offers a retry instead of hiding them. A player sees the cancellation deadline that will actually be enforced, and a member who can't attend one date is no longer shown as cancelled.
1.1.30 Sep 14
Guest passes now read correctly everywhere. A seat that a guest pass covers no longer appears in what a member is asked to pay, on the registration screen, the roster, or the activity feed, and a declined pass seat stops naming a payment method nobody used.
New: the Floor view on iPhone. See your room drawn the way the tables actually sit in it, read who is at each table, drag a table to rearrange the room, and press and hold a seated player to move them to another table.
You can now move a player into an event directly from the venue day, with a preview before anything changes.
Also fixed: a link in one of our emails that the app could not open used to leave you looking at nothing. Those now open the web page instead, including the "update your card" link sent when a membership payment fails.
1.1.29 Sep 11
Your club's day at the tables, on one screen.
TABLES AND VENUES
- A row of sittings under the date picker shows every hour of the day: open play, a named night, an event that has the room, or a closed hour, with the price for you on each card.
- Tap a sitting and the room below shows only its tables, so you are picking a seat at an hour you already chose.
- A table held for an event says so, and cannot be booked by mistake.
- The Reserve button rides a bar at the bottom of the screen, in reach without scrolling back up.
- The tables card on your home screen shows the same hours, and what a seat there costs you.
- A club that seats you at the desk now says so, instead of offering a booking the app cannot make.
FOR CLUB ADMINS
- Move a player off a table booking into an open play at the same hour, one person or a whole table at once, with a preview of what changes before you confirm.
- Turning tables off now tells you who still holds a booking and offers to move them first, instead of refusing with nothing you can do next.
- The week view shows each day's events and which tables they hold.
FIXES
- A free event no longer shows a price it will never collect.
1.1.28 Sep 10
This update fixes the league schedule losing your place, and tells you whose phone is showing the join code.
LEAGUES
- Closing a match leaves you where you were in the schedule, instead of jumping back to the top of the month.
- Pull to refresh keeps your place too, on the league night and Mobile League screens.
- A player seated by an admin can see their own league again.
- No more paid checkout offered for a seat you already hold.
MATCHES
- The scanner names who tapped Start Match and is holding the join code, so nobody has to guess whose phone to look at.
MEMBERSHIPS
- Guest passes can be granted once a year, counted from the join date.
- The Memberships caption no longer breaks mid-word.
ELSEWHERE
- Standings tables say what their two numbers mean.
- The events picker offers draft dates.
- Bulk trash stops promising a restore it cannot deliver.
1.1.27 Sep 7
This update brings membership passes to the phone and tidies up wording across the club screens.
MEMBERSHIPS
- A membership card shows exactly what the pass includes.
- A pass that only covers certain hours says so, on both sides of the door.
- An all-day pass stops printing an hours line it does not need.
CLUB ADMIN
- Adding someone to an event now has an "Email this person" switch, so you can seat a player quietly.
- A club at its player cap sees a sentence explaining it, not an error code.
- The roster, the pickers and the import screens all say "Players" now.
FEEDBACK
- We ask how things are going once in a while, and only of people who have been to a few sessions.
- The feedback sheet respects Reduce Motion, and its stars are legible in both light and dark.
1.1.26 Sep 6
The sky-blue look from the website is here too now, on every screen.
• If your club wrote its own note about how to pay, you read your club's own words on a seat you still owe for, instead of a general one.
• Clubs on a paid plan can choose their page colour, and the app now shows the one they picked.
• Search finds a name with an apostrophe in it, so O'Brien turns up.
• Send code appears the moment you finish typing your phone number, not after the whole form.
• Cancelling a registration at a club you have not joined works properly.
1.1.25 Sep 5
MONEY AND REPORTING
• Pick any month, or any span of dates, and see what your club took in over it.
• Read what Stripe actually collected for that period, beside your own totals.
• Exported revenue columns are labelled "est." the way the website's are.
OPEN PLAY TABLES
• "Tables" is now "Open Play Tables", matching the website and the Mac.
• The door can spend a punch from a punch card, and add a guest beside the seat.
• You can set a day price and the date it stops applying.
• A punch card row names the club the card belongs to.
LEAGUES
• A table that is one scan short can still take its scores.
CLUB ADMIN
• Pending Payments shows the Venmo code on a package purchase, so a transfer can be matched to the buyer who sent it.
• Event rosters say who is a club member.
• Importing contacts counts contacts, not spreadsheet rows.
SIGNING IN
• A failed sign-in says whether the network was unreachable or the connection was blocked.
1.1.24 Sep 2
This update fixes a crash when opening an event.
FIXED
- Opening an event could close the app straight away. It no longer does.
- Undoing a no-show works again, and tells you why when it cannot.
- A cancelled series stops showing dates it no longer has.
- The check-in screens say who is a member.
LEAGUES AND SCRAMBLE
- Use Freebie stays hidden until the season starts.
- The week card stops inviting new rounds once the season has ended.
- The organizer bonus line explains the rematch rule.
- A match thread links back to its match.
CLUB ADMIN
- Member reports name the removals that the cancellation count leaves out.
- Removing a member from an event is free unless you say otherwise.
- The freebie confirm screen tells you it cannot be undone.
1.1.23 Sep 1
A new look, and a lot more you can do from your phone.
THE NEW LOOK
Every screen has moved to a new colour scheme and a new typeface. Nothing was moved and nothing was removed. Bold Text and larger type sizes work correctly again throughout the app.
LEAGUES AND STANDINGS
- Withdraw a player from a season without leaving your phone.
- The pending-match line now tells you whether the match is waiting on you.
- The Mahjongs column explains what its two numbers mean.
TABLES AND VENUES
- Refund a table booking yourself.
- Print a door QR code for check-in. Every club can do this now, not only clubs that have tables set up.
- The waitlist banner no longer covers the table list.
PACKAGES AND SERIES
- Buyers see a minimum commitment before they pay.
- You are warned before a series charges someone for a date they have already paid for.
- Creating a series now holds the room on every night it just booked.
- A lesson date sold through a series shows the series price instead of Free.
- A seat paid outside the app is labelled External rather than given a figure we worked out ourselves.
EVENTS AND REGISTRATION
- Signup answers now appear on the Attendees tab.
- The event email screen counts how many people it will actually reach.
- Registering for a public event puts you in the club that runs it.
EVERYTHING ELSE
- A chat message that fails to send stays in the box instead of vanishing.
- Backing out of an event link no longer leaves a spinner on screen.
- A web address a club puts in a signup question is now a link you can tap.
- Many smaller fixes to scoring, check-in and profile setup.
1.1.22 Aug 31
The Complete Your Profile screen now says what it is waiting for. If Continue is not ready yet, the missing items are named directly above it, together with the button that sends your phone code, instead of below where the keyboard could hide them. A button that is not ready to be tapped now looks that way rather than appearing active.
1.1.21 Aug 26
A month at a time, and lesson requests on your phone.
Your events screens now open as a list or as a month grid — tap the toggle to switch. Drafts look like drafts, you land on today, and your phone's calendar can subscribe to your club's schedule so new nights show up on their own.
• Events: switch between List and Calendar on both the player and the admin screen.
• Subscribe your calendar to the club schedule, or export a single night.
• Lesson requests open properly now — read the whole message, see their answers, email and phone in one place, set the status, and keep a private note the website shares.
• Open play: say you are playing your Scramble match here, and see which open play a match is at.
• Passes and add-ons: order the $5 lunch against a punch card, and restart a lapsed monthly pass from the app.
• Admins can comp a seat or a pass, correct a member's email, record a match played on paper, and add someone to a league from the phone.
Fixed: tapping a notification opens the right screen — five kinds went nowhere. The League schedule card opens on today rather than yesterday. Table-card names no longer truncate to "Debor ah F...". Series and template prices stop resetting when single-night sales are switched off. Times read on your club's clock instead of Eastern. A required friend question no longer locks out a member coming alone.
The app is also easier to read: it grows with your text size, honours Reduce Motion, and every colour on it has been re-measured for contrast.
1.1.20 Aug 25
Same app, new name. We're now Bam Good Time, the name of the club site you already sign in to. Nothing else moves: same login, same club, same data.
Also in this update:
• If your club asks for a phone number before you book, the app now explains why and lets you add one, instead of showing an error.
• On league night, a substitute keeps the seat and the standing of the player they replace.
• A refunded seat now says so in your event history.
• Scanning a match QR code opens that match.
• Club colors are checked for readability, so text stays legible whatever color your club picks.
• Add a player to a league by name, with no email address needed.
• A linked punch card is honored on a membership-only event.
1.1.18 Aug 19
Fixes an app freeze introduced in 1.1.14. Tapping anything on the club chooser could lock the app for several seconds at a time, and 1.1.15 did not fully fix it. It is gone now.
1.1.16 Aug 14
Tournaments are the headline in this release.
• Tournaments now have their own section in the admin menu, with a dedicated setup wizard and edit view instead of the general event form.
• Seat winds show at every table, and a tournament can use the fixed table rotation so players move the same way each round.
• You can seat a stand-in into an occupied seat, or add one mid-event from the pairings screen, without rebuilding the round.
• A seat can be cancelled and refunded during registration. Refund choices are owner-only, and a refund that did not go through can be retried.
• Discount codes are accepted at tournament checkout in the app.
• Table cards and pairing sheets can be printed or exported, and the entrants export now matches what the web produces.
• Registration answers appear in the tournament roster and in both exports, with the check-in file labeling its answer columns the same way.
• Templates and series carry authored tournament settings through instead of losing them.
Clubs can now set a service fee, and it is disclosed on every price a player sees: registrations, packages, tournaments, leagues and venue bookings.
Seating a member at a table by hand offers their pass rather than charging them again, and deactivating a table that still has bookings asks first.
Scores from a casual table can be submitted for rating, including a wall game. They are no longer discarded.
If you play in more than one league or scramble at the same club, the app now opens the one you are actually playing, and you can switch between them. Signing up for a season that starts later no longer hides the season running now.
Registration takes you to the question it is waiting on, instead of only telling you one is missing.
Asking for a new login code no longer cancels the code already sitting in your inbox.
Plus fixes to leagues, scrambles, chat, phone verification, sales tax and check-in.
1.1.15 Aug 12
Leagues take a big step forward in this release.
• Buying a season now puts you in the league automatically. Admins no longer keep a separate roster by hand, and a paid-up member can no longer be missing from the seating rotation.
• The league roster is one list. It used to be two lists that could disagree with each other, which meant a member could be registered and still invisible.
• Score entry has a new bonus box, for clubs that run house rules worth extra points. It sits beside mahjongs, points and wall games, and it adds to points only.
• Clubs can credit a member who missed a night and sent a substitute, and can set a fee for someone who covers a seat.
• Substitutes play without their scores counting toward the member's season, so covering a night no longer distorts the standings.
Plus fixes to score saving, league setup and standings.
1.1.14 Aug 10
Fix a match you already proposed.
Got the date wrong? You can now change the date, time or venue of a match you proposed, straight from the match screen. It works even after people have joined: before you save, the screen tells you exactly who will be notified, and everyone on the match is told what changed.
Also in this update:
- The match date and time now look like the controls they are, so they are easier to find when you propose a match.
- Withdrawing from a match is reachable from the notification telling you it changed.
- Tapping a notification opens the right screen. Score confirmations and two other types previously opened nothing at all.
- Scores you entered yourself are no longer overwritten from the Events tab or the round grid.
- Rating one person at your table no longer stops you rating the rest.
- Open challenges whose date has passed drop off the browse list after a day instead of a week, so what is left is what is actually coming up.
- An abandoned checkout no longer reads as a refund.
- A member whose membership already covers an event is no longer asked to pay.
- Reporting a problem holds still while it sends, and tells you the report was saved.
- If a login code may not reach your inbox, the code screen now says so instead of leaving you waiting.
1.1.13 Aug 3
Scramble, end to end.
Your active matches now sit on the home screen, challenges are reachable from the league surface, and you can play another round straight from a finished match. The rules panel states the real rules, and tapping a challenge notification opens that challenge.
Email your league from your phone.
League admins can message league members from the iOS admin surface. Scoring rules appear on the screen where you enter scores, and you can edit scores on the confirm screen before you commit them.
Monthly or yearly memberships.
Choose the billing period when you build a membership, see which one each member holds, and count sessions against the real billing period.
Member pricing that adds up.
Set a member discount percent on the event form, show the member price on event detail, and tell players what they actually owe instead of the face price.
Recurring series repairs.
Add a missed date back into a series, keep add-ons intact when you edit a series or package, and see Free on a free event's roster instead of a stale price.
Follow a club.
Follow clubs from club home and discovery, and add an About blurb to your club settings.
Plus dozens of smaller fixes across check-in, chat links, push notifications, seating privacy, discounts and the event wizard.
1.1.12 Aug 2
League signup questions. Ask your players what you need to know before they join a league — including a phone field — and see every answer on the admin roster.
Gift cards now appear in your activity. They show on the Recent Activity card and in the full Activity Log alongside registrations and package purchases.
Class series just got easier to run. Remove a single event from a series, page through a full activity log, and build a monthly pass that includes zero sessions for members who just want the membership.
Fixes:
• Series and passes now appear on the player home. If your league is sold as a full series, members can find and join it from home instead of needing a direct link.
• A host on their own can seat a casual table.
• A checked-in guest stays visible to whoever paid for them, and no longer shows a Cancel button that could not work.
• Check-in tells you why it declined instead of failing silently.
• A player who hides their identity now stays hidden everywhere their name is shown.
• Blocking a player works as intended.
• Late-cancel fees and event trash are reachable again.
• Punching a series pass no longer loses your signup answers, and can't be blocked by a question that won't render.
• An unpaid gift card is no longer treated as valid.
1.1.11 Jul 28
Book a whole table in one go — reserve every seat at your club's venue as a single booking, with one price and one confirmation.
Scan once, land in the right game: a single join scanner now handles casual tables, league nights, and scrambles, and Start Table takes you straight into a match that's ready to begin.
Scoring fixes: blank score cells are no longer saved as zeros, so a table that hasn't played stays empty instead of creating phantom rows in your standings. Corrections that lower a score to zero now save correctly, and you'll be told if any player's score doesn't go through.
Also includes venue booking and league reliability improvements.
1.1.10 Jul 25
Tournaments arrive in this update: register with signup questions, pay your entry with a gift card, join a paid tournament's waitlist, follow your table, tablemates, and standings live during play, and see your tournament history on your profile. Admins can export standings and payout PDFs. Also new: league chat and match chat, a late-cancellation report for admins, and club purchases shown in the activity feed. Plus many fixes — free events no longer ask for a payment method, and lists load more reliably for large clubs.
1.1.9 Jul 23
Sign-in stability: the app no longer signs you out unexpectedly — a bug that could log you out every few days is fixed, and a dropped internet connection no longer signs you out either. Members and admin lists now load reliably for large clubs. Plus: event add-ons are available when creating an event on paid plans, and waitlist emails now reach the right recipients.
1.1.8 Jul 22
This update brings polish and reliability across clubs, events, and your profile.
• Profile photos — pan, zoom, and re-center your photo, with automatic face-centering to start.
• Sign up friends — pick friends to register alongside you when a host asks.
• Event editor — the admin event form is now organized into clean tabs, and Save jumps straight to any field that needs your attention.
• Verification — a clear "Finish verifying" prompt for paid members, plus the verified badge in more places.
• Roster management — see players who declined and re-enroll them in a tap.
• Venue booking — date pickers now honor each club's real booking window.
• Plus a batch of stability fixes across chat, scores, packages, and contacts.
1.1.7 Jul 21
Clubs can set a member price for a whole series, and members see that price before they buy.
When a series is full, members can join its waitlist instead of seeing Buy.
Admins can close or reopen registration for an event, and players see when it is closed.
On a league night, Mark Absent can ask your sub list to cover the seat.
Club owners can email the players on an attendance report.
Check-in screens can show the club's welcome message and a link to its rules.
Plus smaller fixes and clearer messages.
more Version 1.1.33 1d ago
Data Linked to You The following data may be collected and linked to your identity: