---
title: "How to Set Up Google Cloud Pub/Sub for Real-Time Gmail Sync (Private Infrastructure)"
description: "Configure Google Cloud Pub/Sub for real-time Gmail inbox sync when using Private Infrastructure (OAuth). Covers topics, subscriptions, permissions, and troubleshooting."
url: https://helpcenter.smartlead.ai/en/articles/459-how-to-set-up-google-cloud-pubsub-for-real-time-gmail-sync-private-infrastructure
collection: "Setting Up Email Accounts"
updated: 2026-09-18
language: en
---

# How to Set Up Google Cloud Pub/Sub for Real-Time Gmail Sync (Private Infrastructure)

Configure Google Cloud Pub/Sub for real-time Gmail inbox sync when using Private Infrastructure (OAuth). Covers topics, subscriptions, permissions, and troubleshooting.

This guide covers the Google Cloud Pub/Sub configuration needed for real-time inbox sync when using **Private Infrastructure (OAuth)** for Gmail. This is a one-time setup inside your own GCP project. Smartlead handles everything else from there.

## What You'll Build

You'll create **two Pub/Sub topics** and **two subscriptions** in your own Google Cloud project:

<table data-id="08424a66-2b28-4d8d-ba37-720e4f03b362" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="2819637a-36fd-4cf1-b7c0-6b842c0d9bb7"><strong>Resource</strong></p></td><td colspan="1" rowspan="1"><p data-id="df255279-0884-4c50-9d3c-dddce7797690"><strong>Name</strong></p></td><td colspan="1" rowspan="1"><p data-id="7e33562c-05d5-4003-b5f5-88fc991d1df6"><strong>Purpose</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b4c66146-7a9a-4959-a0cc-5043c50a7271">Topic</p></td><td colspan="1" rowspan="1"><p data-id="249f341b-4706-4d40-b355-9071878fd294"><code>smartlead-gmail-pubsub-&lt;customer-id&gt;</code></p></td><td colspan="1" rowspan="1"><p data-id="ccf686f9-1aa6-49bc-b150-bb0d934c086c">Main topic — Gmail publishes change notifications here</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="dd59d7fd-05a6-43fb-ae26-d9a1af3df2c4">Topic</p></td><td colspan="1" rowspan="1"><p data-id="914a77e6-c8df-42d3-ad77-89117eea1ca2"><code>smartlead-gmail-pubsub-&lt;customer-id&gt;-dlq</code></p></td><td colspan="1" rowspan="1"><p data-id="6ef8a896-0a13-4fc1-a8a6-37e579a99390">Dead-letter topic — failed deliveries land here</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3d7ada85-b78e-494a-8e1f-e94be76f630d">Subscription</p></td><td colspan="1" rowspan="1"><p data-id="ec810763-1c55-4c21-9423-1b27e86e9bc9"><code>smartlead-gmail-pubsub-&lt;customer-id&gt;-sub</code></p></td><td colspan="1" rowspan="1"><p data-id="f37f6de4-7552-4f9d-9967-cb66a1550c7e"><strong>Push</strong> subscription → Smartlead's webhook endpoint</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5c66f102-bdc2-441e-b738-65cb7b52d3a5">Subscription</p></td><td colspan="1" rowspan="1"><p data-id="a0d09eee-92c7-479a-9c5b-fbe667840844"><code>smartlead-gmail-pubsub-&lt;customer-id&gt;-dlq-sub</code></p></td><td colspan="1" rowspan="1"><p data-id="114e05ca-7fc0-4745-8cf6-73e1cf4b4f19"><strong>Pull</strong> subscription on the DLQ for inspection/replay</p></td></tr></tbody></table>

Replace `<customer-id>` with the unique ID Smartlead gives you during onboarding. It keeps your resources identifiable and distinct from every other customer's setup.

## Before You Start — Values Smartlead Gives You

Your Smartlead onboarding team will provide three values:

<table data-id="0b54bce8-f1f8-411a-9328-b7519e6bb8df" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="87c82e96-b49a-4cc5-9010-79efdc614c8f"><strong>Placeholder</strong></p></td><td colspan="1" rowspan="1"><p data-id="5074cb78-ebf8-4017-9176-2c5b2f3f9bf1"><strong>Example</strong></p></td><td colspan="1" rowspan="1"><p data-id="f00eaced-ec72-4d0e-b053-8efa992f662b"><strong>Where You Use It</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f5668e94-2683-4a17-a287-80ede718d1a2"><code>&lt;customer-id&gt;</code></p></td><td colspan="1" rowspan="1"><p data-id="3edafcdf-a5b3-4dd0-8f96-6ea4cba8890e">12345</p></td><td colspan="1" rowspan="1"><p data-id="95408743-e93a-405f-848a-85a68ad33fee">In every topic/subscription name, and in the push URL (customer=)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="de3b3102-44cb-4025-8409-69ba166edd4f"><code>&lt;region-code&gt;</code></p></td><td colspan="1" rowspan="1"><p data-id="420a5aab-94a4-4c7d-ba7e-e7b1064318ed">6</p></td><td colspan="1" rowspan="1"><p data-id="1eca1101-f9d9-49f5-a8a8-386ee45632fc">In the push endpoint URL (region=)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ddd9217c-bdaa-40e9-a0a1-ba79c6aacfe2"><code>&lt;secret&gt;</code></p></td><td colspan="1" rowspan="1"><p data-id="1110911d-7454-4401-af44-84f95d9982e6">(issued separately)</p></td><td colspan="1" rowspan="1"><p data-id="69280ff6-99d5-4b8a-aab3-2b63088d74a7">In the push endpoint URL (secret=)</p></td></tr></tbody></table>

**Final push endpoint** (used in Step 5):

```javascript
https://prod.slrealtime.com/api/v1/webhooks/gmail/resourceNotifications?region=<region-code>&secret=<secret>&customer=<customer-id>
```

## Prerequisites

-   A Google Cloud project with billing enabled.
    
-   An account with `Pub/Sub Admin` (or `Owner`/`Editor`) role on that project.
    
-   Your `customer-id`, `region-code`, and `secret` from Smartlead.
    
-   The same Google account used to log into Gmail must own the project, or have `Pub/Sub Editor` on it — Google enforces this when notifications are enabled on the mailbox.
    

## Step 1: Enable the Pub/Sub API

1.  Open Google Cloud Console at console.cloud.google.com.
    
2.  Select your project from the project picker.
    
3.  Go to **APIs & Services → Library**.
    
4.  Search **Cloud Pub/Sub API**, click it, then click **Enable**.
    

![](https://staticfiles.gleap.io/ghelparticle/keAKx5NK3hyH1H30gZ4d6Ix8cnpM99uRxtlfq1QJeTLUNayK9oymrAgrUZGSl2RNTE68wEa89Sj.png)

## Step 2: Create the Main Topic

1.  Go to **Pub/Sub → Topics → Create topic**.
    
2.  Fill in: **Topic ID**: `smartlead-gmail-pubsub-<customer-id>`; **Encryption**: Google-managed encryption key (default); **Add a default subscription**: uncheck (you'll create subscriptions manually in Step 5); **Schema**: none; **Message retention**: leave default.
    
3.  Click **Create**.
    

![](https://staticfiles.gleap.io/ghelparticle/ntYd2MxKsO86AwtK2pYGeO5hp4S4Fd2ArKh7v8Nnb5POlD4hTSQSn7K0Xnri2OQ5WDToa8cVIIR.png)

## Step 3: Create the Dead-Letter Topic (DLQ)

Repeat Step 2 with one change: **Topic ID**: `smartlead-gmail-pubsub-<customer-id>-dlq`.

Pub/Sub retries failed pushes with exponential backoff. After 5 failed attempts, a message is dead-lettered here instead of lost, so it can be inspected or replayed later.

## Step 4: Grant Gmail Permission to Publish

Gmail publishes notifications via a Google-managed service account. Grant it `Pub/Sub Publisher` **on the main topic only** — not the DLQ.

1.  **Pub/Sub → Topics** → click your main topic.
    
2.  Open the info panel → **Permissions** tab → **Add principal**.
    
3.  Fill in: **New principals**: `gmail-api-push@system.gserviceaccount.com`; **Role**: `Pub/Sub Publisher`.
    
4.  Click **Save**.
    

![](https://staticfiles.gleap.io/ghelparticle/oz40sbMv14Lf8elkm5LDAfVqzucGalEOABFrB4nfCnEOk2F8TOMr11Af6QIiQGaluKzXFnkb5S2.png)

> ⚠ Important: do not add this on the DLQ topic — only Pub/Sub itself writes there.

## Step 5: Create the Main Push Subscription

1.  **Pub/Sub → Subscriptions → Create subscription**.
    

![](https://staticfiles.gleap.io/ghelparticle/dQ8v9MP8a52vKnMQd5gp4tpm5j7gCdfrFnboCKqQbM1Z8z5OiJS1VX1nLkaiyqkIr511LiADXZO.png)

<table data-id="645d5495-7472-42a8-8f78-eb0398a4900b" style="min-width: 175px;"><colgroup><col style="width: 150px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="ac380e6c-829c-4b5e-956b-63d36cba73de">Field</p></td><td colspan="1" rowspan="1"><p data-id="b0503d50-2de5-40c9-b6e6-cd3ca2118591">Value</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="517d89d4-fe74-4d03-a473-d988913a9b54">Subscription ID</p></td><td colspan="1" rowspan="1"><p data-id="4e7a3765-d64d-45e7-8859-149dded53eaa"><code>smartlead-gmail-pubsub-&lt;customer-id&gt;-sub</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="73bb9c43-acd4-4b04-809c-86b876fabcb9">Cloud Pub/Sub topic</p></td><td colspan="1" rowspan="1"><p data-id="18b4f942-49aa-49b9-acca-ebf18dfe6e41">your main topic (not the DLQ)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cef0a36a-474e-46d6-8937-97a1cdb5c553">Delivery type</p></td><td colspan="1" rowspan="1"><p data-id="c19b6686-6ae1-4ee7-815c-488a93e2ca27"><strong>Push</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="19a6b692-abbe-4b04-b065-03f7a93bc22b">Endpoint URL</p></td><td colspan="1" rowspan="1"><p data-id="cc99a936-9e01-429b-8ac6-5d597a269e95"><code>https://prod.slrealtime.com/api/v1/webhooks/gmail/resourceNotifications?region=&lt;region-code&gt;&amp;secret=&lt;secret&gt;&amp;customer=&lt;customer-id&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9cf10d39-647e-4f74-b1e6-3c114334e210">Enable authentication</p></td><td colspan="1" rowspan="1"><p data-id="44c04af1-01d9-4b7b-9903-557959bc8d40">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d10a159a-8450-4b97-921a-f1c324118153">Enable payload unwrapping</p></td><td colspan="1" rowspan="1"><p data-id="2822c344-575d-443c-921e-f49d0c0297a2">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5058006e-b014-4656-9456-8ed5c5d71de3">Subscription expiration</p></td><td colspan="1" rowspan="1"><p data-id="e98083ce-d8b2-4a1f-87d2-9429d910de44">Never expire</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e6f67335-db72-4113-9b83-1eadb1c81adc">Acknowledgement deadline</p></td><td colspan="1" rowspan="1"><p data-id="07f0447c-604b-4374-8441-94141d1ad95e">10 seconds</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e14d96e0-842c-4314-9a5f-6ddd6249435d">Message retention duration</p></td><td colspan="1" rowspan="1"><p data-id="e4617ecb-8188-4dfd-98a4-5023b676858e">1 day</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6d2a737e-12de-4823-83fd-9bfdb41c6a56">Retain acknowledged messages</p></td><td colspan="1" rowspan="1"><p data-id="783c201b-050b-4cc7-b856-3f515d8d6048">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d67a45b7-1f82-4093-b40f-0eec80dc8ebc">Exactly once delivery</p></td><td colspan="1" rowspan="1"><p data-id="a13d7c81-b476-4ac6-bcca-658b9839cd10">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="95b8012d-2696-41bb-9218-83c5b7c4a47e">Message ordering</p></td><td colspan="1" rowspan="1"><p data-id="8ecd64d4-56c8-455c-8fb0-40bc95fd42cf">Off</p></td></tr></tbody></table>

Expand **Dead lettering** and enable it:

<table data-id="6d969568-7eb1-4e1b-a489-889d98cdafe3" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="dc829000-1864-4d9f-9c11-7a30347f9eba"><strong>Field</strong></p></td><td colspan="1" rowspan="1"><p data-id="2b595b2f-1904-42f6-ab8b-448c35e568a4"><strong>Value</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ef206f5c-88ea-411c-afb4-869d012a81a2">Dead-letter topic</p></td><td colspan="1" rowspan="1"><p data-id="bb77ae47-098d-463e-aaa4-c07874ef84e2">your -dlq topic</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f81c694d-4945-4519-b041-decb5139213d">Maximum delivery attempts</p></td><td colspan="1" rowspan="1"><p data-id="af881346-bd96-457d-abd6-2effa91967ee">5</p></td></tr></tbody></table>

Expand **Retry policy**:

<table data-id="7d0c8642-8a67-4254-9dbe-fd96db0fcc4f" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="aad3366f-63ee-489b-848b-4abc09f3afaa"><strong>Field</strong></p></td><td colspan="1" rowspan="1"><p data-id="41122a77-f496-4ae0-a415-7037b77370bc"><strong>Value</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f4026150-58cd-41d5-803c-43cc9df169a8">Retry policy</p></td><td colspan="1" rowspan="1"><p data-id="9e03e65d-2c05-4e91-b191-dfb80b7b8d54">Retry after exponential backoff delay</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e7ae6d60-59d9-4a97-8ce1-25ae12e66db5">Minimum backoff</p></td><td colspan="1" rowspan="1"><p data-id="0f91f0a4-92b0-4007-b297-01af79ab70e2">10 seconds</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="358ba530-fba2-4dc9-b676-740f6f8a3af7">Maximum backoff</p></td><td colspan="1" rowspan="1"><p data-id="7cc88e26-a328-453c-a43b-fd602ccb63b7">600 seconds</p></td></tr></tbody></table>

Click **Create**.

![](https://staticfiles.gleap.io/ghelparticle/QEgfwzgpdx9pZKchHddUcKyRMaRPSmDBTMiYde5f8Mwl69V9bAXg2iMlH8HMxbpNpjKEAzw6347.png)

> ℹ When you enable dead-lettering, Google Cloud will prompt you to auto-grant the Pub/Sub service account Pub/Sub Publisher on the DLQ topic and Pub/Sub Subscriber on this subscription. Click Grant if prompted.

## Step 6: Create the DLQ Pull Subscription

1.  **Pub/Sub → Subscriptions → Create subscription**.
    

<table data-id="9995bcda-324d-410c-b3b9-ff8d4cc49d68" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="e50562bf-c88c-417b-aeed-58489e53cd5e"><strong>Field</strong></p></td><td colspan="1" rowspan="1"><p data-id="41325601-23c9-416e-a838-333794f9e914"><strong>Value</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="12814ef5-dd72-4d81-8e08-ac250a943fc6">Subscription ID</p></td><td colspan="1" rowspan="1"><p data-id="439fdfb0-e62a-4da1-8c9d-1c83fb9e7a0e"><code>smartlead-gmail-pubsub-&lt;customer-id&gt;-dlq-sub</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cd455bf4-4813-402c-a9ab-1512f6ddbc02">Cloud Pub/Sub topic</p></td><td colspan="1" rowspan="1"><p data-id="a1e174dc-222c-47fe-a3e0-902b87b279f2">your -dlq topic (not the main topic)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0efeee59-e552-4e36-b43f-268389e1c7e8">Delivery type</p></td><td colspan="1" rowspan="1"><p data-id="e08e405e-98bf-4f6e-a5bb-f75cdc2beaa0"><strong>Pull</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e1b84988-b6a1-4d73-8e77-75996bd68db1">Subscription expiration</p></td><td colspan="1" rowspan="1"><p data-id="2c574882-4999-4598-877f-c0224bb979c1">Never expire</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9f624c96-b15a-461a-b3a9-b03e46bc9734">Acknowledgement deadline</p></td><td colspan="1" rowspan="1"><p data-id="2e989db3-cc1e-4676-91ad-a3d0bf9d5814">10 seconds</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3800e78f-4a78-4a81-b3a4-3e5971a13097">Message retention duration</p></td><td colspan="1" rowspan="1"><p data-id="95a03fb6-21aa-42db-a048-0fe3f4bfe307">7 days</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="1d11bea4-3cc1-4099-bb65-1679ad1022c8">Retain acknowledged messages</p></td><td colspan="1" rowspan="1"><p data-id="eb6a2f1c-1e16-4f40-ac42-fff2bccdf36a">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="56c9bd8e-94c6-4208-8f07-14e0ecc75454">Exactly once delivery</p></td><td colspan="1" rowspan="1"><p data-id="51a6ac9e-c506-46e5-a778-929c469a344b">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b593ab87-7e3d-474e-b226-a5f164f179ed">Message ordering</p></td><td colspan="1" rowspan="1"><p data-id="aa49d7ca-6bb2-4530-8fd4-22ad83fefed9">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f17f9118-3412-45a9-a2e6-35e2cdd8fe98">Dead lettering</p></td><td colspan="1" rowspan="1"><p data-id="f4a78799-4a36-4ba1-830a-8eaaf1bc7434">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d4d37baa-51b1-4acf-9275-0f11508daa5c">Retry policy</p></td><td colspan="1" rowspan="1"><p data-id="80b11801-a92c-4675-a86e-d4607b34bce9">Retry immediately</p></td></tr></tbody></table>

Click **Create**.

## Step 7: Verify Your Setup

Before notifying Smartlead you're ready, confirm:

-   Both topics exist (main and -dlq).
    
-   Main topic has Pub/Sub Publisher for [gmail-api-push@system.gserviceaccount.com](mailto:gmail-api-push@system.gserviceaccount.com).
    
-   Main subscription is Push, points to the main topic, endpoint URL has your correct region/secret/customer values, dead-letter topic is the -dlq topic, max delivery attempts = 5.
    
-   DLQ subscription is Pull, points to the -dlq topic, retention = 7 days.
    

Then share with Smartlead onboarding: your **GCP project ID**, your `customer-id`, the **Gmail account email** being connected, and confirmation you used the assigned values in the push URL.

## Troubleshooting

<table data-id="c03efadc-ed22-49c2-a01c-aefdcc131bcc" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="73ec1236-1ed2-4bb0-a702-f4008e685796"><strong>Symptom</strong></p></td><td colspan="1" rowspan="1"><p data-id="affaeaa9-34ec-4d84-a0ee-6568eae78dfb"><strong>Likely Cause</strong></p></td><td colspan="1" rowspan="1"><p data-id="e2c5e961-09f1-47c6-96af-04accb4a4a19"><strong>Fix</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6acd90a0-a034-4f5e-a753-712f80ce704b">"Topic not found" during onboarding</p></td><td colspan="1" rowspan="1"><p data-id="158cb680-013a-4469-b17b-8a822a564482">Topic name mismatch or wrong project</p></td><td colspan="1" rowspan="1"><p data-id="843465be-e5df-4a18-aa98-7020fb2240c2">Double-check topic ID and project ID</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ae8b9b86-d994-4ba9-9f75-cdb16d16ac99">"User not authorized" during onboarding</p></td><td colspan="1" rowspan="1"><p data-id="6fb545e3-ae42-4277-b923-8fabf23e0a33">Gmail service account missing Pub/Sub Publisher on main topic</p></td><td colspan="1" rowspan="1"><p data-id="3493f560-91b1-49f1-9860-de18dec798ac">Re-add <a target="_blank" rel="noopener noreferrer nofollow" class="linktype-link link" data-linktype="link" href="mailto:gmail-api-push@system.gserviceaccount.com">gmail-api-push@system.gserviceaccount.com</a> as Publisher</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="26985e55-679f-4767-867c-ea0f1e4fe4ea">"Unacked messages" keeps climbing</p></td><td colspan="1" rowspan="1"><p data-id="03257d05-2367-4020-9cde-b1a37c209f1e">Smartlead's endpoint is rejecting pushes</p></td><td colspan="1" rowspan="1"><p data-id="08da4b47-336a-4192-8106-fb9bd3d08cf3">Confirm customer-id, region-code, secret in the push URL exactly match what Smartlead gave you</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ceb15539-5988-446d-bebe-6781c3b2c264">Messages landing in the DLQ</p></td><td colspan="1" rowspan="1"><p data-id="0607d0e9-cfc2-4058-8666-d54682e6a129">Pushes failed 5x in a row</p></td><td colspan="1" rowspan="1"><p data-id="dd866317-d72b-4033-b089-be40c9fcc425">Inspect via DLQ subscription → Messages → Pull, and share the messageId with Smartlead support</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a213056a-d519-445a-b41d-c83fd2094a20">"Push permission denied" warning</p></td><td colspan="1" rowspan="1"><p data-id="2fa11e65-ffbd-4e5c-81f2-bd473ca27ec2">Pub/Sub service account missing publisher rights on DLQ</p></td><td colspan="1" rowspan="1"><p data-id="0ed5caf7-0c25-447e-9ba0-2ed8a06f9c71">Re-toggle Dead lettering on the main subscription and accept the auto-grant banner</p></td></tr></tbody></table>

## Quick Reference

```javascript
MAIN TOPIC:  smartlead-gmail-pubsub-<customer-id>
DLQ TOPIC:   smartlead-gmail-pubsub-<customer-id>-dlq
MAIN SUB:    smartlead-gmail-pubsub-<customer-id>-sub      (Push)
DLQ SUB:     smartlead-gmail-pubsub-<customer-id>-dlq-sub  (Pull)
GMAIL PUBLISHER: gmail-api-push@system.gserviceaccount.com (main topic only)
```
