When to use it, when not to
Use it
- Use it when contract end dates already live in a property and renewal deals get created late or inconsistently.
- Use it for accounts with one contract and one renewal event per cycle.
Skip it
- Do not use it for accounts with multiple co-termed contracts or product lines. One company-level date cannot represent several renewal events; see the bundle variant.
- Do not use it if Contract End Date is not reliably populated. This workflow reacts to a date, it does not calculate one.
Prerequisites
- Property:
Contract End Date(internal namecontract_end_date), object company, field type date picker. Why: the single source of truth this workflow reacts to. - Property:
Renewal Deal Created(internal namerenewal_deal_created), object company, single checkbox. Why: stops the workflow from creating a second deal if the record is edited or re-enrolled. - Property:
Contract Value(internal namecontract_value), object company, number (currency). Why: pre-fills the new deal's amount. - Property:
Do Not Renew(internal namedo_not_renew), object company, single checkbox. Why: exclusion for accounts already confirmed as churning. - A "Renewal" pipeline, or a dedicated "Renewal" stage in the existing
sales pipeline, plus a "Renewal" option added to the default
Deal Typeproperty (internal namedealtype). Why: keeps renewal deals separate from new-business reporting (see renewal-expansion-036). - Confirm the company owner property is populated for every active customer, since it is copied to the new deal.
Enrollment
| Trigger type | filter-based |
|---|---|
| Criteria | Lifecycle stage (or a custom
Customer Status property) is equal to Customer AND
Contract End Date is less than 90 days away AND
Renewal Deal Created is not equal to true AND
Do Not Renew is not equal to true |
| Re-enrollment | no. A single creation event is the goal; re-enrollment increases the risk of a duplicate deal if the flag write and the criteria check ever land out of order. |
| Suppression / exclusions | Do Not Renew = true, and any
static list used to mark test or sandbox accounts. |
Steps
- Set property value:
Renewal Deal Created= true - Create record: object deal, name "{{company.name}} - Renewal
{{company.contract_end_date}}", pipeline "Renewal", stage "Renewal - Not
Started",
Deal Type= Renewal, amount copied fromContract Value, deal owner copied from company owner, associated to the enrolled company. The Create record action assigns the new deal's owner directly through its owner setting, either "Company's existing owner" or a custom owner property, so no follow-up copy action is needed (https://knowledge.hubspot.com/ )workflows/ create-records-with-workflows - Create task: type "To-do", title "Confirm renewal deal details for {{company.name}}", assigned to company owner, due in 2 business days
- Send internal email notification to: company owner, subject "Renewal deal auto-created for {{company.name}}"
Known pitfalls
- Filter-based enrollment fires once, when a record newly matches "less than 90 days away." If the workflow is off when that window opens, the company will not enroll later without editing the date or turning re-enrollment on, which then risks duplicates.
- The Create record action exposes the enrolled company's existing
owner as an owner option for the new deal, so the copy fallback is only
needed if you want the owner taken from a different user property
(https://
knowledge.hubspot.com/ ).workflows/ create-records-with-workflows - One company, one contract date: accounts with several active contracts will only ever get one renewal deal from this version. Do not force multi-contract accounts through it.
- If
Contract Valueis stored in a non-default currency, confirm the new deal's currency matches before trusting the copied amount. - Deactivating or archiving the pipeline/stage referenced in the Create record action silently breaks the workflow at the next run; check workflow health after any pipeline edit.
Test plan
- Create a test company. Set
Contract End Dateto 89 days from today, lifecycle stage/customer status to Customer,Renewal Deal Createdunchecked,Do Not Renewunchecked. - Activate the workflow. Open Automation > Workflows > this workflow > History and confirm the company enrolled.
- Open the company record. Confirm a new deal exists in the Renewal pipeline, associated to the company, with the right amount and owner.
- Confirm
Renewal Deal Createdis now true on the company, and that the task and internal notification appear on the timeline. - Edit
Contract End Dateto more than 90 days out, save, then back to under 90 days, and confirm the company does not re-enroll (re-enrollment is off).
The UAT script of this spec holds 2 cases, with the expected result and a sign-off sheet. It comes as Markdown and as a CSV for your spreadsheet.
Variants
- Multi-contract accounts: enroll on a custom "Subscription" object instead of company, one record per contract (see renewal-expansion-040).
- Deal-based trigger: if
Contract End Datealready lives on an active deal rather than the company, clone that deal on the same 90-day trigger instead of creating a fresh one. - Shorter or longer window: use 30 days for monthly contracts, 90 or 120 days for annual or multi-year contracts.
Build spec
trigger:
type: filter_based
reenrollment: false
object: company
criteria:
- property: lifecyclestage
operator: equal
value: customer
- property: contract_end_date
operator: less_than_days_away
value: 90
- property: renewal_deal_created
operator: not_equal
value: true
- property: do_not_renew
operator: not_equal
value: true
actions:
- type: set_property_value
property: renewal_deal_created
value: true
- type: create_record
object: deal
name: "{{company.name}} - Renewal {{company.contract_end_date}}"
pipeline: renewal
stage: renewal_not_started
dealtype: renewal
amount_from_property: contract_value
owner_from_associated: company_owner
associate_to: enrolled_record
- type: create_task
task_type: todo
title: "Confirm renewal deal details for {{company.name}}"
assigned_to: company_owner
due: +2_business_days
- type: send_internal_email_notification
to: company_owner
subject: "Renewal deal auto-created for {{company.name}}"Files and install
| File | What it holds |
|---|---|
| PDF and Markdown | The spec as you read it here, with the YAML build spec at the end. |
| Properties JSON | Creates the fields in one API call. |
| Workflow JSON | Documents the build: the workflow in Automation API v4 format, switched off. |
| UAT script | The test cases, the expected results and a sign-off sheet, as Markdown and CSV. |
Take the PDF and build it by hand. One-click install comes with a category pack or the full library.
Install renewal-expansion-001
One email, and we tell you where this stands. When free installs open, that address is how you hear it first.
No card, no password, unsubscribe in one click.
Nothing deleted, enabled or enrolled.
renewal-expansion-001Spec version 2026-09