Skip to content

Stale deal alert: no activity in 14 days

One of 565 written HubSpot workflow specs, by a collective of independent HubSpot consultants.

Free
Professional

Seat pricing: Professional edition. To build it, a GTM Seat or an Ops Seat (an Ops Seat cannot create marketing emails or sequences). Per-hub plans: Sales Hub Professional.

Updated for HubSpot seat pricing
OutcomeReps and their managers get notified automatically when an open deal has had no logged activity for 14 days, so deals stop dying quietly in the pipeline.
Workflow mapdeal-hygiene-001
Deal enrolls: stage open, no activity 14d+ leads to Stale Deal Flag = true?. Stale Deal Flag = true? leads to yes: Exit, already flagged; no: Set Stale Deal Flag = true. Set Stale Deal Flag = true leads to Create task for owner. Create task for owner leads to Notify owner. Notify owner leads to Delay 14 days. Delay 14 days leads to Still stale after 28 days total?. Still stale after 28 days total? leads to yes: Notify manager - escalation; no: Reset Stale Deal Flag = false, exit. yes no yes no Deal enrolls: stage open, no activity 14d+ Stale Deal Flag = true? Exit, already flagged Set Stale Deal Flag = true Create task for owner Notify owner Delay 14 days Still stale after 28 days total? Notify manager - escalation Reset Stale Deal Flag = false, exit
Deal enrolls: stage open, no activity 14d+ leads to Stale Deal Flag = true?. Stale Deal Flag = true? leads to yes: Exit, already flagged; no: Set Stale Deal Flag = true. Set Stale Deal Flag = true leads to Create task for owner. Create task for owner leads to Notify owner. Notify owner leads to Delay 14 days. Delay 14 days leads to Still stale after 28 days total?. Still stale after 28 days total? leads to yes: Notify manager - escalation; no: Reset Stale Deal Flag = false, exit. yes no yes no Deal enrolls: stage open, no activity 14d+ Stale Deal Flag = true? Exit, already flagged Set Stale Deal Flag = true Create task for owner Notify owner Delay 14 days Still stale after 28 days total? Notify manager - escalation Reset Stale Deal Flag = false, exit

When to use it, when not to

Use it

  • Use it when forecast reviews keep surfacing deals nobody touched in weeks.
  • Use it to enforce a minimum touch cadence on mid-funnel stages (demo, proposal, negotiation).

Skip it

  • Do not use a flat 14-day threshold across every stage. Long-cycle stages (legal review, procurement) need a longer threshold or an exclusion, or the alert becomes noise reps ignore.
  • Do not use this as the only signal for deal health. Pair it with amount and stage in a combined risk score (see deal-hygiene-021) once the base version is stable.

Prerequisites

  • Property: Stale Deal Flag (internal name stale_deal_flag), object deal, field type single checkbox. Why: prevents the workflow from re-notifying every time the filter is re-evaluated before the deal actually goes quiet again.
  • Confirm the native property Last Activity Date (internal name notes_last_updated, the same on contacts, companies, deals and tickets, see https://developers.hubspot.com/changelog/updates-to-next-activity-and-last-activity-property-groups) is present and populated by logged engagements (calls, emails, meetings) associated to the deal record, not only to the contact.
  • List of pipeline stages to exclude from this workflow (typically Closed Won, Closed Lost, and any stage that is expected to sit dormant, such as "Legal Review").
  • Property: Manager (internal name manager), object deal, field type HubSpot user, optional and used only by the escalation step, or HubSpot Teams hierarchy (nested team hierarchies need an Enterprise subscription and there is no native "notify the owner's manager" action, so on Professional the Manager property is the only route, https://knowledge.hubspot.com/user-management/create-and-manage-teams). A HubSpot user type property cannot be created through the batch properties API; create it once in Settings > Objects > Deals > Properties.

Enrollment

Trigger typefilter-based, with re-enrollment on.
CriteriaDeal stage is not any of [Closed Won, Closed Lost] AND Last Activity Date is more than 14 days ago AND Stale Deal Flag is not equal to true.
Re-enrollmentyes, re-evaluate when Last Activity Date changes. This lets a deal re-enter the workflow once it goes quiet again after a fresh touch.
Suppression / exclusionsstatic list or property filter excluding sandbox/test pipelines (see deal-hygiene-038), and excluding any stage explicitly marked as long-dormant.

Steps

  1. If/then branch: Stale Deal Flag is equal to true
    • Yes: exit workflow (already flagged, avoid duplicate notifications)
    • No: continue
  2. Set property value: Stale Deal Flag = true
  3. Create task: type "To-do", title "Deal stale - no activity 14+ days: {{deal.dealname}}", assigned to record owner, due in 1 business day
  4. Send internal email notification to: record owner, subject "No activity on {{deal.dealname}} in 14+ days"
  5. Delay for 14 days
  6. If/then branch: Last Activity Date is still more than 14 days ago AND Deal stage is still not Closed Won/Closed Lost
    • Yes: Send internal email notification to: manager property (or Teams hierarchy contact), subject "Escalation: {{deal.dealname}} stale for 28+ days"
    • No: Set property value: Stale Deal Flag = false, then exit

Known pitfalls

  • Last Activity Date on deals only updates from engagements logged against the deal record itself. A call logged only on the associated contact does not always roll up to the deal An activity logged on a contact is auto-associated only to the contact's primary company and its five most recent open deals, and only if the deal was already associated to the contact before logging (https://knowledge.hubspot.com/records/associate-activities-with-records).
  • Re-enrollment loops: because step 2 sets Stale Deal Flag in the same run, the enrollment criteria (Stale Deal Flag not equal true) prevents an immediate re-trigger, but only if the criteria snapshot is taken before the property write. Test this explicitly.
  • Escalating to "manager" has no native lookup on Sales Hub Professional. Without a populated Manager property or Enterprise Teams hierarchy, this step silently fails to resolve a recipient.
  • Activating the workflow does not retroactively enroll existing stale deals unless "enroll existing records that match" is checked at activation time.
  • Due dates on tasks use the portal's default timezone, which can be misleading for distributed teams.

Test plan

  1. Create a test deal in an open, non-excluded stage and leave Last Activity Date blank or older than 14 days.
  2. Activate the workflow with "enroll existing records" checked, or wait for the next evaluation cycle.
  3. Open Automation > Workflows > this workflow > History tab, confirm the deal enrolled and each action shows success.
  4. Check the deal record's timeline for the created task and the internal notification event.
  5. Log a call against the deal, confirm Last Activity Date updates, then confirm Stale Deal Flag resets to false after the escalation branch resolves on the next cycle.

The UAT script of this spec holds 5 cases: a negative case, one case per branch, the expected result of each and a sign-off sheet. It comes as Markdown and as a CSV for your spreadsheet.

Variants

  • Ticket version: same structure applied to tickets with no activity, for the tickets-sla category.
  • Company-level version: flag companies with no open-deal activity instead of individual deals.
  • Slack instead of email: route the notification through the Slack integration action if connected (the action is "Send a Slack notification" under Integrated apps > Slack in the action panel, available once the Slack integration is connected, https://knowledge.hubspot.com/integrations/how-do-i-use-the-slack-integration).

Build spec

Build specYAML, swipe
trigger:
  type: filter_based
  reenrollment: true
  reenrollment_property: notes_last_updated
  object: deal
  criteria:
    - property: dealstage
      operator: not_in
      value: [closedwon, closedlost]
    - property: notes_last_updated
      operator: more_than_days_ago
      value: 14
    - property: stale_deal_flag
      operator: not_equal
      value: true
actions:
  - type: if_then_branch
    condition: stale_deal_flag == true
    if_true:
      - type: exit_workflow
    if_false:
      - type: set_property_value
        property: stale_deal_flag
        value: true
      - type: create_task
        task_type: todo
        title: "Deal stale - no activity 14+ days: {{deal.dealname}}"
        assigned_to: record_owner
        due: +1_business_day
      - type: send_internal_email_notification
        to: record_owner
        subject: "No activity on {{deal.dealname}} in 14+ days"
      - type: delay
        duration: 14_days
      - type: if_then_branch
        condition: notes_last_updated more_than_days_ago 14 AND dealstage not_in [closedwon, closedlost]
        if_true:
          - type: send_internal_email_notification
            to: manager_property
            subject: "Escalation: {{deal.dealname}} stale for 28+ days"
        if_false:
          - type: set_property_value
            property: stale_deal_flag
            value: false

Files and install

FileWhat it holds
PDF and MarkdownThe spec as you read it here, with the YAML build spec at the end.
Properties JSONCreates the fields in one API call.
Workflow JSONDocuments the build: the workflow in Automation API v4 format, switched off.
UAT scriptThe 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.

Get the 12 free specs as a pack

Nothing deleted, enabled or enrolled.

deal-hygiene-001Spec version 2026-09

Read 12 complete specs before you pay.

One per category, same format as the paid ones. Email only, no card.

We email the link, then a short note when specs change. Nothing else.

All 12 free specs by email, no card.