I think my tweet speaks for itself:

The goal of this article is to document how to send #rstats code and plots directly to Slack.

Load packages


Slack credentials

Member ID

You can easily grab that from this guide here.

Slack Key ID

To retrieve your Slack key ID, login here and then follow the prompts.

API token & webhook

Last but not least, we can now use our newfound credentials and insert them into the following URL:


The end result should provide the last pieces of our puzzle for the API token, webhook and the assigned channel for the Slack key ID.


slackrSetup(channel = "#thinktank",
            incoming_webhook_url = "https://hooks.slack.com/services/0123456789",
            api_token = "ABCDEFGHIJKLMNOPQRSTUVWXYZ")

Interacting from R

We’re now ready for a toast test:

slackr("toast test from R")

Even though we selected a specific channel we can easily switch to a different one without going through the entire process again:

slackr("toast test from R", channel = "#warroom")

Sending a plot

Let’s try to recreate a plot I saw awhile back on SEO twitter.


technical <- tibble(website_size = seq(0, 100, 1),
                    importance = seq(0, 100, 1)) %>% 
  mutate(segment = "technical")

content <- tibble(website_size = rev(seq(0, 100, 1)),
                  importance = seq(0, 100, 1)) %>% 
  mutate(segment = "content")

df <- rbind(technical, content)

p <- df %>% 
  ggplot(aes(website_size, importance, color = segment)) +
  geom_point() +
  geom_line() +
  labs(color = NULL) +
  theme_light() +
  theme(legend.position = 'top')

Making sure the plot does what we want…


…and then beam it up over to Slack:


Too. Easy.


Nearly 85% of my work communications (internal & client-facing) is completed in Slack so I can think of a few “real world” use cases for this:

  • Automated daily, weekly, monthly reporting
  • Incorporate analyses & insights then publish results directly to Slack
  • Ping the appropriate channels when performance surpasses a statistical threshold
  • Sharing code or final data output without jumping through hoops