Queues
Queue names in APP_BULL_QUEUES:
| Enum | Name | Jobs observed | Attempts / backoff |
|---|---|---|---|
WEBHOOK | webhook_queue | * | 8, exponential 5s. Concurrency 10 |
EMAIL | email_queue | welcome-email, password-reset-email, tenant-invite-email, ticket-notification | 3, exponential 2s. Complete kept 24h/2000, fail 7d/5000 |
SYNC | sync_queue | order (concurrency 15), product (2), customer (2), settlement (5) | 3, exponential 5s. Complete removed, fail 7d/1000 |
FULFILLMENT | fulfillment_queue | batch-labels (concurrency 5) | default retention: 3 attempts, exponential 2s |
SETTLEMENT | settlement_queue | upload (concurrency 5) | default retention |
ADDRESS_VALIDATION | address_validation_queue | validate-pending-order (concurrency 5) | default retention |
INVENTORY | inventory_publish_queue | flush-channel:SHOPIFY, WOOCOMMERCE, FLIPKART, AMAZON, DEFAULT, channel-feed-poll, reconcile-channel-batch | INVENTORY_QUEUE_DEFAULT_JOB_OPTIONS |
STOCK_UPLOAD | stock_upload_queue | stock-bulk-upload | default retention |
SHIPMENT_TRACKING | shipment_tracking_queue | poll-shipment-tracking, refresh-shipment-tracking | default retention |
WEBHOOK_HEALTH | webhook_health_queue | webhook_health | registered without the shared retention constant |
Not in the enum: whatsapp-catalog-provisioning / job provision-catalog.
Bull retries when the processor throws. A processor that catches an error and returns normally does not retry. That pattern was not exhaustively listed. Hunt for it in courier and inventory processors before you assume a failure is retried.
Bull jobId dedupe was not verified on each queue.add. Without a job id, Bull accepts duplicates.
Terminal job failure is reported to Sentry from BaseQueueProcessor when a Sentry client exists. Non-terminal failures are warnings.
Bull Board: /admin/queues, basic auth. The board registration that was read features webhook, sync, inventory, stock upload, and webhook health. It does not list every queue in the enum.
Schedulers
These run on the scheduler process unless noted.
| Class | Cron | Effect |
|---|---|---|
SyncJobScheduler | * * * * * | Enqueue due channel sync. Offsets inside the minute: order 0, product 3, customer 7, settlement 11 |
AddressValidationScheduler | * * * * * | Pending address checks |
ShipmentExceptionScheduler | * * * * * | Exception sweep. Method body was not fully read |
InventoryReconciliationScheduler | 0 * * * * and */2 * * * * | Inventory reconcile. The two crons were not mapped to method names |
OrderItemReconciliationScheduler | */10 * * * * | Order line reconcile |
ChannelFeedPollReaperScheduler | */10 * * * * | Requeue stuck inventory feed polls |
ShipmentTrackingScheduler | 0 */3 * * * | Tracking poll |
SettlementReconciliationScheduler | 0 2 * * * | Settlement reconcile |
WebhookHealthCheckScheduler | WEBHOOK_HEALTH_CHECK_CRON | Enqueue health jobs |
MidNightScheduleWorker | 0 0 * * * | Logs only. No business work in the method body |
PartitionMaintenanceService | daily 02:00 and weekly | Runs on the worker, not the scheduler |
OutboxDispatcherService | 1s poll, purge 03:00 | Worker only |
TrackedCron reports cron failures to Sentry.
Sync intervals encoded as constants: product 6 hours, customer 12 hours, settlement 24 hours. Order interval is per tenant. A comment says production tenants use 5 minutes. That value is not the scheduler constant.
Channel sync jobs are skipped when the tenant or subscription is inactive, and when the channel type has no handler.