<@ULVA73B9P> I am observing that my workers are no...
# ask-marvin
b
@Marvin I am observing that my workers are not picking up flows from the queue as fast as I would expect. what steps should I take in order to debug why the workers might not be picking tasks off the queues? I have a single pool with 6 active queues, and 4 workers running as kubernetes pods. some queues have high priority with a low concurrency limit. I dont expect to see those running very many flows at a time but I would expect the workers to continue picking up flows off the
instantly-webhooks
queue which is lower priority but only takes 1 second to execute the flow and has a high concurrency number. here is a python representation of my queues:
Copy code
queues = [
        QueueConfig(name="sla-queue", concurrency_limit=2),
        QueueConfig(name="search-company", concurrency_limit=2),
        QueueConfig(name="search-company-aggk", concurrency_limit=2),
        QueueConfig(name="former-coresignal", concurrency_limit=2),
        QueueConfig(name="create-lead", concurrency_limit=10),
        QueueConfig(name="instantly-webhooks", concurrency_limit=100),
        QueueConfig(name="default"),
        QueueConfig(name="demo"),
        QueueConfig(name="demo-wait", concurrency_limit=1),
    ]
instantly-webhooks has over 5000 flows queued and is not burning down
m
thought for 582.0 seconds
Thanks for the detail — that helps. Here’s how Prefect 3.x workers decide what to run and a focused checklist to debug why your lower-priority, high‑concurrency queue isn’t burning down. High-level behavior to keep in mind - Workers poll a work pool and consider all queues in that pool in priority order (lower number = higher priority). - Queue-level concurrency limits are enforced at query time: a queue contributes up to its available slots; if it has no available slots, the worker moves on to the next queue. - If your work pool has a concurrency limit and higher-priority queues always keep that pool capacity full, lower-priority queues can be starved even if they have large queue concurrency limits. - Workers only pick runs in the SCHEDULED state whose next scheduled time falls within the “prefetch” window (default ~10s ahead). - Other concurrency controls (deployment-level, tag-based/task concurrency limits) can block runs even if queues have capacity. Quick triage checklist (fastest signal first) 1) Confirm the worker is polling the right queues - If you started workers with
-q
, they’ll only pull those queues. Make sure
instantly-webhooks
is included or don’t pass
-q
to poll the entire pool. - Double-check worker pods’ start command/args and logs. 2) Check if the work pool or queue is capacity-limited or paused - Work pool:
Copy code
prefect work-pool inspect <pool-name>
Look for
is_paused
and
concurrency_limit
. If the pool has a small limit (e.g., equal to the sum of your high-priority queues), it can starve lower-priority queues. Increase or clear the pool limit if needed:
Copy code
prefect work-pool set-concurrency-limit <pool-name> <higher-number>
prefect work-pool clear-concurrency-limit <pool-name>
- Work queue:
Copy code
prefect work-queue inspect -p <pool-name> instantly-webhooks
Confirm
is_paused = False
and
concurrency_limit = 100
(as intended). 3) Preview what the queue would give a worker right now - This shows what’s eligible in the near future:
Copy code
prefect work-queue preview -p <pool-name> instantly-webhooks
- And this triggers a one-off poll-like selection:
Copy code
prefect work-queue read-runs -p <pool-name> instantly-webhooks
If these return nothing or very few runs despite “5k queued,” the runs may not actually be SCHEDULED within the prefetch window, or they’re blocked by concurrency elsewhere (deployment/tag). 4) Verify runs are truly SCHEDULED and not blocked by other concurrency - Deployment-level concurrency limits:
Copy code
prefect deployment ls
prefect deployment inspect <deployment-name-or-id>
If the deployment driving
instantly-webhooks
has a low
concurrency_limit
(or 0), that’ll cap you regardless of queue settings. - Tag-based/task concurrency limits:
Copy code
prefect concurrency-limit ls
If your webhook flow or tasks carry a tag with a tight concurrency limit, that will hold the entire flow run. 5) Check worker capacity and poll cadence - If you intentionally set a worker limit (max concurrent submissions per worker), you may be filling all worker slots with higher-priority queues: - Revisit your worker start flags and environment. Typical fix: raise the worker limit or add more workers. If you didn’t set a limit, it’s effectively unbounded at the worker layer, and pool/queue/deployment limits dominate. - Speed up polling for this burn-down: -
PREFECT_WORKER_QUERY_SECONDS=2
(default ~10) -
PREFECT_WORKER_PREFETCH_SECONDS=30
(default ~10) - Start (example):
Copy code
PREFECT_LOGGING_LEVEL=DEBUG \
PREFECT_WORKER_QUERY_SECONDS=2 \
PREFECT_WORKER_PREFETCH_SECONDS=30 \
prefect worker start -p <pool-name>
Check DEBUG logs for “discovered X scheduled flow runs” and any “no capacity due to concurrency limits” messages. 6) Confirm “instantly-webhooks” runs live in the same pool and queue you think - Ensure the deployment(s) actually target
instantly-webhooks
in this exact pool.
- If runs were scheduled against a different pool or queue, your current workers won’t see them. Why your scenario can starve “instantly-webhooks” - If your higher-priority queues each have small but non-zero concurrency, and your work pool has a concurrency limit that’s roughly equal to the sum of those small limits, your workers will keep the pool full with high-priority runs. The DB query will always fill capacity from higher-priority queues first; lower-priority queues won’t get slots until the pool has spare capacity. Concrete next steps I recommend - Inspect pool and queues for limits/paused states:
Copy code
prefect work-pool inspect <pool-name>
prefect work-queue inspect -p <pool-name> instantly-webhooks
prefect work-queue ls -p <pool-name>
- Preview and read runs:
Copy code
prefect work-queue preview -p <pool-name> instantly-webhooks
prefect work-queue read-runs -p <pool-name> instantly-webhooks
- Check deployment and tag concurrency:
Copy code
prefect deployment inspect <your-webhook-deployment>
prefect concurrency-limit ls
- If pool concurrency is the bottleneck, either: - Raise/clear the pool limit so lower-priority queues can also get capacity, or - Move
instantly-webhooks
to its own work pool with dedicated workers, or - Temporarily raise
instantly-webhooks
priority so it shares/fills capacity as intended. A couple of clarifying questions to pinpoint this faster - How are your workers started (full command/args)? Are they passing
-q
? - Does your work pool have a concurrency limit set? - What’s the
concurrency_limit
for the deployment(s) behind
instantly-webhooks
? Any tag-based concurrency in use? - In the UI or via CLI, are those 5k runs in SCHEDULED state, and are their scheduled times within the next few minutes? If you can share that info, I can suggest the minimal change to get the
instantly-webhooks
backlog burning down quickly.
b
@Marvin there are 5000+ late flows but the work-queue preview returns nothing scheduled. I can see all the late flows in the prefect UI
Copy code
sourcing-dev-api-64b8b7bd5c-4lzfr:/app# prefect work-queue inspect -p default-agent-pool instantly-webhooks
WorkQueue(
    id='504cd713-bb71-4574-b410-5f4d1d35d9e0',
    created=datetime.datetime(2025, 12, 5, 15, 47, 55, 569764, tzinfo=TzInfo(0)),
    updated=datetime.datetime(2025, 12, 11, 18, 57, 14, 618203, tzinfo=TzInfo(0)),
    name='instantly-webhooks',
    concurrency_limit=100,
    priority=5,
    work_pool_name='default-agent-pool',
    work_pool_id=UUID('b4515642-e5f5-4464-b741-21b447fd4e3b'),
    last_polled=datetime.datetime(2025, 12, 11, 18, 57, 14, 613627, tzinfo=TzInfo(0)),
    status=WorkQueueStatus.READY
)
WorkQueueStatusDetail(
    healthy=False,
    late_runs_count=5677,
    last_polled=datetime.datetime(2025, 12, 11, 18, 57, 14, 613627, tzinfo=TzInfo(0)),
    health_check_policy=WorkQueueHealthPolicy()
)
sourcing-dev-api-64b8b7bd5c-4lzfr:/app# prefect work-queue preview -p default-agent-pool instantly-webhooks
No runs found - try increasing how far into the future you preview with the --hours flag
m
thought for 155.5 seconds
Thanks — that output is very telling. Two key points first: - “Late runs” in the UI means the runs are SCHEDULED and their scheduled time is in the past. Workers can pick them immediately if there’s capacity. -
prefect work-queue preview
does NOT show the backlog; it forecasts future schedule events. So it’s normal for preview to show nothing even when there are many late runs. Given you have 5k+ late runs but workers aren’t pulling them, the most common culprits are capacity/concurrency somewhere “above” the queue (work pool, worker limit) or per-deployment/per-tag concurrency throttling. Do these checks next 1) Simulate what a worker would receive right now (this uses the same server-side selection logic)
Copy code
prefect work-queue read-runs -p default-agent-pool instantly-webhooks
- If this returns 0, your work pool or queue selection had no effective capacity at the moment of the query (pool/queue/deployment/tag limits or all worker slots are occupied by higher-priority queues). 2) Inspect the work pool for capacity/paused state
Copy code
prefect work-pool inspect default-agent-pool
Look for: - is_paused: False - concurrency_limit: If set and small, higher-priority queues can keep the pool full and starve lower-priority queues. Consider:
Copy code
prefect work-pool set-concurrency-limit default-agent-pool <higher-number>
# or
prefect work-pool clear-concurrency-limit default-agent-pool
3) Confirm queue state and concurrency You already did; it shows: - instantly-webhooks concurrency_limit=100 - healthy=False, late_runs_count=5677 - last_polled is recent (so a worker is polling this pool) 4) Check deployment-level and tag-based limits for the webhook deployment(s) - Deployment limits can silently cap you even when the queue has room:
Copy code
prefect deployment ls | grep -i instantly
prefect deployment inspect <deployment-name-or-id>
Look for
concurrency_limit
and any late-run policy. - Tag-based (task-run) concurrency limits can block entire flow runs if tight:
Copy code
prefect concurrency-limit ls
5) Verify worker start parameters and limits - If your Kubernetes worker pods were started with a small
--limit
(per-worker concurrency), or only
-q
for high-priority queues, they may never reach
instantly-webhooks
. - Check the pod command/args for each worker: - Is
-p default-agent-pool
correct? - Are you passing
-q
filters? If so, ensure
instantly-webhooks
is included on at least one worker or start a dedicated worker for it:
Copy code
prefect worker start -p default-agent-pool -q instantly-webhooks --limit 50
6) Optional tuning for a burn-down - Temporarily increase worker polling aggressiveness for faster burn:
Copy code
PREFECT_WORKER_QUERY_SECONDS=2 \
PREFECT_WORKER_PREFETCH_SECONDS=30 \
prefect worker start -p default-agent-pool -q instantly-webhooks
- Temporarily raise
instantly-webhooks
queue priority so it gets pool capacity earlier; or put it in its own work pool with dedicated workers. Why this is likely happening in your setup - With high-priority queues and a small work pool limit (or small per-worker limits), the pool may be at capacity most of the time due to those higher-priority runs. The server’s selection query fills capacity from higher to lower priority queues. If capacity is 0 at the time of polling, no rows are returned for the lower-priority queue, even with thousands of late runs waiting. If you can share: -
prefect work-pool inspect default-agent-pool
- The worker start args in your K8s manifests -
prefect deployment inspect
for the webhook deployment(s) -
prefect concurrency-limit ls
…I can call out the exact throttle and the smallest change to get the
instantly-webhooks
backlog burning down.
b
@Marvin
Copy code
sourcing-dev-api-64b8b7bd5c-4lzfr:/app# prefect work-pool inspect default-agent-pool
WorkPool(
    id='b4515642-e5f5-4464-b741-21b447fd4e3b',
    created=datetime.datetime(2025, 11, 21, 10, 35, 24, 78721, tzinfo=TzInfo(0)),
    updated=datetime.datetime(2025, 12, 11, 17, 27, 24, 193047, tzinfo=TzInfo(0)),
    name='default-agent-pool',
    type='process',
    base_job_template={
        'variables': {
            'type': 'object',
            'properties': {
                'env': {
                    'type': 'object',
                    'title': 'Environment Variables',
                    'description': 'Environment variables to set when starting a flow run.',
                    'additionalProperties': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}
                },
                'name': {
                    'anyOf': [{'type': 'string'}, {'type': 'null'}],
                    'title': 'Name',
                    'default': None,
                    'description': 'Name given to infrastructure created by a worker.'
                },
                'labels': {
                    'type': 'object',
                    'title': 'Labels',
                    'description': 'Labels applied to infrastructure created by a worker.',
                    'additionalProperties': {'type': 'string'}
                },
                'command': {
                    'anyOf': [{'type': 'string'}, {'type': 'null'}],
                    'title': 'Command',
                    'default': None,
                    'description': 'The command to use when starting a flow run. In most cases, this should be left blank and the command will be 
automatically generated by the worker.'
                },
                'working_dir': {
                    'anyOf': [{'type': 'string', 'format': 'path'}, {'type': 'null'}],
                    'title': 'Working Directory',
                    'default': None,
                    'description': 'If provided, workers will open flow run processes within the specified path as the working directory. Otherwise, a 
temporary directory will be created.'
                },
                'stream_output': {
                    'type': 'boolean',
                    'title': 'Stream Output',
                    'default': True,
                    'description': 'If enabled, workers will stream output from flow run processes to local standard output.'
                }
            }
        },
        'job_configuration': {
            'env': '{{ env }}',
            'name': '{{ name }}',
            'labels': '{{ labels }}',
            'command': '{{ command }}',
            'working_dir': '{{ working_dir }}',
            'stream_output': '{{ stream_output }}'
        }
    },
    status=WorkPoolStatus.READY,
    storage_configuration=WorkPoolStorageConfiguration(),
    default_queue_id='aefdd689-d708-4643-9a63-3d039636e5a9'
)
worker start:
"./scripts/prefect-worker.sh --pool default-agent-pool"
. the prefect-worker.sh was shared earlier
Copy code
sourcing-dev-api-64b8b7bd5c-4lzfr:/app# prefect deployment inspect instantly-email-sent/instantly_email_sent
{
    'id': 'b217c6fa-f797-4f02-8d91-7ae5a79e62f1',
    'created': '2025-12-08T15:11:14.312687Z',
    'updated': '2025-12-11T19:50:44.597612Z',
    'name': 'instantly_email_sent',
    'version': 'ad890bc37eeb7c18e33077d22992d2bb',
    'version_id': None,
    'version_info': None,
    'branch': None,
    'base': None,
    'root': None,
    'description': 'Handle email sent events from Instantly webhooks',
    'flow_id': 'cb7176ed-4917-4fae-8fb1-80a931ce1b7c',
    'concurrency_limit': None,
    'global_concurrency_limit': None,
    'concurrency_options': None,
    'paused': False,
    'schedules': [],
    'job_variables': {},
    'parameters': {},
    'pull_steps': [{'prefect.deployments.steps.set_working_directory': {'directory': '/app'}}],
    'tags': ['instantly', 'webhook', 'sent'],
    'labels': {'prefect.flow.id': 'cb7176ed-4917-4fae-8fb1-80a931ce1b7c'},
    'work_queue_name': 'default',
    'last_polled': '2025-12-11T19:50:44.600172Z',
    'parameter_openapi_schema': {
        'type': 'object',
        'title': 'Parameters',
        'required': ['payload'],
        'properties': {
            'payload': {
                '$ref': '#/definitions/InstantlyWebhookPayload',
                'title': 'payload',
                'position': 0,
                'description': 'The webhook payload from Instantly containing email sent details.'
            }
        },
        'definitions': {
            'InstantlyEventType': {
                'enum': [
                    'email_sent',
                    'email_opened',
                    'reply_received',
                    'auto_reply_received',
                    'link_clicked',
                    'email_bounced',
                    'lead_unsubscribed',
                    'account_error',
                    'campaign_completed',
                    'lead_neutral',
                    'lead_interested',
                    'lead_not_interested',
                    'lead_meeting_booked',
                    'lead_meeting_completed',
                    'lead_closed',
                    'lead_out_of_office',
                    'lead_wrong_person'
                ],
                'type': 'string',
                'title': 'InstantlyEventType',
                'description': 'Event types sent by Instantly webhooks.'
            },
            'InstantlyWebhookPayload': {
                'type': 'object',
                'title': 'InstantlyWebhookPayload',
                'required': ['timestamp', 'event_type', 'workspace', 'campaign_id', 'campaign_name'],
                'properties': {
                    'step': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Step', 'default': None},
                    'email': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Email', 'default': None},
                    'variant': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Variant', 'default': None},
                    'website': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Website', 'default': None},
                    'Industry': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Industry', 'default': None},
                    'Linkedin': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Linkedin', 'default': None},
                    'campaign': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Campaign', 'default': None},
                    'email_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Email Id', 'default': None},
                    'is_first': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}], 'title': 'Is First', 'default': None},
                    'lastName': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Lastname', 'default': None},
                    'expert_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Expert Id', 'default': None},
                    'firstName': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Firstname', 'default': None},
                    'timestamp': {'type': 'string', 'title': 'Timestamp', 'format': 'date-time'},
                    'workspace': {'type': 'string', 'title': 'Workspace'},
                    'email_html': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Email Html', 'default': None},
                    'email_text': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Email Text', 'default': None},
                    'event_type': {'$ref': '#/definitions/InstantlyEventType'},
                    'lead_email': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Lead Email', 'default': None},
                    'project_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Project Id', 'default': None},
                    'reply_html': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Reply Html', 'default': None},
                    'reply_text': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Reply Text', 'default': None},
                    'unibox_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Unibox Url', 'default': None},
                    'campaign_id': {'type': 'string', 'title': 'Campaign Id'},
                    'companyName': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Companyname', 'default': None},
                    'campaign_name': {'type': 'string', 'title': 'Campaign Name'},
                    'email_account': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Email Account', 'default': None},
                    'email_subject': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Email Subject', 'default': None},
                    'linkedin_slug': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Linkedin Slug', 'default': None},
                    'reply_subject': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Reply Subject', 'default': None},
                    'personalization': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Personalization', 'default': None},
                    'reply_text_snippet': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Reply Text Snippet', 'default': None}
                },
                'description': 'Webhook payload from Instantly.\n\nBase fields are always present, optional fields depend on event type.\nAdditional lead
data fields are captured via model_extra.',
                'additionalProperties': True
            }
        }
    },
    'path': None,
    'entrypoint': 'sourcing/webhooks/instantly/flows.py:instantly_email_sent',
    'storage_document_id': None,
    'infrastructure_document_id': None,
    'created_by': None,
    'updated_by': None,
    'work_queue_id': 'aefdd689-d708-4643-9a63-3d039636e5a9',
    'enforce_parameter_schema': True,
    'work_pool_name': 'default-agent-pool',
    'status': 'READY',
    'automations': []
}
sourcing-dev-api-64b8b7bd5c-4lzfr:/app#
sourcing-dev-api-64b8b7bd5c-4lzfr:/app# prefect concurrency-limit ls
                Concurrency Limits                 
┏━━━━━┳━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃ Tag ┃ ID ┃ Concurrency Limit ┃ Active Task Runs ┃
┡━━━━━╇━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
└─────┴────┴───────────────────┴──────────────────┘
inspect a concurrency limit to show active task run
                        IDs
m
Your message was too long, here's your message at the allowed limit:
Copy code
sourcing-dev-api-64b8b7bd5c-4lzfr /app# prefect work-pool inspect default-agent-pool WorkPool( id='b4515642-e5f5-4464-b741-21b447fd4e3b' created=datetime datetime(2025 11 21 10 35 24 78721 tzinfo=TzInfo(0)) updated=datetime datetime(2025 12 11 17 27 24 193047 tzinfo=TzInfo(0)) name='default-agent-pool' type='process' base_job_template={ 'variables' { 'type' 'object' 'properties' { 'env' { 'type' 'object' 'title' 'Environment Variables' 'description' 'Environment variables to set when starting a flow run ' 'additionalProperties' {'anyOf' [{'type' 'string'} {'type' 'null'}]} } 'name' { 'anyOf' [{'type' 'string'} {'type' 'null'}] 'title' 'Name' 'default' None 'description' 'Name given to infrastructure created by a worker ' } 'labels' { 'type' 'object' 'title' 'Labels' 'description' 'Labels applied to infrastructure created by a worker ' 'additionalProperties' {'type' 'string'} } 'command' { 'anyOf' [{'type' 'string'} {'type' 'null'}] 'title' 'Command' 'default' None 'description' 'The command to use when starting a flow run In most cases this should be left blank and the command will be automatically generated by the worker ' } 'working_dir' { 'anyOf' [{'type' 'string' 'format' 'path'} {'type' 'null'}] 'title' 'Working Directory' 'default' None 'description' 'If provided workers will open flow run processes within the specified path as the working directory Otherwise a temporary directory will be created ' } 'stream_output' { 'type' 'boolean' 'title' 'Stream Output' 'default' True 'description' 'If enabled workers will stream output from flow run processes to local standard output ' } } } 'job_configuration' { 'env' '{{ env }}' 'name' '{{ name }}' 'labels' '{{ labels }}' 'command' '{{ command }}' 'working_dir' '{{ working_dir }}' 'stream_output' '{{ stream_output }}' } } status=WorkPoolStatus READY storage_configuration=WorkPoolStorageConfiguration() default_queue_id='aefdd689-d708-4643-9a63-3d039636e5a9' )
worker start
/scripts/prefect-worker sh --pool default-agent-pool
the prefect-worker sh was shared earlier ```sourcing-dev-api-64b8b7bd5c-4lzfr /app# prefect deployment inspect instantly-email-sent/instantly_email_sent { 'id' 'b217c6fa-f797-4f02-8d91-7ae5a79e62f1' 'created' '2025-12-08T15 11 14 312687Z' 'updated' '2025-12-11T19 50 44 597612Z' 'name' 'instantly_email_sent' 'version' 'ad890bc37eeb7c18e33077d22992d2bb' 'version_id' None 'version_info' None 'branch' None 'base' None 'root' None 'description' 'Handle email sent events from Instantly webhooks' 'flow_id' 'cb7176ed-4917-4fae-8fb1-80a931ce1b7c' 'concurrency_limit' None 'global_concurrency_limit' None 'concurrency_options' None 'paused' False 'schedules' [] 'job_variables' {} 'parameters' {} 'pull_steps' [{'prefect deployments steps set_working_directory' {'directory' '/app'}}] 'tags' ['instantly' 'webhook' 'sent'] 'labels' {'prefect flow id' 'cb7176ed-4917-4fae-8fb1-80a931ce1b7c'} 'work_queue_name' 'default' 'last_polled' '2025-12-11T19 50 44 600172Z' 'parameter_openapi_schema' { 'type' 'object' 'title' 'Parameters' 'required' ['payload'] 'properties' { 'payload' { '$ref' '#/definitions/InstantlyWebhookPayload' 'title' 'payload' 'position' 0 'description' 'The webhook payload from Instantly containing email sent details ' } } 'definitions' { 'InstantlyEventType' { 'enum' [ 'email_sent' 'email_opened' 'reply_received' 'auto_reply_received' 'link_clicked' 'email_bounced' 'lead_unsubscribed' 'account_error' 'campaign_completed' 'lead_neutral' 'lead_interested' 'lead_not_interested' 'lead_meeting_booked' 'lead_meeting_completed' 'lead_closed' 'lead_out_of_office' 'lead_wrong_person' ] 'type' 'string' 'title' 'InstantlyEventType' 'description' 'Event types sent by Instantly webhooks ' } 'InstantlyWebhookPayload' { 'type' 'object' 'title' 'InstantlyWebhookPayload' 'required' ['timestamp' 'event_type' 'workspace' 'campaign_id' 'campaign_name'] 'properties' { 'step' {'anyOf' [{'type' 'integer'} {'t
ype' 'null'}] 'title' 'Step' 'default' None} 'email' {'anyOf' [{'type' 'string'} {'type' 'null'}] 'title' 'Email' 'default' None} 'variant' {'anyOf' [{'type' 'integer'} {'type' 'null'}] 'title' 'Variant' 'default' None} 'website' {'anyOf' [{'type' 'string'} {'type' 'null'}] 'title' 'Website' 'default' None} 'Industry' {'anyOf' [{'type' 'string'} {'type' 'null'}] 'title' 'Industry' 'default' None} 'Linkedin' {'anyOf' [{'type' 'string'} {'type' 'null'}] 'title' 'Linkedin' 'default' None} 'campaign' {'anyOf' [{'type' 'string'} {'type' 'null'}] 'title' 'Campaign' 'default' None} 'email_id' {'anyOf' [{'type' 'string'} {'type' 'null'}] 'title' 'Email Id' 'default'