{"record":{"id":"e4f3552ee6420e9d","repo":"Budibase/budibase","slug":"user-revision-missing","errorCode":null,"errorMessage":"User revision missing","messagePattern":"User revision missing","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/builder/src/settings/pages/people/users/workspaceInviteUtils.ts","lineNumber":397,"sourceCode":"        matchingUser?.role,\n        matchingUser?.appRole\n      )\n      const useGroupWorkspaceRole = shouldUseGroupWorkspaceRole({\n        workspaceId,\n        role: matchingUser?.role,\n        appRole: matchingUser?.appRole,\n        selectedGroupIds,\n        allGroups,\n      })\n      if (useGroupWorkspaceRole) {\n        return null\n      }\n      if (!role) {\n        return null\n      }\n      const fullUser = await users.get(createdUser._id)\n      if (!fullUser?._rev) {\n        throw new Error(\"User revision missing\")\n      }\n      await users.addUserToWorkspace(createdUser._id, role, fullUser._rev)\n      return createdUser.email\n    })\n  )\n\n  const addedToWorkspaceEmails = assignmentResults\n    .filter(\n      (result): result is PromiseFulfilledResult<string | null> =>\n        result.status === \"fulfilled\"\n    )\n    .map(result => result.value)\n    .filter((email): email is string => !!email)\n\n  return {\n    addedToWorkspaceEmails,\n    assignedCount: addedToWorkspaceEmails.length,\n    failedCount: assignmentResults.filter(","sourceCodeStart":379,"sourceCodeEnd":415,"githubUrl":"https://github.com/Budibase/budibase/blob/a81a902e9a8fe55b467d106765f6638f12e35c49/packages/builder/src/settings/pages/people/users/workspaceInviteUtils.ts#L379-L415","documentation":"assignCreatedUsersToWorkspace fetches each newly created user via users.get(createdUser._id) to obtain its _rev, which is mandatory for addUserToWorkspace. If the fetch returns nothing or a doc without _rev it throws 'User revision missing'. This typically indicates the just-created user could not be read back.","triggerScenarios":"After batch user creation, users.get(createdUser._id) for one of the created users returns undefined or a document without _rev — e.g. eventual consistency delay, creation partially failed, or the API response lacked _rev.","commonSituations":"Bulk invite where one user creation silently failed but the id was still processed; DB replication lag right after creation; permission restrictions on reading the new user document.","solutions":["Retry the users.get call after creation (small delay or retry loop) to obtain _rev.","Verify the user was actually created successfully before attempting workspace assignment; handle creation failures per user.","Take _rev directly from the create-user API response when available instead of re-fetching."],"exampleFix":"// before\nconst fullUser = await users.get(createdUser._id)\nif (!fullUser?._rev) { throw new Error(\"User revision missing\") }\n// after\nlet fullUser = await users.get(createdUser._id)\nif (!fullUser?._rev) { await new Promise(r => setTimeout(r, 500)); fullUser = await users.get(createdUser._id) }\nif (!fullUser?._rev) { return null }","handlingStrategy":"retry","validationCode":"const fullUser = await users.get(createdUser._id)\nif (!fullUser?._rev) return null // skip this user and report it\n// proceed only when _rev exists","typeGuard":"const isStoredUser = (u: Partial<User>): u is User & { _id: string; _rev: string } =>\n  typeof u._id === \"string\" && typeof u._rev === \"string\" && u._rev.length > 0","tryCatchPattern":"try {\n  await users.addUserToWorkspace(createdUser._id, role, fullUser._rev)\n} catch (e) {\n  if (e.message === \"User revision missing\") {\n    await sleep(500)\n    const retried = await users.get(createdUser._id)\n    if (retried?._rev) return users.addUserToWorkspace(createdUser._id, role, retried._rev)\n    return null\n  }\n  throw e\n}","preventionTips":["Take _rev from the create-user response when available to avoid the read-back race.","Add a short retry/delay when reading back freshly created users.","Verify each user creation succeeded before scheduling its workspace assignment."],"tags":["users","workspace","revision","builder"],"backgroundTag":"missing-document-rev","analyzedSha":"a81a902e9a8fe55b467d106765f6638f12e35c49","analyzedAt":"2026-08-29T01:03:10.972Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}