16 KiB
Chat SDK Setup Guide
This guide covers the complete setup process for Slack, Microsoft Teams, and Google Chat integrations.
Environment Variables
Create a .env.local file in examples/nextjs-chat/ with the following variables:
# Slack
SLACK_BOT_TOKEN=xoxb-...
SLACK_SIGNING_SECRET=...
# Microsoft Teams
TEAMS_APP_ID=...
TEAMS_APP_PASSWORD=...
TEAMS_APP_TENANT_ID=...
# Google Chat
GOOGLE_CHAT_CREDENTIALS={"type":"service_account","project_id":"...","private_key_id":"...","private_key":"-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n","client_email":"...@....iam.gserviceaccount.com","client_id":"...","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url":"..."}
# Google Chat Pub/Sub (optional - for receiving ALL messages, not just @mentions)
GOOGLE_CHAT_PUBSUB_TOPIC=projects/your-project/topics/chat-events
GOOGLE_CHAT_IMPERSONATE_USER=admin@yourdomain.com
# Redis (required for serverless deployments)
REDIS_URL=redis://localhost:6379
Slack Setup
1. Create a Slack App
- Go to api.slack.com/apps
- Click Create New App → From scratch
- Enter app name and select workspace
- Click Create App
2. Configure Bot Token Scopes
- Go to OAuth & Permissions in the sidebar
- Under Scopes → Bot Token Scopes, add:
app_mentions:read- Receive @mention eventschannels:history- Read messages in public channelschannels:read- View basic channel infochat:write- Send messagesgroups:history- Read messages in private channelsgroups:read- View basic private channel infoim:history- Read direct messagesim:read- View basic DM inforeactions:read- View emoji reactionsreactions:write- Add/remove emoji reactionsusers:read- View user info (for display names)
3. Install App to Workspace
- Go to OAuth & Permissions
- Click Install to Workspace
- Authorize the app
- Copy the Bot User OAuth Token (starts with
xoxb-) →SLACK_BOT_TOKEN
4. Get Signing Secret
- Go to Basic Information
- Under App Credentials, copy Signing Secret →
SLACK_SIGNING_SECRET
5. Configure Event Subscriptions
- Go to Event Subscriptions
- Toggle Enable Events to On
- Set Request URL to:
https://your-domain.com/api/webhooks/slack- Slack will verify the URL immediately
- Under Subscribe to bot events, add:
app_mention- When someone @mentions your botmessage.channels- Messages in public channelsmessage.groups- Messages in private channelsmessage.im- Direct messages
- Click Save Changes
6. (Optional) Enable Interactivity
If you want to use buttons, modals, or other interactive components:
- Go to Interactivity & Shortcuts
- Toggle Interactivity to On
- Set Request URL to:
https://your-domain.com/api/webhooks/slack/interactive
Microsoft Teams Setup
1. Create Azure Bot Resource
- Go to portal.azure.com
- Click Create a resource
- Search for Azure Bot and select it
- Click Create
- Fill in:
- Bot handle: Unique identifier for your bot
- Subscription: Your Azure subscription
- Resource group: Create new or use existing
- Pricing tier: F0 (free) for testing
- Type of App: Single Tenant (recommended for enterprise)
- Creation type: Create new Microsoft App ID
- Click Review + create → Create
2. Get App Credentials
- Go to your newly created Bot resource
- Go to Configuration
- Copy Microsoft App ID →
TEAMS_APP_ID - Click Manage Password (next to Microsoft App ID)
- In the App Registration page, go to Certificates & secrets
- Click New client secret
- Add description, select expiry, click Add
- Copy the Value immediately (shown only once) →
TEAMS_APP_PASSWORD - Go back to Overview and copy Directory (tenant) ID →
TEAMS_APP_TENANT_ID
3. Configure Messaging Endpoint
- In your Azure Bot resource, go to Configuration
- Set Messaging endpoint to:
https://your-domain.com/api/webhooks/teams - Click Apply
4. Enable Teams Channel
- In your Azure Bot resource, go to Channels
- Click Microsoft Teams
- Accept the terms of service
- Click Apply
5. Create Teams App Package
Create a manifest.json file:
{
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.16/MicrosoftTeams.schema.json",
"manifestVersion": "1.16",
"version": "1.0.0",
"id": "YOUR_APP_ID_HERE",
"packageName": "com.yourcompany.chatbot",
"developer": {
"name": "Your Company",
"websiteUrl": "https://your-domain.com",
"privacyUrl": "https://your-domain.com/privacy",
"termsOfUseUrl": "https://your-domain.com/terms"
},
"name": {
"short": "Chat Bot",
"full": "Chat SDK Demo Bot"
},
"description": {
"short": "A chat bot powered by Chat SDK",
"full": "A chat bot powered by Chat SDK that can respond to messages and commands."
},
"icons": {
"outline": "outline.png",
"color": "color.png"
},
"accentColor": "#FFFFFF",
"bots": [
{
"botId": "YOUR_APP_ID_HERE",
"scopes": ["personal", "team", "groupchat"],
"supportsFiles": false,
"isNotificationOnly": false,
"commandLists": [
{
"scopes": ["personal", "team", "groupchat"],
"commands": [
{
"title": "help",
"description": "Get help using this bot"
}
]
}
]
}
],
"permissions": ["identity", "messageTeamMembers"],
"validDomains": ["your-domain.com"]
}
Create icon files (32x32 outline.png and 192x192 color.png), then zip all three files together.
6. Upload App to Teams
For testing (sideloading):
- In Teams, click Apps in the sidebar
- Click Manage your apps → Upload an app
- Click Upload a custom app
- Select your zip file
For organization-wide deployment:
- Go to Teams Admin Center
- Go to Teams apps → Manage apps
- Click Upload new app
- Select your zip file
- Go to Setup policies to control who can use the app
Google Chat Setup
1. Create a GCP Project
- Go to console.cloud.google.com
- Click the project dropdown → New Project
- Enter project name and click Create
2. Enable Required APIs
- Go to APIs & Services → Library
- Search and enable:
- Google Chat API
- Google Workspace Events API (for receiving all messages)
- Cloud Pub/Sub API (for receiving all messages)
3. Create a Service Account
- Go to IAM & Admin → Service Accounts
- Click Create Service Account
- Enter name and description
- Click Create and Continue
- Skip the optional steps, click Done
4. Create Service Account Key
Note
: If your organization has the
iam.disableServiceAccountKeyCreationconstraint enabled, you'll need to:
- Go to IAM & Admin → Organization Policies
- Find
iam.disableServiceAccountKeyCreation- Click Manage Policy → Override parent's policy
- Set to Not enforced (or add an exception for your project)
- Click on your service account
- Go to Keys tab
- Click Add Key → Create new key
- Select JSON and click Create
- Save the downloaded file
- Copy the entire JSON content →
GOOGLE_CHAT_CREDENTIALS(as a single line)
5. Configure Google Chat App
- Go to console.cloud.google.com/apis/api/chat.googleapis.com/hangouts-chat
- Click Configuration
- Fill in:
- App name: Your bot's display name
- Avatar URL: URL to your bot's avatar image
- Description: What your bot does
- Interactive features:
- Enable Receive 1:1 messages
- Enable Join spaces and group conversations
- Connection settings: Select App URL
- App URL:
https://your-domain.com/api/webhooks/gchat - Visibility: Choose who can discover and install your app
- Click Save
Important for button clicks: The same App URL receives both message events and interactive events (card button clicks). Google Chat sends CARD_CLICKED events to this URL when users click buttons in cards. The SDK's onAction() handler will automatically receive these events.
6. (Optional) Set Up Pub/Sub for All Messages
By default, Google Chat only sends webhooks for @mentions. To receive ALL messages in a space (for conversation context), you need to set up Workspace Events with Pub/Sub.
6a. Create Pub/Sub Topic
- Go to Pub/Sub → Topics
- Click Create Topic
- Enter topic ID (e.g.,
chat-events) - Uncheck Add a default subscription
- Click Create
- Copy the full topic name →
GOOGLE_CHAT_PUBSUB_TOPIC- Format:
projects/your-project-id/topics/chat-events
- Format:
6b. Grant Chat Service Account Access
Note
: If your organization has the
iam.allowedPolicyMemberDomainsconstraint, you may need to temporarily relax it or use the console workaround below.
- Go to your Pub/Sub topic
- Click Permissions tab (or Show Info Panel → Permissions)
- Click Add Principal
- Enter:
chat-api-push@system.gserviceaccount.com - Select role: Pub/Sub Publisher
- Click Save
If you get a policy error, try via Cloud Console:
- Go to Pub/Sub → Topics
- Check the box next to your topic
- Click Permissions in the info panel
- Click Add Principal
- Add
chat-api-push@system.gserviceaccount.comwith Pub/Sub Publisher role
6c. Create Push Subscription
- Go to Pub/Sub → Subscriptions
- Click Create Subscription
- Enter subscription ID (e.g.,
chat-messages-push) - Select your topic
- Delivery type: Push
- Endpoint URL:
https://your-domain.com/api/webhooks/gchat - Click Create
6d. Enable Domain-Wide Delegation
To create Workspace Events subscriptions and initiate DMs, you need domain-wide delegation:
Step 1: Enable delegation on the Service Account (GCP Console)
- Go to IAM & Admin → Service Accounts
- Click on your service account
- Go to Details tab
- Check Enable Google Workspace Domain-wide Delegation
- Click Save
- Go to Advanced settings (or click on the service account again)
- Copy the Client ID - this is a numeric ID (e.g.,
123456789012345678901), NOT the email address
Step 2: Authorize the Client ID (Google Admin Console)
- Go to Google Admin Console
- Go to Security → Access and data control → API controls
- Click Manage Domain Wide Delegation
- Click Add new
- Enter:
- Client ID: The numeric ID from Step 1 (e.g.,
123456789012345678901) - OAuth Scopes (all on one line, comma-separated):
https://www.googleapis.com/auth/chat.spaces.readonly,https://www.googleapis.com/auth/chat.messages.readonly,https://www.googleapis.com/auth/chat.spaces,https://www.googleapis.com/auth/chat.spaces.create
- Client ID: The numeric ID from Step 1 (e.g.,
- Click Authorize
Step 3: Set environment variable
Set GOOGLE_CHAT_IMPERSONATE_USER to an admin user email in your domain (e.g., admin@yourdomain.com). This user will be impersonated when creating DM spaces and Workspace Events subscriptions.
Troubleshooting Domain-Wide Delegation:
- "unauthorized_client": The Client ID is not registered in Google Admin Console, or domain-wide delegation is not enabled on the service account
- "Insufficient Permission": The scopes are missing from the domain-wide delegation configuration
- Scope changes can take up to 24 hours to propagate
7. Add Bot to a Space
- Open Google Chat
- Create or open a Space
- Click the space name → Manage apps & integrations (or Apps & integrations)
- Click Add apps
- Search for your app name
- Click Add
Vercel Deployment
1. Configure Environment Variables
In your Vercel project settings:
- Go to Settings → Environment Variables
- Add all the variables from the
.env.localsection above - Make sure to select the appropriate environments (Production, Preview, Development)
2. Configure Build Settings
The examples/nextjs-chat/vercel.json is already configured to:
- Only build the necessary workspace packages
- Use the correct install and build commands
3. Set Root Directory (if needed)
If deploying from the monorepo root:
- Go to Settings → General
- Set Root Directory to
examples/nextjs-chat
Testing Your Setup
Slack
- Open Slack
- @mention your bot in a channel:
@YourBot hello - Or DM the bot directly
Teams
- Open Teams
- Search for your bot in the Apps section
- Start a chat with the bot
- Or @mention in a channel:
@YourBot hello
Google Chat
- Open Google Chat
- Go to a space where the bot is installed
- @mention the bot:
@YourBot hello - The bot should respond to the mention
- If Pub/Sub is configured, subsequent messages in the thread won't need @mentions
Troubleshooting
Slack: "Invalid signature" error
- Verify
SLACK_SIGNING_SECRETis correct - Check that the request timestamp is within 5 minutes (clock sync issue)
Teams: "Unauthorized" error
- Verify
TEAMS_APP_IDandTEAMS_APP_PASSWORDare correct - For SingleTenant apps, ensure
TEAMS_APP_TENANT_IDis set - Check that the messaging endpoint URL is correct in Azure
Google Chat: No webhook received
- Verify the App URL is correct in Google Chat configuration
- Check that the Chat API is enabled
- Ensure the service account has the necessary permissions
Google Chat: Pub/Sub not working
- Verify
chat-api-push@system.gserviceaccount.comhas Pub/Sub Publisher role - Check that the push subscription URL is correct
- Verify domain-wide delegation is configured with correct scopes
- Check
GOOGLE_CHAT_IMPERSONATE_USERis a valid admin email
Google Chat: "Permission denied" for Workspace Events
- Ensure domain-wide delegation is configured
- Verify the OAuth scopes are exactly as specified
- Check that the impersonated user has access to the spaces
Google Chat: "Insufficient Permission" for DMs (openDM)
- DMs require domain-wide delegation with
chat.spacesandchat.spaces.createscopes - Add these scopes to your domain-wide delegation configuration in Google Admin Console
- Set
GOOGLE_CHAT_IMPERSONATE_USERto an admin email in your domain - Scope changes can take up to 24 hours to propagate - wait and retry
Google Chat: Button clicks (CARD_CLICKED) not received
- Verify "Interactive features" is enabled in the Google Chat app configuration
- Check that the App URL is correctly set and accessible
- Button clicks go to the same webhook URL as messages
- Check your logs for the raw webhook payload to debug
- Ensure your button elements have valid
idattributes (these become theactionId)
Redis connection errors
- Verify
REDIS_URLis correct - For Vercel, use Upstash Redis or similar serverless-compatible Redis
- Check firewall/network rules allow connections
Duplicate messages
- The SDK includes deduplication, but ensure Redis is properly configured
- For Slack, both
messageandapp_mentionevents are sent for @mentions (SDK handles this) - For Google Chat, both direct webhooks and Pub/Sub may receive the same message (SDK handles this)