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
- Inspect the raw createPartner response for null payload or errors array.
- Confirm buildPartnerCreateData produced valid required fields and a valid companyId.
- Verify the caller's role has Partner create permission and Partner is synced in metadata.
- 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
- Confirm companyId from findOrCreateCompanyId is valid before building partner data.
- Validate required partner fields are present before createPartner.
- Always select and assert id on createPartner results.
- Confirm Partner create permission and metadata sync.
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
- createCompany did not return an id
- createPerson did not return an id
- createOpportunity did not return an id
- createOpportunity did not return an id
- createCompany did not return an id
AI-assisted analysis of twentyhq/twenty@1f5dd2bbd2 (2026-08-12).
Data as JSON: /api/errors/e5f61927a8ed9bce.
Report an issue: GitHub.