Key Capabilities
- CRM stage monitoring — React when a HubSpot deal or Salesforce opportunity moves to a target pipeline stage
- Project status monitoring — Start a Run when a Notion page status or Jira issue status changes to a configured value
- Flexible polling cadence — Run checks every few minutes for near-real-time response, or hourly for batch workflows
- State memory — Agent Memory stores the last-seen status of each record so the agent only fires once per genuine change, not on every poll
- Multi-record support — Process all records that changed state since the last check in a single Run, or trigger one Run per record
How Status-Change Triggers Work
Duvo does not receive native push webhooks from CRM or project management tools (with the exception of Linear, which is already covered in Event-Driven Triggers). Status-change monitoring is implemented by scheduling an agent to run on a regular interval and having the AOP:- Query the connected tool for records that have recently moved to the target state.
- Compare results against the last-seen state stored in Agent Memory.
- Process only the records that genuinely changed since the last Run.
- Update Agent Memory with the new state before finishing.
| Service | Mechanism | Typical latency |
|---|---|---|
| HubSpot | Polling | Equal to schedule interval |
| Salesforce | Polling | Equal to schedule interval |
| Notion | Polling | Equal to schedule interval |
| Jira (via Computer Use) | Polling | Equal to schedule interval |
| Linear | Native webhook (push) | Seconds — see Event-Driven Triggers |
When to Use Status-Change Triggers
- Sales onboarding — When a HubSpot or Salesforce deal moves to “Closed Won”, start an onboarding agent that creates workspace accounts, sends a welcome email, and schedules a kickoff call
- Contract review routing — When a Notion page moves to “Ready for Legal Review”, route the document to the legal team and post a Slack notification
- Support escalation — When a Zendesk ticket moves to “Escalated”, create a Linear issue and assign it to the on-call engineer
- Content publishing — When a Notion page status changes to “Approved”, export the content to your CMS and notify the author
- Procurement follow-up — When a Salesforce opportunity enters “Procurement Review”, send a follow-up email and attach the latest price list
How to Set It Up
Step 1: Create the agent
- Click + Create Agent from your dashboard.
- Select Use Agent Builder.
Step 2: Write your AOP
The AOP pattern for status-change triggers has three phases: query, compare, act. Here is a template adapted for a HubSpot deal stage change:[Target Stage Name] with your pipeline stage (for example, “Closed Won”, “Contract Sent”, or “Procurement Review”). Replace the downstream action with your specific workflow.
Step 3: Add connections
Under Connections, enable the connection for the tool you are monitoring:- HubSpot — for deal or contact status changes
- Salesforce — for opportunity or case status changes
- Notion — for page or database entry status changes
- Human-in-the-Loop — if the workflow includes an approval step
Step 4: Enable Agent Memory
Go to Setup and enable Agent Memory. The AOP will use it to store the IDs of records already processed.Step 5: Set a schedule
- Click Schedule in the agent header.
- Choose an interval: every 15 minutes for near-real-time response, or every hour for batch workflows.
- Click Add schedule to save.
Worked Example — “Closed Won” Deal Triggers Onboarding
Outcome: When a HubSpot deal moves to “Closed Won”, Duvo starts an onboarding Run that creates accounts for the new customer, sends a welcome email, and notifies the customer success team in Slack. Connections used:- HubSpot — query deals by stage
- Gmail — send the welcome email
- Slack — notify the customer success channel
- Human-in-the-Loop — optional approval step before sending the email
AOP
Connections to enable
- HubSpot
- Gmail (the account sending the welcome email)
- Slack (for the #customer-success channel notification)
- Human-in-the-Loop (for the approval step before external communications)
Expected results
When the agent runs every 15 minutes:- Deals that moved to “Closed Won” since the last Run are identified.
- A Human-in-the-Loop approval appears in your Activity Inbox for each new deal.
- After approval, a personalized welcome email is sent and #customer-success is notified.
- The deal ID is added to Agent Memory so the next Run does not re-process it.
Adapting for Other Services
Salesforce — Opportunity stage change
The pattern is the same. Replace the HubSpot query with a Salesforce SOQL query:Notion — Page status change
Notion databases support a “Status” property. Query for pages where the Status equals your target value:Jira — Issue status change
Jira does not have a native Duvo connection. To monitor Jira status changes, use Computer Use to navigate the Jira web interface and read the issue list:Troubleshooting
The same record is processed more than once
- The Agent Memory key must be written at the end of each successful Run. If the Run fails partway through, the memory update may not have been saved. Check the session log to see where the failure occurred.
- Make sure the AOP adds the ID to memory before the Run ends, even if the downstream action fails. Adjust the AOP: “Add the ID to memory regardless of whether the downstream action succeeds.”
Records that changed state are not detected
- Time window too narrow: The AOP queries for records changed “in the last X minutes”. If the schedule interval is 15 minutes but the query window is 10 minutes, changes in the gap are missed. Set the query window to match or slightly exceed your polling interval.
- Timezone mismatch: The query compares Duvo’s time against the timestamp in the CRM. Confirm both are in the same timezone, or use UTC for the comparison.
- API pagination: If many records changed state at once (for example, after a bulk import), the query may return only the first page. Add to your AOP: “Retrieve all pages of results, not just the first.”
Memory grows very large over time
Agent Memory is designed for moderate-size tracking lists. If your workflow processes hundreds of records per day, theprocessed_ids list can become large over time. Limit memory growth by expiring old entries:
Take It Further
Chain to a second agent After completing the onboarding Run, schedule a follow-up check 7 days later:Related
- Event-Driven Triggers — Overview of all trigger types and the trigger matrix
- Scheduling Agents — Set the polling interval
- Agent Memory — Track last-seen state to avoid duplicate processing
- Human-in-the-Loop — Add approval gates before irreversible actions
- HubSpot — Connect HubSpot
- Salesforce — Connect Salesforce
- Notion — Connect Notion
- Computer Use — Browser-based access for tools without a native connection