Publishing
Playtests
A playtest sends one build of your game to adult players who have signed up to test games. Each tester plays once, for up to 15 minutes. You get a video of the game area, a timeline of what happened and the tester's answers to your questions.
Who tests
- Testers are adults (18 or older) with a verified email address who joined playtests on their account.
- Each tester agrees to the recording before every session and can stop at any time.
- You see testers as "Tester 1", "Tester 2" and so on. You never see their username or email.
- You cannot test your own game, and each tester takes a playtest once.
Request a playtest
- Open Developer dashboard → Playtests and choose New playtest.
- Choose the game and the version. Any version that was not rejected can be tested, including drafts that are not submitted for review.
- Choose 1 to 20 sessions and the devices: any, desktop or mobile.
- Add up to 5 tasks for testers to try and up to 5 questions to answer afterwards. Both are optional.
- Choose Send for approval.
You can have 3 playtests open or waiting for approval at a time.
Approval
Smaz Games staff approve every playtest before testers see it. When it is approved you get a notification and opted-in testers are invited. If it is declined, the notification and the Playtests page give the reason. Fix the issue and send a new request.
A draft version in a playtest is shown only to testers in that playtest. It is not published and its address is not public.
What is recorded
- Video of the game's canvas. Games that draw without a canvas may be recorded from the browser tab on desktop Chrome and Edge, cropped to the game area, or have no video.
- Key presses and taps inside the game, console messages and uncaught errors.
- The SDK calls listed under Timeline.
- Device type, browser, system and screen size.
- The tester's answers.
No sound, microphone or camera is recorded.
Recordings
Recordings appear on your Playtests page as testers finish. Only you and Smaz Games staff can watch them. Each recording is deleted 30 days after it was made. Testers can delete their own recordings sooner, and you can delete any recording or a whole playtest at any time.
Closing a playtest stops new sessions. Testers who already started can finish and send their session.
The SDK in a playtest
Your game does not need the SDK to be playtested. If it uses the SDK, it runs as it does on the site with these differences:
| Area | In a playtest |
|---|---|
| Player | getUser() resolves to null and init() reports user: null. There is no player account. |
| Player token | getPlayerToken() rejects with status 401, as it does for a guest. |
| Sign-in | promptSignIn() resolves to { status: 'unavailable', reason: 'playtest' }. |
| Saves | load, save and data.* work, but saves last only for the session. Each session starts empty. cloudSupported and guestSaveAvailable are false. |
| Guest import | importGuest() rejects with status 401. |
| Ads | Off. adsEnabled is false, ad requests resolve to { status: 'unavailable', rewardGranted: false, reason: 'disabled' } and isAdBlocked() resolves to false. |
| Banners | requestBanner() and clearBanner() resolve to { status: 'unavailable', reason: 'host-rendered' }, as on the site. |
| Invites | getInviteLink() and multiplayer.inviteLink() reject with status 403. shareInvite() and multiplayer.share() resolve to { status: 'unavailable', reason: 'playtest' } with no url. showInviteButton() and multiplayer.updateRoom() resolve to { ok: false, reason: 'playtest' } and no button is shown. hideInviteButton() and multiplayer.leaveRoom() resolve to { ok: true }. |
| Outside links | openExternalLink() rejects with status 403. |
| URL parameters | init() reports params: {} and getURLParam() returns null. |
| Settings | getSettings(), onSettingsChange(), getSystemInfo() and isMobile() work as on the site. disableChat is true. |
| Errors | captureError() and init({ captureErrors: true }) send errors to your error log, tagged with the tested version, and to the playtest timeline. |
| Events | track() resolves to { ok: true, sent: false }. Events go to the playtest timeline, not to analytics. |
init() also reports playtest: true, so a game can skip online features during a playtest:
const env = await OpenArcade.init({ captureErrors: true });
if (env.playtest) {
// no player account, invites or outside links in this session
}Rate limits are the same as on the site. See the SDK reference.
Timeline
Each recording has a timeline under the video. Select an entry to jump to that moment. It shows:
loadingStart,loadingStop,gameplayStart,gameplayStopandhappyMomentcallstrackevents with their parameters- errors from
captureErrorand uncaught errors - console messages, key presses and taps
- markers the tester added (Confusing, Bug, Fun, Too hard) and tasks they ticked
- when the tester switched away from the tab