Skip to main content

Blank Source

Learn more about how to set up the blank source for non-native desired integrations and standalone

Written by Bryce DeCora

CloseBot has great CRM integration capabilities, but sometimes flexibility and control can be a game changer. That is why CloseBot also offers a blank canvas Blank source. This doc will break down how to create a Blank source, how to send messages, and what to expect in return!

This Blank source, in addition to the webhook channel setup shown below, can be used standalone with our native chat channels (like our chat widget).

Creating a Blank Source

Start by navigating to your organization’s source page and press “Add New Source”:

Channels

Once you create a source, you can set up the channels. At this time there are two types of channels for your blank source.

  1. Webhook → Integrate with other applications

  2. Chat Widget → CloseBot's built in chat widget

⭐️ Below this section is for developers... if you're not a developer and not looking to tie CloseBot into a non-native integration, stop here 😎

Webhook Channel

Setting up the webhook channel for external app integration requires a webook endpoint URL. This Webhook URL will be the destination CloseBot uses to send all source responses (outbound message responses, contact field updates, etc)

Sending a message to your source

Now that the source is created, we can view the source settings page to find info about how to interact with it (this is on the "Setup" tab in the sources settings page):

Here we have the Access Token and Event Endpoint (both required to interact with the source).

We have two message types currently supported by the webhook endpoint:

Inbound Message

Use this to report an inbound message to CloseBot

curl {YOUR EVENT ENDPOINT} \
-H "Content-Type: application/json" \
-d '{
"accessToken": "{YOUR ACCESS TOKEN}",
"kind": "message",
"contactId": "YOU SET THIS",
"body": "Hello!"
}'

Contact Field Update

Use this to report that a field has changed on your end. Helpful if you're using our Delay Variable action to only continue when a variable is filled out, for example.

curl {YOUR EVENT ENDPOINT} \
-H "Content-Type: application/json" \
-d '{
"accessToken": "{YOUR ACCESS TOKEN}",
"kind": "set-field",
"contactId": "YOU SET THIS",
"field": "contact.first_name",
"value": "Sam"
}'

Receiving Responses

Now that CloseBot received the message, if the source is connected to a job flow correctly, you will get events that look like this sent to your listed webhook retrieval endpoint.

{
"kind": "response-generated",
"timestamp": "2025-08-20T03:47:22.5694637Z",
"data": {
"contactId": "MATCHES WHAT YOU SET",
"messageId": "msg_Q8SQ9ZGZJ0SDKGI9",
"body": "Hey there! I appreciate you reaching out. What should I call you?",
}
}

Carrying State

CloseBot Webhook source now also allows you to send a "state" variable. This will simply return back to you un-edited when the response is generated (as a way for you to hold onto the channel for example)

curl {YOUR EVENT ENDPOINT} \
-H "Content-Type: application/json" \
-d '{
"accessToken": "{YOUR ACCESS TOKEN}",
"kind": "message",
"contactId": "YOU SET THIS",
"body": "Hello!",
"state": "SMS"
}'

{
"kind": "response-generated",
"timestamp": "2025-08-20T03:47:22.5694637Z",
"data": {
"contactId": "MATCHES WHAT YOU SET",
"messageId": "msg_Q8SQ9ZGZJ0SDKGI9",
"body": "Hey there! I appreciate you reaching out. What should I call you?",
"state": "SMS",
}
}

Summary

Put it all together and you now have a fully functional and flexible tool to send messages to your amazing Agents in CloseBot without a CRM connection required. Or, you can use this to do some custom messaging from a CRM to fake a first message for your client. The possibilities are endless!

Did this answer your question?