twentyhq/twenty · error · Error

workspaceMember object not found in workspace metadata.

Error message

workspaceMember object not found in workspace metadata.

What it means

configure-partner-rls separately asserts that the workspaceMember object exists in metadata (beyond the app objects) because the RLS self-scope predicate references workspaceMember.id. It throws before resolving the workspaceMember id field. Same root cause as the app-object check: the workspace lacks the expected metadata.

Source

Thrown at packages/twenty-apps/internal/twenty-partners/src/scripts/configure-partner-rls.ts:318

    apiKey,
    `{ objects(paging:{first:100}) { edges { node { id nameSingular } } } }`,
  );

  const objectIdByName = new Map<string, string>(
    objectsData.objects.edges.map((e) => [e.node.nameSingular, e.node.id]),
  );

  for (const name of ALL_TARGET_OBJECTS) {
    if (!objectIdByName.has(name)) {
      throw new Error(
        `Object "${name}" not found in workspace metadata. ` +
          `Has the app been installed and synced?`,
      );
    }
  }

  if (!objectIdByName.has('workspaceMember')) {
    throw new Error('workspaceMember object not found in workspace metadata.');
  }

  const workspaceMemberId = objectIdByName.get('workspaceMember') as string;

  const objectInfoByName = new Map<SimpleTargetObject, ObjectInfo>();

  for (const name of SIMPLE_TARGET_OBJECTS) {
    const objectId = objectIdByName.get(name) as string;
    const partnerUserFieldMetadataId = await findFieldByName(
      metadataUrl,
      apiKey,
      objectId,
      name,
      'partnerUser',
    );
    objectInfoByName.set(name, {
      objectMetadataId: objectId,
      partnerUserFieldMetadataId,

View on GitHub (pinned to 1f5dd2bbd2)

Solutions

  1. Wait for / trigger a metadata sync and re-run rls:configure.
  2. Confirm TWENTY_PARTNERS_API_URL/TWENTY_PARTNERS_API_KEY point at the correct workspace.
  3. Verify the Twenty server version exposes workspaceMember in the metadata objects query.
  4. If workspaceMember is intentionally hidden, revisit the self-scope predicate design before proceeding.

Example fix

// before
if (!objectIdByName.has('workspaceMember')) {
  throw new Error('workspaceMember object not found in workspace metadata.');
}

// after — list all available objects to aid diagnosis
if (!objectIdByName.has('workspaceMember')) {
  const available = [...objectIdByName.keys()].join(', ');
  throw new Error(
    `workspaceMember object not found in workspace metadata. ` +
    `Available objects: ${available}. Re-sync metadata then re-run rls:configure.`,
  );
}
Defensive patterns

Strategy: validation

Validate before calling

const objects = await fetchObjectNames(metadataUrl, apiKey);
if (!objects.includes('workspaceMember')) {
  throw new Error('workspaceMember not in metadata; complete the install/sync then re-run rls:configure');
}

Prevention

When it happens

Trigger: objects query result has no edge with nameSingular === 'workspaceMember'. Causes: workspace metadata incomplete/not synced; querying a workspace where the member object isn't exposed; metadata API version that doesn't surface workspaceMember.

Common situations: Metadata sync incomplete after install; wrong workspace; older server version that doesn't expose workspaceMember as a queryable object.

Related errors


AI-assisted analysis of twentyhq/twenty@1f5dd2bbd2 (2026-08-12). Data as JSON: /api/errors/e3845c58b0c849bc. Report an issue: GitHub.