Zulip n8n integrationAutomate Zulip with n8n.
Every Zulip message a workflow has to send can leave n8n instead of a person. The Zulip n8n integration groups 16 operations over 3 resources: messages, streams and users. No Zulip trigger exists, so a Schedule or Webhook node opens the run. Written for teams that run Zulip in house.
Verified Trustpilot reviews · AI, automation & growth agency
What does the Zulip n8n integration actually do?
The Zulip node is the app node n8n ships for Zulip, and it talks to the Zulip API with your organization URL, a login email and an API key. It covers three resources: messages, streams and users. Anything a workflow posts, reads, edits or deletes in Zulip goes through one of its 16 operations, and the same credential serves every workflow on your instance.
Start with the notice nobody wants to write by hand. A monitoring workflow catches a failed job, formats one line, and message.sendStream drops it in the right stream and topic. The same shape carries a daily summary pulled from Google Sheets, or an alert relayed from Gmail when a specific sender writes in.
Onboarding is the second obvious one. When a new hire lands in the HR sheet, user.create opens the account with an email, a full name and a password, stream.create subscribes the person to the team streams, and user.update sets the role. The day someone leaves, user.deactivate closes the account from the same workflow.
Third comes cleanup and correction. stream.getAll lists what exists, message.update fixes a post that went out with the wrong figure, and message.delete clears a stale bot notice. Teams that mirror announcements elsewhere send the same payload to Slack or Telegram right after the Zulip node.
The node stops at those 16 operations. Anything outside message, stream and user management goes through the HTTP Request node, which calls any endpoint of the Zulip API and reuses the same credential through predefined authentication.
Two limits are worth knowing before you build. There is no Zulip trigger node, so nothing in n8n reacts on its own when a message arrives; a Schedule Trigger at a fixed interval, or an n8n Webhook, which is a URL another service calls, starts the workflow instead. And the operations that target an existing stream, message or account expect an identifier, not a name, so a lookup step often comes first. How the node sits next to the rest of the catalog is covered in the n8n review.
How do you connect Zulip to n8n?
- 01
Get the API key in Zulip
Open your Zulip organization and go to the Gear cog, then Personal Settings, then Account and privacy, then API Key. The key belongs to the account you are logged in with, so decide first whether the automation should post under a person or under a dedicated account, because that choice shows on every message the workflow sends and defines what it is allowed to do.
- 02
Create the credential in n8n
In n8n, open Credentials and add a Zulip credential. Three values are asked for: URL, the address of your Zulip domain, Email, the address used to log in to Zulip, and API Key, the value copied in the previous step. Save once, and the credential is available to every workflow on the instance.
- 03
Pick it in the node and test
Drop a Zulip node in the workflow and choose the credential in its dropdown. There is no authentication selector to set, so the next choice is the resource, Message, Stream or User, then the operation. Get subscribed streams is a good first run: it needs no parameter and returns a list, which confirms the URL, the email and the key line up.
The 16 operations of the Zulip node, one by one
The Zulip node exposes 16 operations across 3 resources. For each one: the node as you configure it in n8n, the required fields, and our field notes.
| Resource | Create | Get | Get Many | Update | Delete | Deactivate | Get Subscribed | Send Private | Send to Stream | Upload a File |
|---|---|---|---|---|---|---|---|---|---|---|
| Message | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||
| Stream | ✓ | ✓ | ✓ | ✓ | ✓ | |||||
| User | ✓ | ✓ | ✓ | ✓ | ✓ |
Operations index
Message
6 operationsDelete a message
message.deleteWhat you see in n8n
Notes & use cases
Removes one message from Zulip for good, in a stream or in a private conversation. Zulip works from the numeric identifier of the message, never from its text.
Key parameters
- Message ID: the unique identifier of the message, usually carried over from a Get a message step or from the node that posted it, through an expression such as
{{ $json.id }}.
Get a message
message.getWhat you see in n8n
Notes & use cases
Pulls a single message back into the workflow so the branch that follows can read its content instead of guessing it.
Key parameters
- Message ID: the unique identifier of the message; it comes from a spreadsheet column, a form field or an earlier node, passed as
{{ $json.messageId }}.
Send a private message
message.sendPrivateWhat you see in n8n
Notes & use cases
Delivers a direct message to one person or to a handful of them, without anything appearing in a stream.
Key parameters
- To: the recipients, picked from the list in the node or given as a comma separated list of usernames (emails); an expression works when the address comes from a previous step.
- Content: the body of the message, written the way it should appear in Zulip.
Send a message to a stream
message.sendStreamWhat you see in n8n
Notes & use cases
Posts a message in a stream, under a topic. Most Zulip workflows end on this operation.
Key parameters
- Stream Name or ID: the destination stream, chosen from the node list or given as an ID through an expression.
- Topic Name or ID: the topic the message lands under, which Zulip only uses for stream messages.
- Content: the text itself, often assembled in a Set node just before.
Update a message
message.updateWhat you see in n8n
Notes & use cases
Edits a message already published, its text, its topic, or both, without deleting it and posting again.
Key parameters
- Message ID: the message to edit.
- Content: the replacement text, set in Update Fields.
- Topic: the new topic, which Zulip only accepts on stream messages.
- Propagate Mode:
changeOnetouches that message only,changeLateralso moves the ones sent after it in the same topic,changeAlltakes them all.
Upload a file
message.updateFileWhat you see in n8n
Notes & use cases
Sends a file carried by the workflow up to Zulip. The file arrives as binary data from the node before, a download, an export or a generated document.
Key parameters
- Put Output File in Field: the name of the binary field that carries the file, matching whatever the previous node used for its binary output.
Stream
5 operationsCreate a stream
stream.createWhat you see in n8n
Notes & use cases
Opens one or more streams and subscribes accounts to them in a single call, which is why the node asks for a list rather than one name.
Key parameters
- Subscriptions: the streams to subscribe to, each with a Name and a Description; a stream that does not exist yet is created.
- Invite Only: keeps the stream private, while History Public to Subscribers decides whether newcomers can read what was said before they joined.
- Principals: the email addresses to subscribe; left empty, only the account behind the credential is subscribed.
Delete a stream
stream.deleteWhat you see in n8n
Notes & use cases
Takes a stream out of the organization, together with the topics it held.
Key parameters
- Stream ID: the identifier of the stream to delete, a number and not its name, which a Get many streams step provides through an expression.
Get many streams
stream.getAllWhat you see in n8n
Notes & use cases
Lists the streams of the organization. The Additional Fields decide how wide that list goes, so the same operation answers two very different questions.
Key parameters
- Include Public: adds every public stream of the organization.
- Include Subscribed: adds the streams the account follows.
- Include Default: adds the default streams of the realm; Include All Active adds all active ones and needs administrative privileges.
- Include Owner Subscribed: for a bot account, adds the streams its owner follows.
Get subscribed streams
stream.getSubscribedWhat you see in n8n
Notes & use cases
Returns only the streams the connected account follows. Shorter list, and the one most workflows actually need.
Key parameters
- Include Subscribers: adds a subscribers field to each stream returned, holding the user IDs of everyone subscribed to it.
Update a stream
stream.updateWhat you see in n8n
Notes & use cases
Changes the settings of an existing stream: its name, its description, its privacy and who is allowed to post in it.
Key parameters
- Stream ID: the stream to update.
- New Name and Description: the new label and the line shown under it.
- Is Private and History Public to Subscribers: close the stream, and decide what its new subscribers can read.
- Stream Post Policy:
1lets any user post,2only administrators,3only new members. Announcement Only limits the stream to announcements.
User
5 operationsCreate a user
user.createWhat you see in n8n
Notes & use cases
Opens an account in the Zulip organization. All four fields are required, so the workflow has to hold them before the node runs.
Key parameters
- Email: the address of the new user, in the
name@email.comform. - Full Name: the name shown to the rest of the organization.
- Short Name: a short name that stays invisible to other users.
- Password: the password of the new account, better passed through an expression than typed in the node.
Deactivate a user
user.deactivateWhat you see in n8n
Notes & use cases
Deactivates an account so the person can no longer log in to the organization.
Key parameters
- User ID: the identifier of the user to deactivate, a number that a Get many users step hands over through an expression.
Get a user
user.getWhat you see in n8n
Notes & use cases
Reads one account and returns its profile, which is how a workflow turns an identifier into a usable name or email.
Key parameters
- User ID: the identifier of the account to read.
- Custom Profile Fields: includes the custom profile field data in the response, such as the team or the job title your administrator added.
- Client Gravatar: when on, the avatar URL comes back only for a real Zulip avatar and stays null for accounts using gravatar.
Get many users
user.getAllWhat you see in n8n
Notes & use cases
Brings back the member list of the organization in one run, each account with its profile.
Key parameters
- Custom Profile Fields: adds the custom profile data to every account returned, useful when the team or the department lives in those fields.
- Client Gravatar: same rule as on the single lookup, the avatar URL is returned only for Zulip avatars.
Update a user
user.updateWhat you see in n8n
Notes & use cases
Changes an account that already exists: its name, its permissions, or the custom fields of its profile.
Key parameters
- User ID: the account to update.
- Full Name: the name shown in Zulip.
- Role:
100owner,200organization administrator,300moderator,400member,600guest. - Is Admin and Is Guest: the two switches that mark the account as administrator or as guest.
- Profile Data: the custom profile field data to update.
Need help automating Zulip with n8n?
A person reads every message.