Properties
Properties define the data fields available on HubSpot objects (contacts, companies, deals, tickets, and custom objects). JetStack AI imports property definitions — not property values on individual records — and deploys them to target portals with intelligent conflict resolution.
Property Types
Section titled “Property Types”HubSpot properties span a wide range of field types:
| Type | Field Types | Notes |
|---|---|---|
| string | text, textarea, phonenumber, html | Standard text entry |
| number | number | Numeric values |
| date | date | Date picker |
| datetime | datetime | Date and time picker |
| enumeration | select, radio, checkbox, booleancheckbox | Single or multi-select from options |
| currency | number (special) | Monetary values with currency display |
| score | calculation | Lead scoring — NOT portable |
| calculation | calculation | Calculated/rollup properties — NOT portable |
NOT_PORTABLE Types
Section titled “NOT_PORTABLE Types”Three property types cannot be automatically migrated via the HubSpot API:
- Score — Lead scoring properties depend on portal-specific scoring rules
- Calculation — Calculated properties use formulas that reference other properties by internal name
- Rollup — Rollup properties aggregate data across associated records
These types are imported and displayed in the deploy wizard, but they are flagged as mapping requirements. During the mapping step, you must either manually create them in the target portal and map them, or exclude them from deployment.
Property Groups
Section titled “Property Groups”Every property belongs to a property group. During deployment, JetStack AI checks whether the property’s group exists in the target portal. If the group is missing, it is auto-created before the property is deployed. The group is created with the same name and label as the source group.
Deploy Behavior
Section titled “Deploy Behavior”Existence Checking
Section titled “Existence Checking”Before creating a property, JetStack AI checks whether a property with the same internal name already exists on the same object type in the target portal. This check is cached per object type to minimize API calls — the first property deployment for an object type fetches the full property list, and subsequent properties for that object type use the cached result.
Type Mismatch Resolution
Section titled “Type Mismatch Resolution”If a property with the same name already exists but has a different type or field type, JetStack AI cannot overwrite it (HubSpot does not allow changing a property’s type after creation). Instead, it creates a new property with a modified name using the suffix pattern:
{propertyName}_{type}_supr— If the base type differs{propertyName}_{fieldType}_supr— If the field type differs
For example, if a property named lead_source exists as type string in the target portal but the source has it as type enumeration, JetStack AI creates lead_source_enumeration_supr in the target portal. A warning is logged so you can reconcile the properties manually after deployment.
Enumeration Option Merging
Section titled “Enumeration Option Merging”For properties with options (select, radio, checkbox), JetStack AI performs a union merge of the source and target options:
- Fetch existing options on the target property (if it exists)
- Compare source options against target options by internal value
- Add any source options that do not already exist in the target
- Preserve all existing target options unchanged
This means deploying a property never removes options from the target — it only adds missing ones.
System Property Skipping
Section titled “System Property Skipping”HubSpot defines 131+ system properties that are built into every portal (e.g., firstname, lastname, email, createdate, hs_object_id). These properties cannot be created or modified via the API. JetStack AI maintains a list of known system properties and automatically skips them during deployment. No error or warning is raised for skipped system properties.
Edge Cases
Section titled “Edge Cases”Currency Property Transformation
Section titled “Currency Property Transformation”The HubSpot API has an inconsistency with currency properties. In the source portal, currency properties are stored with fieldType: "currency", but the property creation API does not accept "currency" as a valid field type. JetStack AI transforms currency properties during deployment:
| Source Value | Deployed Value |
|---|---|
fieldType: "currency" | fieldType: "number" |
| (added) | displayMode: "current_value" |
| (added) | showCurrencySymbol: true |
This transformation requires using the v2 property API endpoint rather than the v3 endpoint. The result is visually and functionally identical to a currency property in HubSpot.
Invalid Property Name Detection
Section titled “Invalid Property Name Detection”Some property names from source portals are invalid for creation via the API. JetStack AI detects and skips properties with names that match these patterns:
- Numeric-only names — Names like
12345or001(typically artifacts from system processes) - UUID-format names — Names matching UUID patterns (e.g.,
a1b2c3d4-e5f6-7890-abcd-ef1234567890) - Colon-containing names — Names with colons (e.g.,
hs:some_internal_prop) which indicate HubSpot internal properties
Skipped properties are logged with a warning explaining why they were excluded.
Object Type Scope
Section titled “Object Type Scope”Properties are scoped to specific object types. A property named status on contacts is entirely separate from a property named status on deals. JetStack AI tracks and deploys properties per object type, and the existence cache is maintained separately for each object type.
Troubleshooting
Section titled “Troubleshooting”- “Property already exists with different type” — A property with the same name exists in the target portal but with an incompatible type. Check the deploy log for the
_suprsuffixed property that was created instead. You may want to manually migrate data between the old and new property. - Property group not appearing — The auto-created group should appear immediately. If it does not, check whether a group with the same internal name but different label already exists in the target portal.
- Currency property looks like a number field — Verify that the property was created with
showCurrencySymbol: true. If it was deployed via the v3 API by mistake, the currency display formatting may be missing. - Score/calculation property not deployed — These NOT_PORTABLE types must be manually created in the target portal. Use the mapping step to link the source property to a manually created target property.
- Missing options on select property — Enumeration merging only adds options; it does not reorder them. If the option order matters, adjust it manually in HubSpot after deployment.