{
    "campaign_id": 1,
    "status": "running",
    "total": 0,
    "sent": 0,
    "temp_failed": 0,
    "perm_failed": 0,
    "suppressed": 0,
    "skipped": 0,
    "pending": 0,
    "queued": 2,
    "processing": 0,
    "jobs_total": 2,
    "completed": false,
    "progress_pct": 0.0,
    "started_at": "2026-09-10T22:41:59.453878+00:00",
    "finished_at": null
}
=== recipients monitor ===
{
    "recipients": [
        {
            "id": 1,
            "seq": 1,
            "email": "alice@example.com",
            "status": "queued",
            "account": "sender1@example.com",
            "subject": "Invoice %InvoiceNumber% \u2014 payment due %DueDate%",
            "template": "Invoice Template",
            "invoice_number": "INV-UG5O-D8CZ7-AAABNS-0164",
            "amount": 636.81,
            "shipping": 29.11,
            "attempts": 1,
            "message_id": "",
            "thread_id": "",
            "sent_at": null,
            "last_error": "temporary error: No Google OAuth client configuration available. Import a client_secret.json in Gmail Accounts \u2192 Import Gmail Configurati"
        },
        {
            "id": 2,
            "seq": 2,
            "email": "bob@example.com",
            "status": "queued",
            "account": "sender1@example.com",
            "subject": "Invoice %InvoiceNumber% \u2014 payment due %DueDate%",
            "template": "Invoice Template",
            "invoice_number": "INV-J4DY-5E2CR-UCA5MI-2874",
            "amount": 346.88,
            "shipping": 9.21,
            "attempts": 1,
            "message_id": "",
            "thread_id": "",
            "sent_at": null,
            "last_error": "temporary error: No Google OAuth client configuration available. Import a client_secret.json in Gmail Accounts \u2192 Import Gmail Configurati"
        }
    ],
    "total": 2,
    "page": 1,
    "page_size": 50
=== worker log ===
                .> control          exchange=send(direct) key=control.#
                .> send             exchange=send(direct) key=send.#

[tasks]
  . app.tasks.send_tasks.send_one

[2026-09-10 22:30:45,551: INFO/MainProcess] Connected to redis://localhost:6379/1
[2026-09-10 22:30:45,555: INFO/MainProcess] mingle: searching for neighbors
[2026-09-10 22:30:46,563: INFO/MainProcess] mingle: all alone
[2026-09-10 22:30:46,571: INFO/MainProcess] celery@172.22.92.189 ready.
[2026-09-10 22:41:59,486: INFO/MainProcess] Task app.tasks.send_tasks.send_one[84b2fd83-fabf-4c32-bc83-168931e6e9c4] received
[2026-09-10 22:41:59,497: INFO/MainProcess] Task app.tasks.send_tasks.send_one[bc88c280-7482-4b5e-bc1a-2ec02a672450] received
[2026-09-10 22:41:59,613: WARNING/ForkPoolWorker-2] HTML validation warnings for alice@example.com: ["Unsubstituted variables remain: ['DueDate']"]
[2026-09-10 22:41:59,646: INFO/MainProcess] Task app.tasks.send_tasks.send_one[bcb6258d-c572-4f25-9a92-074a6309fe51] received
[2026-09-10 22:41:59,648: INFO/ForkPoolWorker-2] Task app.tasks.send_tasks.send_one[84b2fd83-fabf-4c32-bc83-168931e6e9c4] succeeded in 0.16040096799997627s: {'ok': False, 'status': 'retrying', 'reason': 'No Google OAuth client configuration available. Import a client_secret.json in Gmail Accounts → Import Gmail Configuration, or set GOOGLE_OAUTH_CLIENT_JSON_PATH.'}
[2026-09-10 22:42:09,493: INFO/MainProcess] Task app.tasks.send_tasks.send_one[350938b8-0abc-473b-b4d6-d28c088d89e9] received
[2026-09-10 22:42:09,494: INFO/ForkPoolWorker-2] Task app.tasks.send_tasks.send_one[bc88c280-7482-4b5e-bc1a-2ec02a672450] succeeded in 0.010787428000185173s: {'ok': False, 'status': 'rescheduled', 'reason': 'rate window'}
[2026-09-10 22:42:10,501: WARNING/ForkPoolWorker-2] HTML validation warnings for bob@example.com: ["Unsubstituted variables remain: ['DueDate']"]
[2026-09-10 22:42:10,519: INFO/MainProcess] Task app.tasks.send_tasks.send_one[116afa25-7712-4664-97d3-5670605a903e] received
[2026-09-10 22:42:10,520: INFO/ForkPoolWorker-2] Task app.tasks.send_tasks.send_one[350938b8-0abc-473b-b4d6-d28c088d89e9] succeeded in 0.026009746999989147s: {'ok': False, 'status': 'retrying', 'reason': 'No Google OAuth client configuration available. Import a client_secret.json in Gmail Accounts → Import Gmail Configuration, or set GOOGLE_OAUTH_CLIENT_JSON_PATH.'}
