Create a Custom Field

Add new custom fields to extend your project's data structure with type-specific configurations


Create a Custom Field

Custom fields allow you to tailor Blue to your specific business needs by adding structured data fields to your records. This endpoint creates a new custom field with configurations specific to each field type.

Basic Example

mutation CreateTextField {
  createCustomField(input: {
    name: "Customer Name"
    type: TEXT_SINGLE
    description: "Primary customer contact name"
  }) {
    id
    uid
    name
    type
    position
  }
}

Advanced Example

mutation CreateAdvancedField {
  createCustomField(input: {
    name: "Project Budget"
    type: CURRENCY
    description: "Total allocated budget for this project"
    currency: "USD"
    min: 0
    max: 1000000
  }) {
    id
    uid
    name
    type
    currency
    min
    max
    position
    createdAt
  }
}

Input Parameters

CreateCustomFieldInput

ParameterTypeRequiredDescription
nameString!✅ YesThe display name of the custom field
typeCustomFieldType!✅ YesThe field type (see types below)
descriptionStringNoOptional description explaining the field’s purpose
minFloatNoMinimum value for NUMBER, RATING, PERCENT fields
maxFloatNoMaximum value for NUMBER, RATING, PERCENT fields
currencyStringNoISO currency code for CURRENCY fields
prefixStringNoText prefix for UNIQUE_ID fields
isDueDateBooleanNoWhether DATE field represents a due date
formulaJSONNoFormula configuration for FORMULA fields
referenceProjectIdStringNoTarget project ID for REFERENCE fields
referenceMultipleBooleanNoAllow multiple selections in REFERENCE fields
referenceFilterTodoFilterInputNoFilter options for REFERENCE fields
lookupOptionCustomFieldLookupOptionInputNoConfiguration for LOOKUP fields
timeDurationDisplayCustomFieldTimeDurationDisplayTypeNoDisplay format for TIME_DURATION
timeDurationTargetTimeFloatNoTarget time in seconds for TIME_DURATION
timeDurationStartInputCustomFieldTimeDurationInputNoStart trigger for TIME_DURATION
timeDurationEndInputCustomFieldTimeDurationInputNoEnd trigger for TIME_DURATION
buttonTypeStringNoButton action type for BUTTON fields
buttonConfirmTextStringNoConfirmation prompt for BUTTON fields
useSequenceUniqueIdBooleanNoUse sequential numbering for UNIQUE_ID
sequenceDigitsIntNoNumber of digits in sequence (e.g., 5 → 00001)
sequenceStartingNumberIntNoStarting number for sequence
currencyFieldIdStringNoReference currency field for CURRENCY_CONVERSION
conversionDateStringNoConversion date for CURRENCY_CONVERSION
conversionDateTypeStringNoType of conversion date for CURRENCY_CONVERSION
metadataJSONNoAdditional metadata for the custom field

CustomFieldType Values

ValueDescriptionRequired Parameters
TEXT_SINGLESingle line text inputNone
TEXT_MULTIMulti-line text areaNone
SELECT_SINGLESingle selection dropdownCreate options separately
SELECT_MULTIMultiple selection dropdownCreate options separately
CHECKBOXBoolean checkboxNone
RATINGStar rating fieldOptional: max (default: 5)
PHONEPhone number with validationNone
NUMBERNumeric inputOptional: min, max
CURRENCYCurrency amountOptional: currency, min, max
PERCENTPercentage (0-100)Optional: min, max
EMAILEmail with validationNone
URLWeb URL with validationNone
UNIQUE_IDAuto-generated identifierOptional: prefix, useSequenceUniqueId
LOCATIONGeographic coordinatesNone
FILEFile attachmentNone
DATEDate pickerOptional: isDueDate
COUNTRYCountry selectorNone
FORMULACalculated fieldRequired: formula
REFERENCELink to other recordsRequired: referenceProjectId
LOOKUPPull data from referencesRequired: lookupOption
TIME_DURATIONTime trackingRequired: duration inputs (see below)
BUTTONAction buttonOptional: buttonType, buttonConfirmText
CURRENCY_CONVERSIONCurrency converterSpecial configuration

Field Type Configuration Examples

Number Field with Constraints

mutation CreateQuantityField {
  createCustomField(input: {
    name: "Quantity"
    type: NUMBER
    description: "Number of items"
    min: 1
    max: 999
  }) {
    id
    name
    min
    max
  }
}

Currency Field

mutation CreateBudgetField {
  createCustomField(input: {
    name: "Budget"
    type: CURRENCY
    currency: "EUR"
    min: 0
  }) {
    id
    name
    currency
    min
  }
}

Date Field with Due Date Flag

mutation CreateDeadlineField {
  createCustomField(input: {
    name: "Project Deadline"
    type: DATE
    isDueDate: true
    description: "When this project must be completed"
  }) {
    id
    name
    isDueDate
  }
}

Reference Field

mutation CreateRelatedTasksField {
  createCustomField(input: {
    name: "Dependencies"
    type: REFERENCE
    referenceProjectId: "proj_abc123"
    referenceMultiple: true
    referenceFilter: {
      statusIds: ["status_open", "status_inprogress"]
    }
  }) {
    id
    name
    referenceProjectId
    referenceMultiple
  }
}

Lookup Field

mutation CreateLookupField {
  createCustomField(input: {
    name: "Customer Email"
    type: LOOKUP
    lookupOption: {
      referenceId: "field_customer_ref"
      lookupId: "field_email"
      lookupType: TODO_CUSTOM_FIELD
    }
  }) {
    id
    name
    customFieldLookupOption {
      referenceId
      lookupId
      lookupType
    }
  }
}

Unique ID with Sequence

mutation CreateOrderNumberField {
  createCustomField(input: {
    name: "Order Number"
    type: UNIQUE_ID
    prefix: "ORD-"
    useSequenceUniqueId: true
    sequenceDigits: 6
    sequenceStartingNumber: 1000
  }) {
    id
    name
    prefix
  }
}

Time Duration Field

mutation CreateTimeTrackingField {
  createCustomField(input: {
    name: "Time to Resolution"
    type: TIME_DURATION
    timeDurationDisplay: FULL_DATE_STRING
    timeDurationStartInput: {
      type: TODO_CREATED_AT
      condition: FIRST
    }
    timeDurationEndInput: {
      type: TODO_MARKED_AS_COMPLETE
      condition: FIRST
    }
  }) {
    id
    name
  }
}

Valid Time Duration Types

  • TODO_CREATED_AT - When the record was created
  • TODO_CUSTOM_FIELD - When a custom field changes
  • TODO_DUE_DATE - When due date is set/changed
  • TODO_MARKED_AS_COMPLETE - When record is marked complete
  • TODO_MOVED - When record is moved to different list
  • TODO_TAG_ADDED - When a tag is added
  • TODO_ASSIGNEE_ADDED - When an assignee is added

Creating Select Options

After creating a SELECT_SINGLE or SELECT_MULTI field, add options:

mutation CreateSelectOptions {
  createCustomFieldOptions(input: {
    customFieldId: "field_xyz789"
    customFieldOptions: [
      { title: "High", color: "#FF0000", position: 1 }
      { title: "Medium", color: "#FFA500", position: 2 }
      { title: "Low", color: "#00FF00", position: 3 }
    ]
  }) {
    id
    title
    color
    position
  }
}

Response Fields

CustomField

FieldTypeDescription
idString!Unique identifier
uidString!User-friendly unique ID
nameString!Display name
typeCustomFieldType!Field type
descriptionStringField description
positionFloat!Display order position
createdAtDateTime!Creation timestamp
updatedAtDateTime!Last update timestamp
minFloatMinimum value (if applicable)
maxFloatMaximum value (if applicable)
currencyStringCurrency code (CURRENCY type)
prefixStringID prefix (UNIQUE_ID type)
isDueDateBooleanDue date flag (DATE type)
formulaJSONFormula config (FORMULA type)
referenceProjectIdStringReferenced project (REFERENCE type)
customFieldLookupOptionCustomFieldLookupOptionLookup config (LOOKUP type)

Required Permissions

Creating custom fields requires project access:

RoleCan Create Custom Fields
OWNER✅ Yes
ADMIN✅ Yes
MEMBER✅ Yes
CLIENT❌ No

Note: Custom roles may have additional restrictions on field management.

Error Responses

Invalid Field Type

{
  "errors": [{
    "message": "Variable \"$input\" got invalid value \"INVALID\" at \"input.type\"; Value \"INVALID\" does not exist in \"CustomFieldType\" enum.",
    "extensions": {
      "code": "GRAPHQL_VALIDATION_FAILED"
    }
  }]
}

Reference Project Not Found

{
  "errors": [{
    "message": "Reference project not found or access denied",
    "extensions": {
      "code": "PROJECT_NOT_FOUND"
    }
  }]
}

Missing Required Configuration

{
  "errors": [{
    "message": "REFERENCE fields require referenceProjectId",
    "extensions": {
      "code": "VALIDATION_ERROR"
    }
  }]
}

Important Notes

  • Field Position: Automatically calculated to appear at the end of existing fields
  • Field Limits: Projects may have limits on the number of custom fields
  • Immediate Availability: Created fields are immediately available for use
  • Side Effects: Creating a field triggers:
    • Activity log entry
    • Real-time updates to connected users
    • Webhook notifications
    • Background jobs for FORMULA, LOOKUP, and UNIQUE_ID fields
  • Special Considerations:
    • REFERENCE fields require access to the target project
    • LOOKUP fields depend on existing REFERENCE fields
    • FORMULA fields cannot reference themselves
    • UNIQUE_ID sequences process asynchronously
    • SELECT fields need options created separately
  • Naming: Field names should be clear and descriptive as they appear in the UI