hs_recurring_billing_period and recurringbillingfrequency are two separate properties on the Products object in HubSpot. They are often confused because they sound related, but they serve different purposes:
"One-time" is not an actual selectable option in the recurringbillingfrequency dropdown, either in the UI or via the Properties API. It only appears as the default label when recurringbillingfrequency is left blank.
When a product is set to one-time billing:
Because of this default, every one-time product will show hs_recurring_billing_period = P1M, and in the UI this always displays as the number 1 (not as "Monthly").
If you're pulling hs_recurring_billing_period via the API to determine a product's actual billing frequency, don't rely on it alone. A value of P1M does not necessarily mean the product bills monthly, it may simply be a one-time product carrying the default.
To correctly identify a product's billing frequency:
The UI abstracts both fields differently than how they're actually stored and named via the API.
Billing frequency
Recurring billing period / Term
So the same underlying data reads very differently depending on where you look: the UI shows human-friendly labels and numbers, the API returns raw ISO durations and blanks instead of "one_time."
recurringbillingfrequency and hs_recurring_billing_period work together, not independently, when HubSpot determines how a product or line item behaves inside a subscription:
Together, these two values are used to calculate hs_recurring_billing_terms (read-only, calculated automatically), which resolves to either:
When a subscription is created, HubSpot groups line items onto the same Subscription record only if they share the same billing frequency, billing terms, billing start date, and number of payments. If any of those differ, for example one line item is monthly and another is annual, they are split into separate Subscription records, each with their own billing schedule.
For a one-time product, since recurringbillingfrequency is blank, there's no cadence to combine with hs_recurring_billing_period, so it never enters a subscription record. It's simply invoiced once. The P1M default it carries is a leftover placeholder with no functional effect on billing.
Comment Editor X