This workflow corresponds to n8n.io template #15316 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "b9PLT9UeTQVmNxaD",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Publish Subscribe Example - Webhook to RabbitMQ, RabbitMQ to GMAIL",
"tags": [
{
"id": "GRCPGGZQ2dMXBzyX",
"name": "RabbitMQ",
"createdAt": "2026-04-26T10:11:31.662Z",
"updatedAt": "2026-04-26T10:11:31.662Z"
},
{
"id": "7vg9o2n0LDlRRqp7",
"name": "JSON Schema",
"createdAt": "2026-04-26T10:11:31.585Z",
"updatedAt": "2026-04-26T10:11:31.585Z"
},
{
"id": "gGfh7cZa0ppj5J3c",
"name": "PubSub",
"createdAt": "2026-04-26T10:11:31.591Z",
"updatedAt": "2026-04-26T10:11:31.591Z"
},
{
"id": "zJMSBjngPoneUC7V",
"name": "Gmail",
"createdAt": "2026-04-26T10:11:31.603Z",
"updatedAt": "2026-04-26T10:11:31.603Z"
},
{
"id": "dZsss6rjcmZ7Axcl",
"name": "Sticky Notes",
"createdAt": "2026-04-26T10:11:31.613Z",
"updatedAt": "2026-04-26T10:11:31.613Z"
}
],
"nodes": [
{
"id": "5531d0fb-a876-4f6b-8ea4-02edace83896",
"name": "Sticky Note - Publisher Flow",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1264,
-64
],
"parameters": {
"color": 4,
"width": 2888,
"height": 852,
"content": "## Publisher Flow\n\nThis section receives client onboarding JSON through a webhook.\n\nSteps:\n1. Receive JSON payload.\n2. Normalize input.\n3. Validate payload using JSON Schema.\n4. If valid, build an event envelope.\n5. Publish the message to RabbitMQ.\n6. If invalid, route to DLQ and return validation error."
},
"typeVersion": 1
},
{
"id": "cdec72f8-8c22-4ec2-9b9b-8f85f8c64897",
"name": "Sticky Note - JSON Schema Validation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-896,
224
],
"parameters": {
"color": 5,
"width": 572,
"height": 412,
"content": "## JSON Schema Validation\n\nThe schema validates: - clientId, clientName, email, serviceType, taxYear, documents array. Validation happens before publishing and again after subscribing."
},
"typeVersion": 1
},
{
"id": "35a358a9-1fa3-4aea-914d-148a9303e80b",
"name": "Sticky Note - RabbitMQ Setup",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
32
],
"parameters": {
"color": 6,
"width": 872,
"height": 736,
"content": "## Send to RabbitMQ\n\nRequired RabbitMQ resources:\nExchange:\n`client.onboarding.exchange`\nExchange type:\n`topic`\nQueue:\n`client.onboarding.queue`\nRouting key:\n`client.onboarding.received`\nDead letter queue:\n`client.onboarding.dlq`"
},
"typeVersion": 1
},
{
"id": "29158972-8e52-4ae5-a44d-91e35ef03081",
"name": "Sticky Note - Subscriber Flow",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1264,
816
],
"parameters": {
"color": 3,
"width": 2888,
"height": 936,
"content": "## Subscriber Flow\n\nThis section listens for RabbitMQ messages.\n\nSteps:\n1. Receive RabbitMQ message.\n2. Normalize message.\n3. Validate the event using JSON Schema.\n4. If valid, prepare Gmail email.\n5. Send Gmail notification.\n6. If invalid or failed, route to DLQ."
},
"typeVersion": 1
},
{
"id": "7cbd2cc5-2919-45bc-a398-58dc61c5b17f",
"name": "Sticky Note - Gmail Notification",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
928
],
"parameters": {
"color": 2,
"width": 604,
"height": 368,
"content": "## Gmail Notification\n\nSend email with the json payload"
},
"typeVersion": 1
},
{
"id": "082260e2-d76a-4375-aa11-3ffb09c04f4f",
"name": "PUBLISHER - Webhook Receive JSON",
"type": "n8n-nodes-base.webhook",
"position": [
-1184,
352
],
"parameters": {
"path": "client-onboarding-rabbitmq",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "c403e460-ff5a-4dfb-a081-5ec50f02b063",
"name": "PUBLISHER - Normalize Input",
"type": "n8n-nodes-base.set",
"position": [
-816,
432
],
"parameters": {
"mode": "raw",
"include": "none",
"options": {},
"jsonOutput": "={{ $json.body.toJsonString() }}"
},
"typeVersion": 3
},
{
"id": "e6f2945e-a33c-4576-a583-f2a144a2f462",
"name": "PUBLISHER - RabbitMQ Publish Event",
"type": "n8n-nodes-base.rabbitmq",
"position": [
112,
368
],
"parameters": {
"mode": "exchange",
"message": "={{$json.toJsonString()}}",
"options": {
"durable": true,
"headers": {
"header": [
{
"key": "x-correlation-id",
"value": "={{$json.correlationId}}"
},
{
"key": "x-event-type",
"value": "CLIENT_ONBOARDING_RECEIVED"
},
{
"key": "x-schema-version",
"value": "1.0"
}
]
}
},
"exchange": "=client.onboarding.exchange",
"routingKey": "=client.onboarding.received",
"exchangeType": "topic",
"sendInputData": false
},
"credentials": {
"rabbitmq": {
"name": "<your credential>"
}
},
"typeVersion": 1.1,
"continueOnFail": true
},
{
"id": "d79dfd4d-0822-4ed4-8e8c-8b93bd5a19a2",
"name": "PUBLISHER - RabbitMQ Publish Success?",
"type": "n8n-nodes-base.if",
"position": [
384,
336
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{$json.success === true || !$json.error}}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"id": "4a101312-9b94-4eac-9cb5-cc64e035ace3",
"name": "PUBLISHER - Respond Success",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1152,
160
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={{ { success: true, status: 'PUBLISHED_TO_RABBITMQ', message: 'Payload validated and published to RabbitMQ', exchange: 'client.onboarding.exchange', routingKey: 'client.onboarding.received' } }}"
},
"typeVersion": 1
},
{
"id": "a190cf3e-ad84-40fa-ad5b-1463098892bf",
"name": "PUBLISHER - Send Publish Failure to DLQ",
"type": "n8n-nodes-base.rabbitmq",
"position": [
672,
432
],
"parameters": {
"queue": "client.onboarding.dlq",
"options": {
"durable": true,
"headers": {
"header": [
{
"key": "x-error-source",
"value": "publisher-rabbitmq-publish-failed"
}
]
}
}
},
"credentials": {
"rabbitmq": {
"name": "<your credential>"
}
},
"typeVersion": 1.1,
"continueOnFail": true
},
{
"id": "aad36558-6fdd-48c7-a1b7-ed1f7ab3f56c",
"name": "PUBLISHER - Respond Publish Error",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1152,
368
],
"parameters": {
"options": {
"responseCode": 500
},
"respondWith": "json",
"responseBody": "={{ { success: false, status: 'RABBITMQ_PUBLISH_FAILED', message: 'Payload was valid but RabbitMQ publish failed. Error details were sent to DLQ where possible.', error: $json.error || $json } }}"
},
"typeVersion": 1
},
{
"id": "c577f478-3eb1-444f-80fe-c0d628cf80b3",
"name": "PUBLISHER - Send Invalid Payload to DLQ",
"type": "n8n-nodes-base.rabbitmq",
"position": [
128,
576
],
"parameters": {
"queue": "client.onboarding.dlq",
"message": "={{ $json.toJsonString() }}",
"options": {
"durable": true,
"headers": {
"header": [
{
"key": "x-error-source",
"value": "publisher-json-schema-validation-failed"
}
]
}
},
"sendInputData": false
},
"credentials": {
"rabbitmq": {
"name": "<your credential>"
}
},
"typeVersion": 1.1,
"continueOnFail": true
},
{
"id": "1c4b599e-ee45-4e7e-9fb9-c370d0b27673",
"name": "PUBLISHER - Respond Validation Error",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1152,
608
],
"parameters": {
"options": {
"responseCode": 400
},
"respondWith": "json",
"responseBody": "={{ { success: false, status: 'VALIDATION_FAILED', message: 'Input JSON failed JSON Schema validation', errors: $('Schema Guard').item.json._schemaErrors || [] } }}"
},
"typeVersion": 1
},
{
"id": "38d18872-acf7-4e07-a663-174ebd6f7137",
"name": "SUBSCRIBER - Normalize Message",
"type": "n8n-nodes-base.set",
"position": [
-816,
1168
],
"parameters": {
"mode": "raw",
"include": "selected",
"options": {},
"jsonOutput": "={{ $json.content.toJsonString() }}"
},
"typeVersion": 3
},
{
"id": "df4c9a27-6a24-40f6-8d3d-606afd8ed8c1",
"name": "SUBSCRIBER - Success Log",
"type": "n8n-nodes-base.code",
"position": [
976,
896
],
"parameters": {
"jsCode": "return [\n {\n json: {\n status: 'SUBSCRIBER_PROCESSED_SUCCESSFULLY',\n message: 'Message validated and email notification prepared/sent.',\n correlationId: $json.correlationId || $json.message?.correlationId\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "c75efb1e-16d0-4798-86ce-cfb104fa94ed",
"name": "SUBSCRIBER - Send Email Failure to DLQ",
"type": "n8n-nodes-base.rabbitmq",
"position": [
768,
1168
],
"parameters": {
"queue": "client.onboarding.dlq",
"message": "={{ $json.toJsonString() }}",
"options": {
"durable": true,
"headers": {
"header": [
{
"key": "x-error-source",
"value": "subscriber-email-send-failed"
}
]
}
},
"sendInputData": false
},
"credentials": {
"rabbitmq": {
"name": "<your credential>"
}
},
"typeVersion": 1.1,
"continueOnFail": true
},
{
"id": "21011274-37af-4eab-b591-6dd22e65cf40",
"name": "SUBSCRIBER - Send Invalid Message to DLQ",
"type": "n8n-nodes-base.rabbitmq",
"position": [
272,
1408
],
"parameters": {
"queue": "client.onboarding.dlq",
"options": {
"durable": true,
"headers": {
"header": [
{
"key": "x-error-source",
"value": "subscriber-json-schema-validation-failed"
}
]
}
},
"sendInputData": "={{ $json.toJsonString() }}"
},
"credentials": {
"rabbitmq": {
"name": "<your credential>"
}
},
"typeVersion": 1.1,
"continueOnFail": true
},
{
"id": "621e40f6-b640-4571-b2af-9f017432f5e0",
"name": "SUBSCRIBER - Invalid Message Log",
"type": "n8n-nodes-base.code",
"position": [
1008,
1408
],
"parameters": {
"jsCode": "return [\n {\n json: {\n status: 'INVALID_MESSAGE_ROUTED_TO_DLQ',\n correlationId: $('SUBSCRIBER - RabbitMQ Trigger').first().json.fields.consumerTag,\n validationErrors: $('Schema Guard1').first().json._schemaErrors || [],\n originalMessage: $('SUBSCRIBER - RabbitMQ Trigger').first().json.content\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "222dec0c-21a5-4197-92e8-ee58b5223df6",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2064,
144
],
"parameters": {
"width": 752,
"height": 1632,
"content": "# Publish Subscribe Example - Webhook to RabbitMQ, RabbitMQ to GMAIL\n\n## How it works\n\nThis workflow demonstrates a resilient publish/subscribe automation pattern using n8n, RabbitMQ, JSON Schema validation, and Gmail.\n\nIt contains two flows in the same workflow:\n\n1. A publisher flow receives client onboarding JSON through a webhook.\n2. The payload is validated against a JSON Schema.\n3. If valid, the workflow publishes the event to RabbitMQ.\n4. A subscriber flow listens to the RabbitMQ queue.\n5. The subscriber validates the received event again.\n6. If the message is valid, it prepares and sends a Gmail notification.\n7. Invalid messages and processing failures are routed to a dead-letter/error queue.\n\nThis template is useful for client onboarding, accounting intake, document processing, form submissions, internal notifications, and event-driven workflow automation.\n\n## Set up steps\n\n1. Create or connect a RabbitMQ instance.\n2. Create the following RabbitMQ resources:\n - Exchange: `client.onboarding.exchange`\n - Exchange type: `topic`\n - Main queue: `client.onboarding.queue`\n - Routing key: `client.onboarding.received`\n - Dead letter/error queue: `client.onboarding.dlq`\n\n3. In n8n, configure your RabbitMQ credentials.\n4. Replace the RabbitMQ credential placeholder with your own RabbitMQ credential.\n5. Replace the JSON Schema Validator placeholder nodes with your preferred JSON Schema validation node or validation service.\n6. Configure the Gmail credential.\n7. Replace the Gmail placeholder node with the Gmail Send Email node.\n8. Update the recipient email address in the \u201cPrepare Gmail Email\u201d node.\n9. Test the publisher webhook with a sample client onboarding JSON payload.\n10. Confirm the message is published to RabbitMQ and then consumed by the subscriber flow.\n11. Confirm Gmail receives the formatted notification email.\n\n## Required credentials\n\n- RabbitMQ credentials\n- Gmail OAuth2 credentials\n- Optional JSON Schema validator community node or external validation service\n\n## Example input JSON\n\n```json\n{\n \"clientId\": \"C1001\",\n \"clientName\": \"John Smith\",\n \"email\": \"john.smith@example.com\",\n \"serviceType\": \"Individual Tax Return\",\n \"taxYear\": 2025,\n \"documents\": [\n {\n \"documentType\": \"Photo ID\",\n \"fileName\": \"john-smith-passport.pdf\"\n },\n {\n \"documentType\": \"PAYG Summary\",\n \"fileName\": \"john-smith-payg-summary.pdf\"\n }\n ]\n} \n```\n\n## Resilience and Error Handling\n\nThis template includes:\n- Validation before publish\n- Validation after subscribe\n- Correlation ID\n- Schema version\n- Dead-letter queue\n- Email failure branch\n- Invalid message branch\n- RabbitMQ publish failure branch\n\nInvalid or failed messages are routed to `client.onboarding.dlq`."
},
"typeVersion": 1
},
{
"id": "cb8624ab-11c6-4857-93a5-7cb2738ba249",
"name": "Schema Guard",
"type": "n8n-nodes-schema-guard.schemaGuard",
"position": [
-544,
432
],
"parameters": {
"options": {
"includeErrorDetails": true
},
"jsonSchema": "{\n \"title\": \"Client Onboarding Event\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"eventType\",\n \"version\",\n \"source\",\n \"createdAt\",\n \"payload\"\n ],\n \"properties\": {\n \"eventType\": {\n \"type\": \"string\",\n \"const\": \"CLIENT_ONBOARDING_RECEIVED\"\n },\n \"version\": {\n \"type\": \"string\",\n \"const\": \"1.0\"\n },\n \"source\": {\n \"type\": \"string\",\n \"const\": \"n8n-client-onboarding\"\n },\n \"createdAt\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/ClientOnboardingPayload\"\n }\n },\n \"$defs\": {\n \"ClientOnboardingPayload\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"clientId\",\n \"clientName\",\n \"email\",\n \"serviceType\",\n \"taxYear\",\n \"documents\"\n ],\n \"properties\": {\n \"clientId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"clientName\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"email\": {\n \"type\": \"string\",\n \"format\": \"email\"\n },\n \"serviceType\": {\n \"type\": \"string\",\n \"enum\": [\n \"Individual Tax Return\",\n \"Company Tax Return\",\n \"SMSF\",\n \"BAS\",\n \"Bookkeeping\"\n ]\n },\n \"taxYear\": {\n \"type\": \"integer\",\n \"minimum\": 2000,\n \"maximum\": 2100\n },\n \"documents\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"documentType\",\n \"fileName\"\n ],\n \"properties\": {\n \"documentType\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"fileName\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n }\n }\n}"
},
"typeVersion": 1
},
{
"id": "3757720a-188e-4e18-8d4c-5b56784027a3",
"name": "Sticky Note - JSON Schema Validation1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-896,
944
],
"parameters": {
"color": 5,
"width": 668,
"height": 492,
"content": "## JSON Schema Validation\n\nThe schema validates: - clientId, clientName, email, serviceType, taxYear, documents array. Validation happens before publishing and again after subscribing."
},
"typeVersion": 1
},
{
"id": "f1268d62-8617-4de8-a024-f21c528d3a39",
"name": "Schema Guard1",
"type": "n8n-nodes-schema-guard.schemaGuard",
"position": [
-544,
1120
],
"parameters": {
"options": {
"includeErrorDetails": true
},
"jsonSchema": "{\n \"title\": \"Client Onboarding Event\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"eventType\",\n \"version\",\n \"source\",\n \"createdAt\",\n \"payload\"\n ],\n \"properties\": {\n \"eventType\": {\n \"type\": \"string\",\n \"const\": \"CLIENT_ONBOARDING_RECEIVED\"\n },\n \"version\": {\n \"type\": \"string\",\n \"const\": \"1.0\"\n },\n \"source\": {\n \"type\": \"string\",\n \"const\": \"n8n-client-onboarding\"\n },\n \"createdAt\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/ClientOnboardingPayload\"\n }\n },\n \"$defs\": {\n \"ClientOnboardingPayload\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"clientId\",\n \"clientName\",\n \"email\",\n \"serviceType\",\n \"taxYear\",\n \"documents\"\n ],\n \"properties\": {\n \"clientId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"clientName\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"email\": {\n \"type\": \"string\",\n \"format\": \"email\"\n },\n \"serviceType\": {\n \"type\": \"string\",\n \"enum\": [\n \"Individual Tax Return\",\n \"Company Tax Return\",\n \"SMSF\",\n \"BAS\",\n \"Bookkeeping\"\n ]\n },\n \"taxYear\": {\n \"type\": \"integer\",\n \"minimum\": 2000,\n \"maximum\": 2100\n },\n \"documents\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"documentType\",\n \"fileName\"\n ],\n \"properties\": {\n \"documentType\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"fileName\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n }\n }\n}"
},
"typeVersion": 1
},
{
"id": "7f80c0a1-ce52-4f64-8f91-ddf23be1f46e",
"name": "SUBSCRIBER - RabbitMQ Trigger",
"type": "n8n-nodes-base.rabbitmqTrigger",
"position": [
-1200,
1328
],
"parameters": {
"queue": "client.onboarding.queue",
"options": {
"binding": {
"bindings": [
{
"exchange": "client.onboarding.exchange",
"routingKey": "client.onboarding.received"
}
]
},
"onlyContent": false,
"jsonParseBody": true,
"parallelMessages": 5
}
},
"credentials": {
"rabbitmq": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "f5781ae1-6f10-4e0b-8ab3-3da9b113c959",
"name": "Send a message",
"type": "n8n-nodes-base.gmail",
"onError": "continueErrorOutput",
"position": [
256,
1072
],
"parameters": {
"sendTo": "user@example.com",
"message": "={{ $json.toJsonString() }}",
"options": {},
"subject": "={{ $json.eventType }} - {{ $json.createdAt }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "2986321c-b152-4857-b107-97f76af959e8",
"name": "SUBSCRIBER - Invalid Message Log1",
"type": "n8n-nodes-base.code",
"position": [
1040,
1104
],
"parameters": {
"jsCode": "return [\n {\n json: {\n status: 'INVALID_MESSAGE_ROUTED_TO_DLQ',\n correlationId: $('SUBSCRIBER - RabbitMQ Trigger').first().json.fields.consumerTag,\n validationErrors:$('Send a message').first().json.error || [],\n originalMessage: $('SUBSCRIBER - RabbitMQ Trigger').first().json.content\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "06b7ef5b-9afd-4827-ae5b-a8647e0e9605",
"name": "Save Key Execution Data",
"type": "n8n-nodes-base.executionData",
"position": [
-1024,
1168
],
"parameters": {
"dataToSave": {
"values": [
{
"key": "consumerTag",
"value": "={{ $json.fields.consumerTag }}"
},
{
"key": "Flow",
"value": "Subscriber side"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "6531e807-cc92-4f78-98fa-c169d19d4379",
"name": "Save Key Execution Data1",
"type": "n8n-nodes-base.executionData",
"position": [
-1024,
496
],
"parameters": {
"dataToSave": {
"values": [
{
"key": "cliendId",
"value": "={{ $json.body.payload.clientId }}"
},
{
"key": "Flow",
"value": "Publisher side"
},
{
"key": "createdAt",
"value": "={{ $json.body.createdAt }}"
}
]
}
},
"typeVersion": 1.1
}
],
"active": true,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "ec6e3d0f-4f36-4533-b234-5fe8757642c8",
"connections": {
"Schema Guard": {
"main": [
[
{
"node": "PUBLISHER - RabbitMQ Publish Event",
"type": "main",
"index": 0
}
],
[
{
"node": "PUBLISHER - Send Invalid Payload to DLQ",
"type": "main",
"index": 0
}
]
]
},
"Schema Guard1": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
],
[
{
"node": "SUBSCRIBER - Send Invalid Message to DLQ",
"type": "main",
"index": 0
}
]
]
},
"Send a message": {
"main": [
[
{
"node": "SUBSCRIBER - Success Log",
"type": "main",
"index": 0
}
],
[
{
"node": "SUBSCRIBER - Send Email Failure to DLQ",
"type": "main",
"index": 0
}
]
]
},
"Save Key Execution Data": {
"main": [
[
{
"node": "SUBSCRIBER - Normalize Message",
"type": "main",
"index": 0
}
]
]
},
"Save Key Execution Data1": {
"main": [
[
{
"node": "PUBLISHER - Normalize Input",
"type": "main",
"index": 0
}
]
]
},
"PUBLISHER - Normalize Input": {
"main": [
[
{
"node": "Schema Guard",
"type": "main",
"index": 0
}
]
]
},
"SUBSCRIBER - RabbitMQ Trigger": {
"main": [
[
{
"node": "Save Key Execution Data",
"type": "main",
"index": 0
}
]
]
},
"SUBSCRIBER - Normalize Message": {
"main": [
[
{
"node": "Schema Guard1",
"type": "main",
"index": 0
}
]
]
},
"PUBLISHER - Webhook Receive JSON": {
"main": [
[
{
"node": "Save Key Execution Data1",
"type": "main",
"index": 0
}
]
]
},
"PUBLISHER - RabbitMQ Publish Event": {
"main": [
[
{
"node": "PUBLISHER - RabbitMQ Publish Success?",
"type": "main",
"index": 0
}
]
]
},
"PUBLISHER - RabbitMQ Publish Success?": {
"main": [
[
{
"node": "PUBLISHER - Respond Success",
"type": "main",
"index": 0
}
],
[
{
"node": "PUBLISHER - Send Publish Failure to DLQ",
"type": "main",
"index": 0
}
]
]
},
"SUBSCRIBER - Send Email Failure to DLQ": {
"main": [
[
{
"node": "SUBSCRIBER - Invalid Message Log1",
"type": "main",
"index": 0
}
]
]
},
"PUBLISHER - Send Invalid Payload to DLQ": {
"main": [
[
{
"node": "PUBLISHER - Respond Validation Error",
"type": "main",
"index": 0
}
]
]
},
"PUBLISHER - Send Publish Failure to DLQ": {
"main": [
[
{
"node": "PUBLISHER - Respond Publish Error",
"type": "main",
"index": 0
}
]
]
},
"SUBSCRIBER - Send Invalid Message to DLQ": {
"main": [
[
{
"node": "SUBSCRIBER - Invalid Message Log",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2rabbitmq
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow demonstrates a resilient publish/subscribe automation pattern using n8n, RabbitMQ, JSON Schema validation, and Gmail.
Source: https://n8n.io/workflows/15316/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Automate WhatsApp communication for recruitment agencies with an interactive, structured customer experience. This workflow handles pricing inquiries, request submissions, tracking, complaints, and hu
Code. Uses googleSheets, gmail, supabase, stickyNote. Webhook trigger; 51 nodes.
This template turns Podium's conversation inbox into a full sales CRM with a custom funnel, AI message classification, automated drip follow-ups, daily admin reports, and a live Kanban dashboard. Six
Suspicious_login_detection. Uses postgres, httpRequest, noOp, html. Webhook trigger; 43 nodes.
This n8n workflow is designed for security monitoring and incident response when suspicious login events are detected. It can be initiated either manually from within the n8n UI for testing or automat