twentyhq/twenty · error · Error

createPartner did not return an id

Error message

createPartner did not return an id

What it means

submitPartnerApplication asserts the createPartner mutation's returned id before linking a person to the new partner. An undefined partnerId means createPartner returned a null/id-less payload — the server rejected the insert without throwing (e.g. validation, permission, or a manifest-level constraint on Partner).

Source

Thrown at packages/twenty-apps/internal/twenty-partners/src/modules/partner/application-intake/services/submit-partner-application.service.ts:47

    if (existingEdge && existingEdge.partner) {
      const partnerId = existingEdge.partner.id;
      await updatePartner(client, partnerId, partnerFields);
      await updatePerson(client, existingEdge.id, {
        name: { firstName: input.firstName.trim(), lastName: input.lastName.trim() },
      });
      return { ok: true, created: false, partnerId };
    }

    const companyId = await findOrCreateCompanyId(client, input);

    const partnerResult = await createPartner(
      client,
      buildPartnerCreateData(partnerFields, input, companyId),
    );
    const partnerId = partnerResult.createPartner?.id;
    if (partnerId === undefined) {
      throw new Error('createPartner did not return an id');
    }

    if (existingEdge) {
      await updatePerson(client, existingEdge.id, {
        partnerId,
        name: { firstName: input.firstName.trim(), lastName: input.lastName.trim() },
      });
    } else {
      await createPerson(client, {
        name: { firstName: input.firstName.trim(), lastName: input.lastName.trim() },
        emails: { primaryEmail: email },
        partnerId,
        companyId,
      });
    }

    return { ok: true, created: true, partnerId };
  } catch (err) {

View on GitHub (pinned to 1f5dd2bbd2)

Solutions

  1. Inspect the raw createPartner response for null payload or errors array.
  2. Confirm buildPartnerCreateData produced valid required fields and a valid companyId.
  3. Verify the caller's role has Partner create permission and Partner is synced in metadata.
  4. Reproduce createPartner in the GraphQL playground to read the server rejection.

Example fix

// before
const partnerResult = await createPartner(client, buildPartnerCreateData(partnerFields, input, companyId));
const partnerId = partnerResult.createPartner?.id;
if (partnerId === undefined) {
  throw new Error('createPartner did not return an id');
}

// after — surface context
const partnerResult = await createPartner(client, buildPartnerCreateData(partnerFields, input, companyId));
const partnerId = partnerResult.createPartner?.id;
if (partnerId === undefined) {
  throw new Error(`createPartner did not return an id (email=${email}, companyId=${companyId}, result=${JSON.stringify(partnerResult)})`);
}
Defensive patterns

Strategy: type-guard

Validate before calling

function assertPartnerCreateData(data: Record<string, unknown>, companyId: string) {
  if (!companyId) throw new Error('createPartner requires a valid companyId');
  if (!data || Object.keys(data).length === 0) {
    throw new Error('createPartner requires non-empty partner fields');
  }
}
assertPartnerCreateData(buildPartnerCreateData(...), companyId);

Type guard

const hasCreatedPartnerId = (r: unknown): r is { createPartner: { id: string } } =>
  typeof r === 'object' && r !== null &&
  typeof (r as any).createPartner?.id === 'string';

if (!hasCreatedPartnerId(partnerResult)) {
  throw new Error(`createPartner returned no id: ${JSON.stringify(partnerResult)}`);
}

Prevention

When it happens

Trigger: createPartner returns { createPartner: null } or no id. Causes: caller lacks Partner create permission; a required partner field invalid; Partner metadata out of sync; the buildPartnerCreateData payload references an unknown companyId; a duplicate-partner guard on the server.

Common situations: Application for a partner whose email already maps to an existing partner (dedup edge case); role lacks Partner create; manifest changed Partner fields; companyId from findOrCreateCompanyId is stale/wrong.

Related errors


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