HubSpot Integration — Custom Properties
FlowState provisions 10 custom deal properties in a dedicated HubSpot property group called flowstate_apn. Provisioning is not automatic — it runs the first time you click Provision properties on the HubSpot integration page (or call the provision_hubspot_properties MCP tool), not at OAuth-connect time. The provisioner is idempotent — running it multiple times never overwrites existing values.
Every FlowState-provisioned property has a display name (label) that begins with APN so it is unmistakable in the HubSpot deal view, filters, and reports. The provisioner updates the label on every run, so re-provisioning corrects any property whose label predates this convention.
All 10 properties are visible on the deal record in HubSpot. Your team can reference them in deal views, filters, and reports without needing to open FlowState.
Nine properties this doc used to list are gone. apn_partner_need, apn_use_case, apn_delivery_model, apn_sales_activity, apn_state_region, apn_client_industry, apn_client_country, apn_currency and apn_submission_type are no longer HubSpot deal properties: they moved to the FlowState card’s “AWS deal fields” form, backed by FlowState’s own store rather than a HubSpot property. See “Where the nine removed fields live now” below. apn_postal_code and apn_mrr are the two exceptions that stayed provisioned — see that section for why.
The AWS account manager, sales rep, partner sales manager, and AWS’s own next step are not among these 10 either — FlowState no longer writes them to a HubSpot property. Sync errors are likewise no longer mirrored to a property — read them from the FlowState card (syncError) instead of the deal’s apn_sync_last_error field, which has been retired. The HubSpot card reads the same AWS data live instead, so a rep sees current information without a stale mirror sitting on the deal record.
Property group
| Group name (internal) | Display name | Description |
|---|---|---|
flowstate_apn | FlowState APN | Properties written and read by FlowState for AWS Partner Network opportunity synchronisation. |
Property reference
| Property name | HubSpot type | Description | APN field | Ownership |
|---|---|---|---|---|
apn_sync_with_aws_enabled | Boolean | Gate flag. Set to true to enable APN sync for this deal. Set to false to pause sync without losing the APN opportunity link. | — (not synced to APN) | HubSpot owns |
apn_opportunity_id | Single-line text | The opportunity ID assigned by AWS Partner Central after the first successful submission. Write-once — never overwritten by FlowState once set. | Opportunity.Id | AWS owns (mirror) |
apn_sync_status | Dropdown (enum) | Current sync state of this deal. Values: pending, submitted, in_review, approved, action_required, disqualified, conflict, error, pending_invitation (unaccepted AWS co-sell invitation), invitation_rejected. | — (FlowState status) | FlowState writes |
apn_review_status | Dropdown (enum) | Mirrors LifeCycle.ReviewStatus from AWS. Values reflect AWS Partner Central review states. | LifeCycle.ReviewStatus | AWS owns (mirror) |
apn_lifecycle_stage | Dropdown (enum) | Mirrors LifeCycle.Stage from AWS. Reflects the opportunity’s current stage as recorded by AWS. | LifeCycle.Stage | Both can update (conflict-detected) |
apn_business_problem | Multi-line text | Description of the business problem this opportunity addresses. | Project.CustomerBusinessProblem | HubSpot owns |
apn_closed_lost_reason | Dropdown (enum) | Why the opportunity was lost. One of the 19 reasons AWS defines; sent only when the stage is Closed Lost, and defaults to Other when empty. | LifeCycle.ClosedLostReason | HubSpot owns |
apn_postal_code | Single-line text | Postal code for the end client’s primary address. | Customer.Account.Address.PostalCode | Both can update (conflict-detected) |
apn_aws_account_id | Single-line text | The AWS account ID of the end client. Required for APN opportunity submission. | Customer.Account.AwsAccountId | HubSpot owns |
apn_mrr | Number | Expected monthly recurring revenue from the end client. Kept in sync from AWS’s side too (a re-forecast during co-sell review) — see APN → Field mapping for the three-way merge. Never confuse this with the native amount property, which AWS never writes. | ExpectedCustomerSpend.Amount (Monthly) | Both can update (conflict-detected) |
The AWS account manager, sales rep, partner sales manager, and AWS’s own next step are read live on the HubSpot card instead of being provisioned as properties — see the note above. The last sync error is likewise read live on the card (syncError) rather than mirrored to a property.
Every property marked AWS owns (mirror) or FlowState writes is provisioned read-only: its value is set by the sync and cannot be edited by hand in HubSpot, so a manual change can never be silently overwritten by the next mirror.
Where the nine removed fields live now
apn_partner_need, apn_delivery_model, apn_sales_activity, apn_use_case, apn_state_region, apn_client_industry, apn_client_country, apn_currency and apn_submission_type are rep-authored on the FlowState card’s “AWS deal fields” form instead of a HubSpot dropdown or checkbox. FlowState describes the field list and every option itself, so a change on AWS’s side (a new enum value, a new field) takes effect the next time the card loads — no property to re-provision, no app version to ship.
The values live in FlowState’s own store, not a HubSpot property, so they are not visible in HubSpot’s own deal view, filters, or reports. Open the FlowState card on the deal to see or edit them. apn_client_country is shown read-only on the card, taken from the deal’s associated HubSpot company — there is nothing to set for it. apn_client_industry is filled in automatically wherever possible: from the deal’s own value, then the associated company’s industry, then an AI guess from the deal’s context — each of the first two only counts when it’s already one of AWS’s recognized industries, since HubSpot’s and AWS’s industry lists don’t match one-for-one. The card shows the industry picker only when none of that produces a value; a value the rep picks themselves is always used and shown after that.
Why these nine and not apn_postal_code or apn_mrr, which are also rep-authored: both stayed provisioned because AWS revises them directly (a re-forecast spend, an address correction) and FlowState mirrors that revision straight into the HubSpot property — see the “Both can update” rows above and APN → Field mapping. None of the nine removed fields has that live AWS-side mirror, so nothing needs them to remain a visible, filterable HubSpot property.
Standard HubSpot properties also used
The following standard HubSpot deal properties are read by FlowState to populate APN fields. FlowState does not write to these properties.
| HubSpot property | APN field |
|---|---|
dealname | Project.Title |
closedate | LifeCycle.TargetCloseDate |
dealstage | LifeCycle.Stage (mapped via stage configuration) |
| Associated contacts (first name, last name, job title) | Customer.Contacts[] |
Field ownership
HubSpot owns means the field flows from HubSpot to APN only. FlowState reads the HubSpot value and writes it to APN. If AWS returns a different value for this field in an inbound event, the HubSpot value takes precedence.
AWS owns (mirror) means the field flows from APN to HubSpot only. FlowState reads the AWS value and writes it to HubSpot. FlowState never sends a value for these fields in outbound payloads.
Both can update (conflict-detected) means both HubSpot and AWS can legitimately change the field. When both sides have been updated since the last sync, FlowState sets apn_sync_status = conflict and surfaces the conflict for manual resolution. See APN → Conflicts & resolution.
Native amount is never written by AWS. apn_mrr is FlowState’s own mirror of AWS’s expected-spend figure — it is what may sync in both directions. Your deal’s native amount field is your own CRM value and is never touched by an inbound APN event, under any circumstances.
Removing the properties
These properties are created in your HubSpot portal and persist after disconnecting FlowState. If you permanently remove the FlowState integration and want to clean up the properties, you can delete the flowstate_apn property group from HubSpot: Settings → Properties → Filter by group → flowstate_apn → Delete group. Deleting the group removes all 10 properties and their values from all deal records. This action cannot be undone.
FlowState’s own Deprovision button (Settings → Integrations → HubSpot → Deprovision) does the same thing without leaving HubSpot: it calls the deprovision_hubspot_properties action, which deletes each of the 10 properties one by one and reports which ones succeeded or failed.
Clicking Provision properties never deletes anything. It only ever creates the 10 current properties (on first run) or refreshes them — labels, options, descriptions — on every later run. No code path reachable from that button, or from the provision_hubspot_properties action, removes a property or touches a value.
That was not always true, and if your portal was already re-provisioned, you need to know what happened. An earlier version of this same button also deleted the nine removed properties listed above as an automatic, unannounced side effect of every re-provisioning run. Deleting a HubSpot property destroys its value on every deal record in the portal, irreversibly — there is no undo, in HubSpot or in FlowState. If your portal was re-provisioned while that version was live, the nine properties (and the values they held) are already gone.
Recovery from that is partial and depends on the deal:
- For a deal that had already been submitted to AWS Partner Central at the time of deletion, most of the nine values can potentially be recovered from AWS’s own copy of the opportunity. One of the nine,
apn_submission_type, has no representation anywhere in AWS’s API and cannot be recovered under any circumstances, for any deal. - For a deal that was never submitted to AWS, none of the nine can be recovered. The value existed only in the now-deleted HubSpot property, with no copy anywhere else.
If you believe your portal was affected, contact FlowState support rather than re-running anything yourself — recovering what is recoverable is a manual, human-run process on our side, not a button in the product.
Deleting the nine retired properties is now a separate, deliberate action, invoked only by FlowState’s own operations tooling — never automatically, and never as a side effect of the “Provision properties” button.