HubSpot's native workflow actions let you delete contacts. That's it. For deals, tickets, leads, companies, and custom objects, your only options are manual bulk-delete, list exports, or custom code. If you've ever wanted a record to automatically expire after a set period - what engineers call a TTL, or time to live - you've probably already discovered this gap.
The idea is straightforward. A lead with no activity for 90 days should be removable automatically. A closed ticket should disappear after your retention window ends. A cancelled deal should stick around for one day of reporting, then go. A stale custom object record should be cleaned up when fresh data arrives.
This is not theoretical. HubSpot's community forums are full of teams asking for exactly these workflows - and getting told it's not possible natively.
The Gap in Native HubSpot
HubSpot ships a Delete contact action in workflows. It works fine for contacts. But the documentation is explicit: other objects such as deals and companies cannot be deleted via workflows.
The demand is real:
| Object | Community request | Upvotes | Common use cases |
|---|---|---|---|
| Tickets | Delete tickets via workflow | 105 | GDPR retention, test cleanup, pipeline hygiene |
| Deals | Delete deals via workflow | 98 | Cancelled deal cleanup, duplicate removal |
| Leads | Delete leads via workflow | Growing | Inactive lead purge, disqualified lead removal |
| Companies | Delete companies via workflow | Requested | Orphaned companies, spam cleanup, Salesforce sync |
| Custom objects | Delete custom objects via workflow | Requested | Daily data refreshes, stale record expiration |
The workarounds people use today are painful: scheduled manual bulk-deletes, list exports followed by API calls, or custom code actions that require Operations Hub Professional. None of these give you a simple "delete this record after X days" workflow step.
How 0CodeTools Fills the Gap
HubSpot's platform supports delete and archive operations across all CRM objects through its API. The limitation is in the workflow UI, not the platform itself.
0CodeTools for HubSpot adds a Delete Record workflow action that works directly in the HubSpot workflow editor - for contacts, leads, deals, tickets, companies, and custom objects. It appears as a custom action alongside native HubSpot actions, and it deletes (archives) the enrolled record when the workflow reaches that step.
This turns record TTL from a manual cleanup habit into a real, automated workflow.
The TTL Workflow Pattern
Every TTL workflow follows the same structure, regardless of the object type:
- Enroll the record when it meets your expiration criteria
- Delay until the review or expiration point
- Re-check with a branch to confirm the record is still stale
- Delete using the Delete Record action
- Notify the owner or ops team (optional but recommended)
The re-check step matters. Without it, a record that became active again during the delay period would still get deleted. Always branch before you delete.
Properties to Create
Before building TTL workflows, add these properties to the relevant objects:
| Property | Type | Purpose |
|---|---|---|
| Eligible for deletion | Checkbox | Gate flag - only records marked true can be deleted |
| Deletion reason | Dropdown | inactive, retention_expired, cancelled, orphaned, sync_replaced |
| Expiration date | Date | When the record becomes eligible for deletion |
These properties make your TTL logic auditable and your workflows debuggable.
Five TTL Recipes
1. Lead TTL - Delete Inactive Leads After 90 Days
The most common request. Leads that have had no sales activity for 90 days are consuming your CRM seat count and cluttering the prospecting workspace.
Notify lead owner: lead expiring in 7 days
Wait 7 days
Check branches in order: New activity in last 7 days and Still inactive.
Delete the enrolled lead
The 7-day grace period with owner notification is critical. It gives reps one last chance to re-engage before the lead disappears. If they log any activity during that window, the branch catches it and cancels the deletion.
2. Ticket TTL - Delete Closed Tickets After Retention Window
Service teams accumulate thousands of closed tickets over time. Compliance requirements like GDPR often mandate deletion after a retention period, and even without compliance pressure, old tickets slow down reporting and clutter search results.
Wait 180 days
Check branches in order: Ticket was reopened and Still closed.
Delete the enrolled ticket
Set the delay to match your retention policy - 180 days, 365 days, or whatever your compliance team requires. The branch re-checks status because tickets can be reopened months after closure.
3. Deal TTL - Delete Cancelled Deals After Grace Period
When a deal is cancelled, most teams want it visible for a short period - long enough for reporting and post-mortem - but not so long that the pipeline fills up with dead deals alongside live ones.
Set Expiration date to 24 hours from now
Wait 24 hours
Check branches in order: Stage changed (no longer Cancelled) and Still Cancelled.
Delete the enrolled deal
One community user described exactly this pattern: cancelled deals should stay for one day for reporting and automation, then be removed so the portal doesn't show multiple cancelled deals alongside the final live deal. The 24-hour window gives downstream automations and reports time to capture the data before the record disappears.
4. Company TTL - Delete Orphaned Companies After Review
Orphaned companies are a persistent CRM hygiene problem. They get created by automation when a key property is missing, left behind when spam contacts are deleted, or duplicated through Salesforce sync. They clutter search, pollute reports, and confuse reps.
Set Eligible for deletion to true
Wait 14 days
Check branches in order: Has contacts now and Still orphaned.
Delete the enrolled company
The 14-day review window is generous on purpose. Companies sometimes lose their last contact temporarily during data migrations or CRM cleanup. Two weeks gives your team time to notice and re-associate before the company is archived.
A word of caution: deleting companies can mean losing company-only activities that were never logged on a contact. If the company has valuable timeline data, consider merging it instead of deleting it.
5. Custom Object TTL - Delete Stale Records After Sync
Custom objects are often used as operational data stores - synced inventory, pricing tables, temporary records from integrations. When new data arrives, the old records need to go. This is TTL in its purest form: old instances expire when a fresh snapshot lands.
Wait 24 hours
Check branches in order: Marked for retention and Proceed with deletion.
Delete the enrolled record
The 24-hour buffer is important for daily sync patterns. It ensures downstream workflows, reports, and integrations have time to process the old records before they're removed.
Best Practices Before You Turn It On
Start with restorable deletion, not permanent erasure. HubSpot keeps deleted records in the recycle bin for up to 90 days. The Delete Record action archives records, which means they can be restored if something goes wrong. This is the right starting point for most TTL use cases. Permanent deletion for GDPR or privacy reasons is a separate, more careful process.
Not every stale record should be deleted. In community discussions, experts push back on automatic deletion when the records carry historical value. Old leads may contain prospecting insights. Closed deals have pipeline history. Companies may hold timeline activities that aren't logged anywhere else. For these cases, moving records to a "Closed" or "Archived" stage, or suppressing them from views, is safer than deletion.
Use a review buffer before automating at scale. Start your first TTL workflow with a long grace period - 14 or 30 days - and monitor what gets flagged. Once you're confident the criteria are right, shorten the window. Going from "never delete anything" to "delete after 24 hours" in one step is how you lose data.
| Object | Recommended starting TTL | Review buffer |
|---|---|---|
| Leads | 90 days inactive | 7-day owner notification |
| Tickets | 180-365 days closed | Re-check ticket status |
| Deals | 1-7 days cancelled | Re-check deal stage |
| Companies | 14-30 days orphaned | Re-check associations |
| Custom objects | 24 hours after sync | Retention flag override |
What You Need by HubSpot Tier
| Requirement | HubSpot tier |
|---|---|
| Workflows (enrollment, branches, delays) | Professional or Enterprise (any Hub except Content Hub) |
| 0CodeTools Delete Record action | Any tier with workflows + 0CodeTools app installed |
| Custom properties (deletion reason, expiration date) | All tiers |
| Custom objects | Enterprise (any Hub) |
Clean CRM, Automated
Record TTL is not a nice-to-have. It's the difference between a CRM that stays useful and one that gradually fills with dead records until nobody trusts the data.
HubSpot gives you the building blocks - workflows, branches, delays, custom properties. 0CodeTools adds the missing piece: a Delete Record action that works for every object type, directly in the workflow editor.
Start with one object. Pick the TTL recipe that matches your biggest pain point - usually tickets or leads. Run it with a generous review buffer. Once you trust the logic, expand to other objects and tighten the windows.
If you need help designing TTL workflows for your HubSpot portal, our RevOps support team can help, or talk to us directly.
