Files
hermes-skills/skills/devops/debt-recovery-workflow/references/twentycrm-data-model.md
T

2.9 KiB

TwentyCRM Custom Object & Field Setup (DRE)

Deployment

  • Installed at /root/docker/twenty/ via Docker Compose
  • Access: https://crm.debtrecoveryexperts.com
  • API key: TWENTY_CRM_API_KEY in ~/.hermes/.env
  • Metadata API endpoint: POST https://crm.debtrecoveryexperts.com/metadata
  • GraphQL endpoint: POST https://crm.debtrecoveryexperts.com/graphql
  • REST endpoint: GET/POST/DELETE https://crm.debtrecoveryexperts.com/rest/{object-name}

Critical Config

  • SERVER_URL in .env must be set to the public domain, not localhost
  • REACT_APP_SERVER_BASE_URL must be passed to the server container (copy from SERVER_URL)
  • Port mapped: 3001:3000 in docker-compose (not 3000 directly)

Custom Objects Created for DRE

Claims

ID: 0c6808cf-b5e8-4f39-8c4f-6dc6b7d029f3 Fields: claimNumber (TEXT), claimAmount (NUMBER), debtType (TEXT), currentTier (TEXT), status (TEXT), state (TEXT), dateFiled (DATE), aiScore (NUMBER), description (TEXT)

Debtors

ID: bac887ba-22a9-46fe-b988-e1985ee19b29 Fields: businessName (TEXT), contactName (TEXT), email (TEXT), phone (TEXT), address (TEXT), businessType (TEXT), notes (TEXT)

Payments

ID: bde74e7b-b1c2-48eb-be5b-f3ea2207873c Fields: paymentAmount (NUMBER), paymentDate (DATE), paymentMethod (TEXT), dreFee (NUMBER), costsDeducted (NUMBER), netToClient (NUMBER)

Case Notes

ID: 176736a7-6d3b-4129-ac03-67cea102d618 Fields: content (TEXT), timestamp (DATE)

Field Creation (GraphQL Metadata API)

mutation {
  createOneField(input: {
    field: {
      name: "fieldName", label: "Field Label", type: TEXT,
      objectMetadataId: "uuid-of-object"
    }
  }) { id name }
}

RELATION Field Creation

mutation {
  createOneField(input: {
    field: {
      name: "debtorRelation", label: "Debtor", type: RELATION,
      objectMetadataId: "source-object-uuid",
      relationCreationPayload: {
        type: "MANY_TO_ONE",
        targetObjectMetadataId: "target-object-uuid",
        targetFieldLabel: "Related Field Label",
        targetFieldIcon: "IconBriefcase"
      }
    }
  }) { id name }
}

Relationship Creation Status

  • Claim → Debtor: MANY_TO_ONE ✓ (confirmed working)
  • Payment → Claim: via UI (API needs different payload format)
  • Case Note → Claim: via UI

Deleting Default Data

  • Objects via REST: DELETE https://crm.debtrecoveryexperts.com/rest/{object-name}/{id}
  • Workflows: DELETE https://crm.debtrecoveryexperts.com/rest/workflows/{id}
  • Two default workflows deleted: "Create company when adding a new person" and "Quick Lead"

Common Pitfalls

  • RELATION type fields need relationCreationPayload at the field level
  • Field types use UPPERCASE enum names without quotes in GraphQL
  • Use objectMetadataId NOT objectId
  • REST endpoints are plural: /rest/workflows, /rest/companies
  • API key is workspace-scoped — one key per workspace
  • Portal/UI login and API login are separate sessions