Migrating from Slack to Google Chat: Rethinking Webhooks and Custom Workflows
At Halodoc, internal communication plays a critical role in how we collaborate, monitor systems and automate workflows. For several years, Slack served as our central hub powering not just conversations, but also countless webhook-driven notifications, custom alerts and internal workflows. However, as our technology ecosystem evolved, we made a strategic decision to migrate from slack to google chat.
In this blog, we'll walk you through the journey we took at Halodoc as we migrated from Slack to Google Chat - focusing on how we rebuilt essential webhook integrations and redesigned the custom workflows that our engineering, operations and business teams relied on every day.
Why We Migrated and the Benefits for Halodoc
- Cost Optimisation: Since we were already using google workspace, moving to google chat allowed us to consolidate communication tools without incurring additional costs.
- Security and Compliance: Google Chat offered better alignment with our company’s security and compliance requirements, benefiting from centralised management through Workspace Admin tools.
- Better Integration: With deeper native integrations into google services like calendar, meet and drive, chat allowed us to create a more seamless and productive environment.
Transitioning Webhooks
As part of our company's migration from Slack to Google Chat, one critical area we needed to rethink was how we handle webhooks and automated alerts.
Webhooks are a backbone for many of our automated systems, pushing real-time notifications from services like jenkins, new relic and others into our team's collaboration channels. While slack offered a flexible webhook system, google chat has a different approach. It simplifies certain aspects but also introduces more restrictions in how messages are structured and delivered.
Webhooks in Slack vs. Google Chat: A Comparison
We made use of webhooks to automate:
- Build notifications from Jenkins.
- Alerts from New Relic.
- Infrastructure monitoring updates.
- Deployments/ Release announcements.
Slack’s webhook system was powerful and easy to integrate. A single webhook URL could dynamically target different channels via the message payload, allowing one webhook to serve multiple channels. Messages support rich formatting, attachments, buttons, emojis, threaded replies and even direct file uploads. For example, Jenkins could send build logs along with success or failure messages, making collaboration and troubleshooting quick and collaborative.
In contrast, Google Chat webhooks are tied to a specific Space and support more limited message formats. While basic text messages are supported via POST requests, richer layouts require building structured Cards. Unlike slack, google chat doesn’t support direct file uploads in webhook payloads.
Handling Attachments in Google Chat
Uploading Files to S3 and Sharing Link
The straightforward solution was to upload any build logs, reports, or artifacts to an Amazon S3 bucket (or any public file hosting service) and share the file link inside the chat message. This method is simple and avoids any need for google API authentication. While it works well, this approach meant that users had to click the link to view or download the file, rather than being able to preview or access it directly within the chat window.
Uploading Attachments Using Google APIs
To provide a richer experience, we also built a solution using the google chat API directly, allowing users to see attachments inline along with the message inside the chat Space, without needing to click external links. For this, we authenticated using Google OAuth2 credentials and called the chat API to upload files and send messages programmatically.
High-level explanation of how we implemented this:
The process starts with secure OAuth2 authentication, where the system uses pre-authorized google workspace credentials to obtain access tokens. These tokens allow it to send messages and upload files to google chat Spaces. Token expiration is handled automatically to ensure uninterrupted operation.
Once a file is submitted, the system attaches metadata (filename, content type) and uploads it securely to google’s servers via an authenticated, HTTPS-encrypted API call. Google returns a unique file reference identifier.
The system then builds a message that includes both content and the file reference. This enables google chat to display the attachment inline, allowing users to view or download it directly from the chat, creating a seamless and in-context experience.

Custom Workflows in Google Chat
Slack offers a seamless and user-friendly Workflow Builder that lets users automate tasks through a visual, no-code interface. Triggers, input modals and external integrations can be set up with just a few clicks, making it easy to streamline repetitive tasks and standardize actions within Slack.
In contrast, google chat lacks a built-in workflow tool. Creating custom workflows requires a developer-driven approach, where each step must be explicitly designed and integrated. While this allows for greater flexibility and deeper customization, it also adds complexity and demands more technical effort.
Challenges Faced During Migration
Migrating custom workflows from Slack to Google Chat introduced several interesting technical challenges, largely due to the difference in how each platform handles workflow automation and extensibility.
One of the first hurdles was implementing user mentions in messages. In slack, mentioning a user is straightforward using their email or username. In google chat, however, a user must be referenced using their unique user ID. To retrieve this, we had to integrate with the Google Admin Directory API and set up advanced services in Apps Script. This added a dependency and required explicit handling in code to resolve email addresses to user IDs before including them in messages.
Another challenge was preserving message threading behavior. In slack, replies automatically maintain context within a thread. For google chat, we needed to manage this explicitly using threadKey to ensure follow-up messages appeared correctly within the original message thread, especially for approval workflows
Finally, enabling interactive buttons to trigger follow-up actions such as approvals or rejections required a more hands-on approach. When a button is clicked in google chat, it sends a callback payload to a webhook. We had to implement additional logic to parse the payload, determine the context, and send an appropriate response message. While this gave us flexibility in designing dynamic interactions, it also introduced more development overhead compared to slack’s built-in event handling.
Our Approach of Building Custom Workflows in Google Chat
As google chat lacks a native workflow builder like slack, we had to engineer our own flexible system to support various team needs. Among the many custom workflows we implemented, one of the most frequently used involved collecting structured user input, processing it, posting it to the right Chat space for any approval or further action.
To make this work seamlessly, we adopted a modular architecture using google services. Users submit input via an appsheet form, which logs entries into a google spreadsheet. Each new row triggers a google app script that acts as the backend, orchestrating the workflow.
app script validates and enriches the data, then sends a message with context and links to the correct chat space via webhook. Submissions are also logged in the spreadsheet, creating a persistent, searchable history for audits, compliance, or tracking.
This setup offers strong flexibility and seamless integration with google workspace, allowing us to tailor workflows to specific business needs.
Behind the Scenes: Engineering a Native-Like Workflow Experience
While the individual components—appsheet, google sheets and appscript are common google tools, the engineering challenge was in orchestrating them to feel like a native workflow builder. We focused on building a generalised workflow engine behind the scenes: a trigger-listener pattern based on spreadsheet changes, dynamic message routing based on workflow type and a reusable messaging framework that could format and send interactive cards to any chat space.
We also built utility modules to abstract repetitive tasks like user mention resolution using the Admin Directory API, thread key management for maintaining context, and standardised message templates. This allowed us to plug in new workflows like approvals, submissions or escalations without rewriting the core logic.
By designing this system with extensibility and modularity in mind, we created a developer-friendly framework that replicates many of the capabilities of slack’s workflow builder, operating behind the scenes and customised specifically for google chat.

For scheduled/recurring workflows, such as daily standup updates, scheduled automation can be set up using appscript, Appsheet or third-party apps like Daily Bot. There are also a lot of other third-party apps available in google chat for different use-cases that can be used for day-to-day automations.
Conclusion
As part of our transition from slack to google chat, we had to reimagine and redesign how we handle internal automation. Unlike slack's plug-and-play workflow builder, google chat required us to adopt a more developer-led strategy. While this shift initially introduced complexity, it also offered us the opportunity to design modular and flexible solutions that integrate deeply with the google workspace ecosystem. Using webhooks, google appscript, spreadsheets and appsheet, we were able to rebuild many of our essential workflows in a scalable and maintainable way.
For teams considering a similar migration, it’s essential to go beyond a one-to-one feature comparison and instead understand how the two platforms differ in philosophy. Slack prioritises flexibility and user-driven automation, while google chat leans on structured components and tighter integration within the google workspace ecosystem. This means some workflows may require rethinking rather than direct migration.
Though the shift can initially seem complex, it opens the door to building automation that is more maintainable and scalable in the long run. With thoughtful planning, the transition becomes not just a workaround, but a chance to modernise internal processes and align more closely with your broader tech stack.
References
https://developers.google.com/workspace/chat/upload-media-attachments
https://cloud.google.com/workflows/docs/write-to-google-sheets
https://medium.com/@python-javascript-php-html-css/integrating-google-chat-with-webhooks-for-direct-messaging-bd746556a6e6
Join Us
Scalability, reliability and maintainability are the three pillars that govern what we build at Halodoc Tech. We are actively looking for engineers at all levels and if solving hard problems with challenging requirements is your forte, please reach out to us with your resumé at careers.india@halodoc.com.
About Halodoc
Halodoc is the number one all-around healthcare application in Indonesia. Our mission is to simplify and deliver quality healthcare across Indonesia, from Sabang to Merauke. Since 2016, Halodoc has been improving health literacy in Indonesia by providing user-friendly healthcare communication, education, and information (KIE). In parallel, our ecosystem has expanded to offer a range of services that facilitate convenient access to healthcare, starting with Homecare by Halodoc as a preventive care feature that allows users to conduct health tests privately and securely from the comfort of their homes; My Insurance, which allows users to access the benefits of cashless outpatient services in a more seamless way; Chat with Doctor, which allows users to consult with over 20,000 licensed physicians via chat, video or voice call; and Health Store features that allow users to purchase medicines, supplements and various health products from our network of over 4,900 trusted partner pharmacies. To deliver holistic health solutions in a fully digital way, Halodoc offers Digital Clinic services including Haloskin, a trusted dermatology care platform guided by experienced dermatologists.We are proud to be trusted by global and regional investors, including the Bill & Melinda Gates Foundation, Singtel, UOB Ventures, Allianz, GoJek, Astra, Temasek, and many more. With over USD 100 million raised to date, including our recent Series D, our team is committed to building the best personalized healthcare solutions — and we remain steadfast in our journey to simplify healthcare for all Indonesians.