Skip to content

Last updated: 2026-10-20

Beta membership belongs to one app. Installation requires an Active membership and a build assigned to beta.

Each command reads package_id from the current directory's app.json. Use --package-id <id> to target an app from another directory.

evenhub testers ​

List the roster and each tester's status:

bash
evenhub testers
evenhub testers --search name@
evenhub testers --package-id com.example.myapp --json
OptionDescription
--search <keyword>Filter by email
--package-id <id>Override the package ID read from app.json
--jsonReturn one JSON object

evenhub testers add ​

Invite one address, several addresses or a file:

bash
evenhub testers add a@example.com
evenhub testers add "a@example.com,b@example.com"
evenhub testers add --from ./testers.csv
OptionDescription
--from <file>Read addresses from a text file or single-column CSV
--reinviteSend a new invitation to an already Invited address
--package-id <id>Override the package ID read from app.json

Comma, semicolon and newline separators are accepted. Quote a list containing shell separators. Email spelling and case are preserved. Exact duplicate strings are removed; case variants are submitted separately and reported in the output.

Existing memberships ​

Matching uses the exact email string, including case.

Existing statusDefault behaviourWith --reinvite
InvitedSkip; keep the current invitation linkSend a new invitation; invalidate the earlier link
ActiveSkip; keep accepted membershipSkip; keep accepted membership
Rejected or ExpiredSubmit a new invitationSubmit a new invitation

Use --reinvite when an Invited tester needs a replacement email:

bash
evenhub testers add a@example.com --reinvite

The earlier link stops working. Expired invitations can be submitted again without this flag.

The file format ​

--from accepts one address per line or a single-column CSV with an optional email header:

text
email
a@example.com
b@example.com

Quoted CSV cells and a leading byte-order mark are supported. The entire batch is validated before submission: a malformed address exits 9 and leaves the roster unchanged.

A successful result confirms that invitation requests were submitted. It does not confirm email delivery. In JSON, invited lists submitted addresses, skipped explains held-back entries, and reinvited identifies submitted addresses matched to existing non-Active rows under --reinvite.

evenhub testers rm ​

Remove memberships from this app:

bash
evenhub testers rm a@example.com
evenhub testers rm "a@example.com,b@example.com"

The removed account no longer qualifies for new beta installs through that membership. Use --package-id <id> to target another app.

Invitation states ​

StatusMeaning
InvitedInvitation awaiting a response
ActiveInvitation accepted; eligible to install the beta build
RejectedInvitation declined
ExpiredNo response within seven days

Invitations expire after seven days. Membership alone does not select a build; promote --to beta sets the version testers can install.

Limits ​

The server can reject further invitations with exit 8. Inspect the returned code, message and hint to distinguish an invitation limit from rate limiting. Repeated invitations, including --reinvite, are subject to these limits.

When the build does not appear ​

Check the two installation conditions separately:

bash
evenhub ls com.example.myapp
evenhub testers --package-id com.example.myapp
CheckExpected resultIf missing
BuildCHANNEL includes betaPromote the intended version
TesterCorrect account email has status ActiveAsk the tester to accept a valid invitation

Handle command errors before interpreting the roster or build list. Re-adding an exact Active address leaves its accepted membership unchanged.