How to manage members

This guide shows you how to invite members, invite migrated placeholders, and control self-registration.

Invite a new member

Registration is invite-only. From the Members UI, select Invite, enter the email and a role (admin, manager, or employee). Solidtime sends an invitation email through Mailjet.

Invite a placeholder member

Migrated people exist as placeholder members. A placeholder member is a placeholder user with the person’s real email, and the imported time entries are attributed to it.

Invite a placeholder with invite-placeholder, not a fresh invitation. A fresh invitation creates a separate member on accept and orphans the imported entries. From the UI, open the placeholder member and select Invite.

To invite every placeholder at once, run the same action the API uses, server-side and without an API token:

POD=$(kubectl get pod -n solidtime -l app.kubernetes.io/component=http -o jsonpath='{.items[0].metadata.name}')
kubectl exec -i -n solidtime "$POD" -c solidtime -- php artisan tinker <<'PHP'
$svc = app(\App\Service\InvitationService::class);
foreach (\App\Models\Member::where('role','placeholder')->with(['user','organization'])->get() as $m) {
    $email = $m->user->email;
    if (\Illuminate\Support\Str::endsWith($email, '@solidtime-import.test')) { echo "SKIP $email\n"; continue; }
    $svc->inviteUser($m->organization, $email, \App\Enums\Role::Employee);
    echo "INVITED: $email\n";
}
PHP

Note

A placeholder with a fake @solidtime-import.test email cannot be invited; use Solidtime’s merge tool instead. A placeholder keyed by a real email, as the Clockify importer creates, invites normally.

Verify that invitations were sent

kubectl exec -n solidtime solidtime-postgres-1 -c postgres -- psql -U postgres -d solidtime -c "SELECT email, role, created_at FROM organization_invitations ORDER BY created_at DESC;"
kubectl exec -n solidtime solidtime-postgres-1 -c postgres -- psql -U postgres -d solidtime -c "SELECT (SELECT count(*) FROM jobs) pending, (SELECT count(*) FROM failed_jobs) failed;"
kubectl logs -n solidtime -l app.kubernetes.io/component=worker --tail=40 | grep OrganizationInvitationMail

Expect a row per invitation, zero failed jobs, and one processed OrganizationInvitationMail per invite.

Disable or enable self-registration

Set enableRegistration in dp-infra/solidtime/config.yaml ("false" is invite-only), rebuild, and push. Then rollout-restart the app deployments, so the ConfigMap change takes effect — see the note on the deployment overview.

The deployment runs invite-only since 2026-07-26.

Warning

Whether an invited person can still create an account while registration is disabled is not verified on the current version. On 0.14 this flag gated both public signup and invited-user account creation: the invitation mail hid the Create Account button and the accept route required an existing login, so nobody could be onboarded. Release 0.15.0 shipped an updated invitation flow that may have decoupled the two.

If an invited person cannot create their account, set enableRegistration back to "true", rebuild, push, restart the pods, and complete the onboarding before disabling it again.