WEBINAR Series

Slack Hack Your Salesforce - Integrating Slack with Salesforce

Use Salesforce regularly? This webinar recap is for you. Here, Integrate.io's panel of experts explore hot-button Salesforce issues and more.

Slack Hack Your Salesforce - Integrating Slack with Salesforce

In this 30-minute presentation, the CTO of Provar Testing, Richard Clark, discusses the many benefits of integrating Slack with Salesforce and explains how to properly do so. With a step-by-step demo, he provides straightforward and visual guidance for sending Slack messages through Salesforce. The talk is heavily developer-focused, but it’s presented in a manner that allows for simple understanding.

This tutorial delves into many common situations where Slack could improve productivity and communication. Each step builds upon the previous information, and by the end of the discussion, viewers will see the final product created through the process. This allows anyone who wants to integrate these two tools to have their first executable code within half an hour.

The discussion finishes with a Q&A that focuses on additional features, common issues, and security concerns. Any Salesforce user hoping to take communication to the next level in their organization will find this discussion invaluable.

VIEW TRANSCRIPT

Hi, everyone. Welcome to X Force. My name is Richard Clark. I work for a company called Provar Testing.

We're the number one test automation software for Salesforce. And today, I want to talk to you about integrating Slack with your Salesforce, something that we've done for our own company at Profile. So some of the possible use cases you might want to do this, I'm going to talk about first. We're then going to look at the solution overview.

I'll mainly spend the time doing a one take walkthrough on live coding, declarative configuration, and then hopefully testing, and we should see everything working before the end of the talk. All the code examples, the process builder, everything I use is available at the end of the talk. I've got a GitHub project, and I've got a Salesforce DX unlocked package which you can install if you wanna use the examples I showed today, or please write your own. So some of the use cases you might want to consider is at Provo, when we have a a deal won, when we have a new customer signed up or a renewal, we like to notify the whole company. Now the reason we do that is the reality is we don't have all our staff on Salesforce. I know that's shocking, isn't it? But all our developers, most of our QA team, most of our admin team are not on Salesforce.

So what we want to do is make sure that it can share in the success because everyone contributes towards the success of our business. So we like to make sure everyone gets an announcement when we sign a new customer and to know how big it is. We also get benefits from that because our onboarding team know that something's coming in the order pipeline, and our customer success team know there's another customer coming on board, and they recognize the name, the industry, and know how valuable that customer is worth to us. Another area I'm introducing Slack integration at ProVar is around our service cloud as well, so not just sales cloud. And today, the solution I present could be used for any of these use cases. The code I use can be used for any of these.

So I want to make sure that when we have a case, if we're not responding within the SLA for that customer, I want to make sure that we can swarm on that case. It's a common term, case swarming. What that means is I want to draw it to the attention of all our experts in the company so that other people can jump in and get involved and help resolve the issue for the customer before we breach an SLA. Another area that I want to use this, not using it yet, is around approval requests. The demo I'll show you today, I'm gonna do some very simple messages so it's not too complex to follow, but we can do quite rich things with Slack. We can put buttons in, we can put image links, we can put lists, we can put applications that interact with the user. And one of the things that's very commonly templated is approval requests.

So I don't know about you, but I still get people sending me emails for approving holiday requests because we don't have a HRMS system at the moment. That really annoys me. I'd much rather they sent me a Slack message. So from Salesforce, we can have some of those approvals, whether they're holiday requests, whether it's people wanting approval on a discount for a deal, we can actually feed this all through Slack so I can interact there or I can click a link to go back into Salesforce if I want to approve it in Salesforce.

Another area, as I mentioned, not all our staff are on Salesforce. So when we have a chat and post that's quite interesting, I wanna share that to our non Salesforce users as well. So again, I can take that feed post or that feed comment, and I can push that onto a Slack channel. In a similar vein, we have a number of partners, both technical partners and customers who participate in our customer advisory board, and I want to sometimes send information out to them.

Maybe it's details of a new release notes, a new download or product feature, or just a general discussion. And again, we share Slack channels with them, our Slacks are integrated, so I can do that using this solution today as well. And then finally, there is a free Slack AppExchange app. If you're not a developer, the talk is very developer focused today.

If you're not a developer and you want it to a collaborative only solution, then feel free to install the Slack AppExchange app, but it does have a couple of limitations. You are limited on the configuration you can do with the messages it posts and it only works on standard objects. So if you want to use this on a custom object, you'll need to use the solution I present today. So let's look at the solution we're going to see.

So the first thing I'm going to do is I'm going to show you how to configure a Slack webhook in Slack. I just want to stress that when you're following along with this, hopefully you follow along with it, that you don't try and do this in your production company Slack. Alright? You do not want to be sending hundreds of messages to all your staff.

Even in a private channel, do not do this on your company Slack. So configure a new Slack workspace. They're free. The free version works completely with the webhooks.

Okay? Get it working there first before you start hooking it up to your company Slack. The next thing we're gonna do then is we're gonna write some Apex code. You're not gonna see my fingers and thumbs typing away desperately, so I'm going to copy and paste some examples I've already set up.

As I say, the examples are available at the end, including unit tests.

And once we've got our Apex code, the Apex code itself is how to post a Slack message. It doesn't have any business logic in about when to post those Slack messages. And what I like to do is use Invocable Apex to expose that so our admins can choose and reuse that solution. So our admins can choose whether to post a message on a case swarm or on an opportunity big deal alert or any place where they feel there's some value.

They can have the power to do that. So we're gonna use Invokeable Apex part today as well. And so process builder will be our business logic front end. I could equally have used Flow, but process builder's probably a bit easier to follow along with.

So first step is create that new Slack workspace I just talked about. I've already done that, so I'm gonna create a new Slack app, so I'm just gonna click that.

So I'm in my Slack. Hopefully, I'm in my development Slack, my demo one. Let's have a look. Yep. Provide demo. And I give this app a name.

So guess what? I'm gonna call it X Force.

I'm gonna create that app. Doesn't take long. Now I can add some features to that. Now this is the same way you build any app on Slack.

I could do lots of things in here. I could build a bot. I can have a slash commands to query. I just want something very, very simple.

I just want an app that's gonna listen to requests coming in externally, so I need to configure a webhook.

Now I need to activate that.

And now I've activated it. It's expanded below.

First thing we have to do is add an endpoint to listen to and decide what channel we wanna post to. So if I'm having different webhooks going to different channels, I'll have multiple webhooks in here, one for each channel I map to. So let's map our first channel.

So my channel is already created. I could go back and create it now, but I've created one called xforce, which I'm gonna use.

So now that's got access, it's gonna have binding between that.

The other thing that's generated is it's generated a GUID for that webhook URL.

Before I continue, I want to make sure that that is gonna work. I don't wanna go through all the process of writing code only to find out I haven't configured Slack properly.

So I'm gonna copy this curl command, which is nicely formatted for me, and I'm gonna switch over to Visual Studio to my terminal, and let's just expand that.

Just gonna paste that in. So what we should see, this also helps me check if my Slack pop up window is gonna appear on the right screen or not, is we should see that pop. Okay. I heard it go click click, but you haven't seen it on the screen, so let me just open up my Slack. Here we go. Xforce Hello World. So we know that's working.

That's good.

The next thing I want to do is I want to create a new DX project. So we're gonna have a brand new Scratch org. We're have a brand new DX project, so you're gonna see this all happening live, and then we're write some Apex classes.

So going back to my Visual Studio, just move some of these windows out of way.

There we go. And I'm gonna do control shift p, and I'm going to create a new project with manifest. Just use a standard project. Give it a name, x force.

Take the default location, my Slack hack.

Let that run. Okay. So now we've got a brand new Visual Studio Code project. It's got my force ignores. It's got my s f d x project dot json, and the other thing it's got is it's got a config file so that I can spin up a new default org.

Let's do that. Control shift p.

Create a default scratch org. Hopefully, I've got the right dev hub connected. I'll use the same name, x force.

How long to live? I only need it for a day because we won't need it after this session.

All my codes can be backed up with git of course.

Okay, that has failed, let me just check why.

Okay that is the wrong dev hub, let me just change dev hub over.

So I'm just gonna use our company one instead of a Trailhead one.

Okay. And I'll try that command again.

Let's create a default scratch org.

Same details, one day.

Okay. So that's running. The next thing we're gonna do when that finishes is we're gonna create some Apex classes.

Those Apex classes, I'm gonna use InvocaPal Apex, and I'm gonna use a cubable interface. There we are. That org's created now. So let's go and create our first Apex class, and I'm gonna call this one Slack publisher.

And this right default directory, it's created it with a default constructor. I don't really need any of that. I'm gonna replace this with some code I prepared earlier. The first thing I'm going to do is to add the webhook that we just saw in Slack.

I don't need this constructor. I'll get rid of that. So I need to put in my webhook. You'll see this in the GitHub project.

It'll say your webhook here. If you get hold of a version that has an old webhook in, it's not gonna work. It's stale. That project is that channel is dead.

That webhook is dead.

Where do I get that Slack URL from? Well, I'll go back to my Slack API.

It's worth remembering and saving this, but obviously once I've taken a copy and put it in my code, it'll be in my git repository.

So I'm gonna copy that and just replace it in here.

Pretty easy so far. Okay. And next I want to create an inner class. So the inspiration for this talk came from an article by Christoph Konreets back in about twenty sixteen, and in that, he did exactly this.

He integrated Slack with Salesforce. And through that, I actually learned about the Kubo interface. So what we've got here is an inner class with some methods, don't be too scared, and that implements two interfaces. It allows callouts, which I need, and it's Queueable.

So you may be more familiar with sending HTTP requests using future methods.

We're still gonna send a HTTP call out, but by doing it using Queueable, what we're doing is we can send things asynchronously, and we're able to chain requests together if we want to. We've got greater limits of what we can do, and actually, the other thing we can do with the Queueable interface that you can't do with future method is you can actually use an s object or a complex construction of a payload instead of using simple objects such as string, integer, etcetera. So within this queueable Slack call class, interfaces, I've got three parameters, member variables, URL method body. I've

got my constructor where they're set, all fairly basic there. And because I'm using the Qubel interface, I'm implementing the execute interface so that when this job is scheduled, it'll be picked up by the Apex task runner, and it will execute the execute method with that context. And in here is when the magic's happening. We're basically setting the endpoint to the URL that was passed on the constructor, setting the method, I e get post, etcetera, and the payload, the body, which is basically a JSON object.

And at the end, we'll see how you can get to different examples and templates of those JSON objects.

I haven't put any error handling in here. It is very basic. I do apologize. But hopefully, it allows you to see the code a bit clearer.

So that's all I need to do to actually send the message, and I could use this already from, say, an Apex trigger if I wanted to. That would be far too easy, so let's make things more complex. What I'm now gonna do is I'm gonna add another inner class. Now the reason I'm doing that is I have some content I wanna send from declarative from process builder and flow using InvocaPal Apex.

And in order to do that, what I want to do is send that as a message post. So I've just got a simple class here, and in that message post, I've encapsulated an attribute called post text because what we're gonna send today is a very simple message. But if I wanted to send buttons and images and attachments and other things, I'd want to pass more information than just a single string. So I can encapsulate that still within my message post.

You'll see here the invocable variable has got a label of Slack message. So when I'm in Process Builder, we'll see when we're trying to match what we're mapping, it'll say Slack message. That's that label that comes from there.

And then the last part of this class is to add my Invokable Apex class. So I'm just gonna grab that example, and here we go. So as I said, I like Invokable Apex because if I get something working in code with limited unit tests, I can then hand it over to my admins, and they could be responsible when it fails in production.

Obviously, I'm only joking. Of course, I'd help them. So this invocable method, remember, can only have one invocable method per Apex class at the moment at least. So if you have different methods you wanna send, maybe a simple message, maybe you also want to have something that's gonna post, let's say, the approval buttons or you wanna send an image or a list or search results, all those things are possible, you're gonna need to do those in separate classes, so think about that in your design. Again, I've given it a label, so when we look for this method, I can see what the name is, so I understand it's the simple message to Slack rather than a complex message to Slack, of course.

And for simplicity, while in VocaWapex, you typically pass a collection, and in this case, I'm passing a list of message posts, I. That inner class up here containing the post text, I'm only in this example today handling the first one.

Now it'd be very easy to put a loop around this and send multiple queue multiple jobs, and that's why I've used the queue. What you have to think about is user experience. If I deliver something whereby I'm sending ten, twenty messages per hour or minute into a Slack channel, your users are a, gonna complain, b, they're gonna mute that channel, or three, they're gonna leave the channel completely. So you're defeating the whole point of communicating to them in the first place.

So do think and use the Slack post responsibly. I personally have a whole backlog of emails I never read because I get so many, but Slack I keep up to date with. I keep up to date with my phone, I keep up to date on desktop. So it's a valuable resource, do not abuse it.

So I'm gonna take that message post. I'm gonna create a map of strings and objects. The reason I'm doing that is because this is my JSON payload, so I've got the label in the JSON. In this case, the first one's text, and I've got the content, the post text.

If you have other JSON templates you're gonna use, then you'll have more attributes you put into this map. The other strange one I've got into this map is markdown. So markdown's very useful. By setting markdown to true, I can actually do some formatting on that text.

So rather than just send completely plain text, I can add some styling. I can add some new line characters. I can add bold. I can add underscores.

I can add italics. There's lots of things you can do, and it's all documented on the Slack API website link at the end. Now I've got my map. I've got my content, my payload.

All I want to do is basically I use JSON dot serialize so it's I don't have to play with stream manipulation, no curly braces in in trying to map it together here. JSON serialize is your friend. And now I've got that. All I do is queue that job.

So by queuing that job, it will fire asynchronously. I'm passing it that URL at the top, my webhook I've just created. I'm passing it a post, not a get method, of course, and I'm giving it that body, giving that payload which I wanted to process.

I'm gonna save that. Now in theory, that's all I need, and I can push that into my org and I'm gonna do that just to make sure I've not made any typing mistakes at the moment. So I'm just gonna push that into my default scratch org I just created and then I would just wanna quickly talk about the unit test side of this because that's great, it's working in my dev hub, so it's working in my scratch org, but it's no good if I can't deploy it into production. So I'm gonna create two more Apex classes. The first one I need to create is a http mock concrete class. So I'm gonna call that Slack publisher mock.

Again, default directory. Let that open up. Again, it's got a default constructor. This time, I'm just gonna overwrite the whole class with my test class.

So the reason we need this is in a unit test, you can't make HTTP callouts. So if I just write a normal unit test, it's gonna fail. So this is a an implementation of HTTP callout, so I can mock that up. So my unit test will pass. It gives me code coverage, but it's not giving me real end to end testing because we cannot do that with unit tests. I can't stress that enough. Unit testing is not testing, not complete.

And the other class I want is my test class. So again, I'm gonna create a new Apex class and I'm gonna get Slack publisher test and take the defaults.

And just gonna overwrite that one as well. So, again, I'm not using any data in the org. I'm using test setup to create the data I want, an account, a contact, and an opportunity with default amount for thousand of hundred pounds or dollars, stage name prospecting, so the basics I need. And I've got one test method, which is selecting that opportunity for my test data. I'm using test dot set mock to use that mock class so the HTTP callouts will get basically swallowed, but it allows me to actually run unit tests.

And then what I'm doing is updating my opportunity to one million dollars and updating the stage name to close one. So those are two of my use cases that I haven't implemented yet.

Now what I've got here is I've got unit test code that's covering Process Builder. And if you wanna deploy Process Builder's active tray org, then you need to have coverage for them, remember. In this case, I don't just wanna rely on process builder being present for my unit test to pass. If an admin deletes that process, I suddenly don't have my unit test coverage.

So I'm also going to call that a method directly, so I'm going to call my message post, my post to Slack directly in my unit test as well, just to make sure I've got full coverage. And then the next thing I'm gonna do is we have that queueable execution if you recall over here, so the post to Slack. So again, I'm just making sure I've got coverage on the enqueue job. So this is making sure that the queuing mechanism is working as well.

So I just wanna make sure everything is working. Hopefully, I've saved all of those. Just check that. And the next step is for me to push that to the org, those extra test classes.

So fingers crossed on this one.

Okay. I've got a failure in that. Let's have a quick look, see if we can solve that. If not, it's not a problem.

Okay. I just made a bit of a typo in my copy and paste. Let me just fix that.

Extra l in there.

Just make sure there's no others.

Okay. And let's just deploy that again.

Successful. Great. Now if I want to, I'm gonna run my tests. So I'm brave here. Let's refresh. Let's run those tests.

And while they're running, just in the interest of time, I'm gonna flip back to the slides. I'm gonna flip back to Salesforce.

So let's just check that.

So just to recap, we created a new DX project and we created a scratch org, so it was brand new.

In that scratch org, we created some Apex classes. You'll need one, but the three classes are there just to make sure we've got a unit test there as well, and I've just been deploying them to the scratch org. If you don't wanna write the code in the examples at the end, you can install the demo package or clone the GitHub project, and can you get all the content or the classes that I've just shown you. The next step I need to do is adding a Salesforce flow or process builder to invoke that Apex, and this is to say where I hook up that business logic side of things.

So let's just flip back, see how we did. Our unit tests all passed. That's brilliant. That's good news.

We can continue with the next step. What I'm gonna do is open that default org I've just created.

So hopefully this isn't gonna zoom into a giant picture of me, which it did when I practiced it earlier. So brand new scratch org spinning up, hopefully. There we go. And the first thing I'll do is just make sure that my changes are there because I do like to make sure things are deployed first.

If I haven't got my changes in this org, then I won't be able to find them in my process builder.

So we should see three classes.

There we go. All deployed. And let's go to process builder.

Okay. We haven't many processes at the moment, so let's create a new one.

So I'm going to call this opportunity management because obviously I want my processes to be across more than just one functional piece. Remember the limits on workflows applies to processes equally.

All my opportunity management and business automation.

And I'm going to do it when a record changes, and as I say it's about opportunity so I add that as the object, Nothing groundbreaking here that you haven't seen before. I'm gonna make sure it's when it's created or edited. Obviously, it's the edit that I really want. I don't need to make it recursive.

Not yet, at least.

And I'm gonna add my criteria. So these are my business rules. My first business rule is my big deal alert.

And we're gonna do that when the amount is greater than one million or greater or equal to.

And all the conditions are met, and I only want to do this when the change is made. I don't wanna keep sending that message every time someone edits that opportunity, so I wanna make sure that's set.

I'm gonna add a second action here just so you can reuse it, and that action is gonna be an opportunity close one.

So again, I might have some consistent processing, so I'm gonna take my stage name equals close one.

And again, I only want to do it when it becomes close one, not every edit after that point.

Just really important here, make sure your processes evaluate the next criteria or you'll find only the first one is firing.

So I've got my actions, but I haven't actually hooked up any logic. Now the good news is the logic is the same.

I add my action. It's Apex. Seems odd within process builder. And it will say send to Slack.

My Apex class should be found for me, and it should show the method that we created, post simple message to Slack. There we go.

And what I now need to do is just say what is the message I want to send. Slack message, the variable within the invocable apex, and I'm gonna use a simple formula field here. So the formula I build is gonna be basically opportunity include the opportunity name, put some spaces in.

Type name properly.

Big deal load. I'm going to put big deal in bold by using the asterisks. So this was that formatting I was talking about.

And I'm going to also include the amount field.

Obviously, you're free to put whatever you want into these messages. This is just my example.

Amount field is a numeric currency field, so I do want to wrap that in text, otherwise my formula won't validate.

Okay. That's easy.

And then on option three close one, basically do exactly the same thing. Every time I wanna use this invocable Apex, I just do the same thing. And I don't have to change the action name. Action names do not need to be unique, remember.

Post message to Slack, add a row, Slack message, formula, this time I'm going to say opportunity for say the account name if there is one.

And I'm gonna congratulate the salesperson.

One word of warning, when I did this at ProVar, got a lot of feedback that everyone else that helped the salesperson felt like they didn't get enough credit. So I did have to adjust the message. I did have to do something more complex than the answer. Do beware of that one.

And just gonna get their first name.

Okay. So I've got a simple formula field there just saying it's been one.

Save that.

Remember to activate my process or we're not gonna see any results.

And now I guess you guys wanna see this working, do you? This is the nervous bit, so no guarantees. I haven't made any errors here.

I think it's gonna have to go over here.

Yeah. Indeed. Let's go to sales cloud, and let's see.

So I'm gonna create an account.

Let's call it x force.

Probably as much data as most people put in their accounts when they don't have mandatory fields, and let's create a new opportunity as well.

Let's just create it for a hundred dollars to start with, today's close date, X Force demo five, and on the X Force account, stage prospecting. So I'm doing this initially to make sure my triggers don't fire, to make sure my process doesn't fire. I'm desperately scratching my head head to think if I've forgotten anything, and I just remembered what I've forgotten. The other thing I need to do to send that Slack message is I need to add a remote site setting. If I don't do that, Salesforce is gonna block the request.

So remote site settings, there'll be one in there by default, but let's add one to Slack.

Let's call it Slack, and the URL I need is basically the same one, but just the first part, the hooks dot slack dot com.

Okay. I'm glad I remembered that. Okay. Back to our x force demo. And so what I'm gonna do is I'm gonna edit this opportunity, and I'm gonna change the amount to one million.

Actually, I might make it two million because I'm not sure if I put greater than and equals or greater than, so we'll find out. And if all goes well, we'll see a message pop up.

Well, heard the click, but for some reason, I'm not getting my little notifications in the corner. And there we go, big deal alert for two million. Hurrah to me. Let's see if we get the same thing on the closed case.

So hit close, close one, save that.

Again, I got the clicks, don't know if you can hear those but I'm not getting my notifications. Opportunities for xforce close one, well done user, user being the name of the default user in any scratch org unfortunately.

Okay. That is the end of the demo. So we added that Salesforce flow.

Beg your pardon. Let me just present that. We added Slack as a remote site at the last minute. I remembered to do it.

Don't forget to test. Unit testing is insufficient to prove this is working. So your choices for integration testing are either manual testing, like I just did, or end to end automation tools like ProVal, which can hook in both to Salesforce, and, actually, you can look at the Slack web app as well and check the message arrived. So do consider automation tools, please. If you'd like to know more about Provar's Salesforce UI and API test automation capabilities, please visit our website. Otherwise, if you wanna get hold of the project I've used today, please go on my personal GitHub, RClark profile, Slack hack, and you'll get all the examples from today and any other notes and up to date packages, DX packages, unlock packages. There is the Slack, official Slack AppExchange app if you prefer not to do any code.

I've put a Bitly link on the screen there if you want to take a screenshot. It's it's not bad. Do have a play with it. And then if you want to learn more, the original article by Christoph Konrits is on the screen there, and we also have the Trailhead course on Slack development basics, which goes into a lot of good detail about the types of integration you can do with Slack and the different templates. And then finally, the Slack API guide is really, really useful. In the example today, I use this very simple message formatting.

There's something called the Block Kit builder. Don't be scared of it. It's just another form of JSON. And in that, you can select different templates. The great thing about the Block Kit builder and the message formatter is as you make changes, they are reflected in real. So you can see if your changes are working in real time, and you can select different templates to work from your approvals, your agenda builders, onboarding, whatever it is you want to do, you get all these options. It's a really, really useful forum to find examples and to make changes, so I do recommend that.

Last but not least, I'd like to thank you all for coming to X4 Summit and thank the organizers for inviting me to talk. Thank you very much.

Thank you, Richard. That was fascinating.

I wanted to ask a couple questions. The first one was in the example that you've posted on your site there, does that have the error handling in it?

No. That's where the work comes in.

Generally, doesn't go wrong. It's gonna fire on it, it's not gonna fire.

But yeah, we could have done stuff. What I have put in the unit test is the ability to mock up a failure response and mock up as a success once, so you can actually test your error handling when you write it.

Right. I mean, we're not talking about we're we're talking about a nice to have, not a mission critical integration, probably.

Depends on the which People should write the code, but I'm not giving away a solution or responsible for the code when it's shared.

It's purely as a demonstration of what can be done.

Fair enough. Fair enough. And can this coexist if you have the Slack AppExchange app installed? I assume answer is yes.

Yeah. We actually use both. So we have that for some areas where the Slack AppExchange app did exactly what we wanted, and what I've done on the custom solutions, the areas where it didn't deliver on things like our custom objects, or we didn't like the messages it was posting for the reasons I said on the opportunities because the credit wasn't going to the right people or too much information was shared. Always remember when you're posting these messages, you're exceeding the field level security you're sending in your org. So if there is sensitive information, you have to think about who you're sharing that with and the content and the fields that you're sharing as well.

Have you ever tried any kind of integrations from Slack back into Salesforce, like maybe posting some Slacks from a channel into Slack messages into Chatter or something like that?

You can do that. And, actually, the Slack AppExchange app has some that capability where you can run queries from within Slack. So, for example, you can pull up an account. You can do a search or if you're Salesforce.

I'm not sure if you could do any field updates, but, actually, you can do that. And the Slack API documentation has some examples in general, and I think there's some other articles out there that tell you how to do that. But I haven't done that for us because I generally don't want my you have to think about the the permission of the user who's making that call, and you're exposing it, again, exposing potentially too much data. So do remember your data security and the profile that you're using to make that connection will have their permissions.

Great. Great. Well, thanks again for presenting today. Interesting very interesting and could be very useful example of Apex Plus Process Builder. Thank you so much.

Thank you. Bye bye.