Here’s my attempt at creating a sales funnel using plotly (inspiration from this post). Feel free to provide feedback / improvements / suggestions: beaupre.steven@gmail.com

funnel
           Label      Step Number
1           main awareness 150000
2     ad landing awareness  80000
3      product 1  interest  80000
4      product 2  interest  40000
5      product 3  interest  35000
6      product 4  interest  25000
7  shopping cart    desire 130000
8 thank you page    action 120000
# Data prep
f <- funnel %>%
  select(Step, Label, Number) %>%
  mutate(Id = data.table::rleid(Step)) %>%
  arrange(Id, desc(Label)) %>%
  group_by(Step) %>%
  mutate(Total = sum(Number), 
         RN    = row_number(),
         Cond  = ifelse(n() > 1, 1, 0)) %>%
  ungroup() %>%
  mutate(Dummy = ifelse(RN == 1, (max(Total) - Total) / 2, 0)) %>%
  group_by(Step) %>%
  mutate(Max   = Total + max(Dummy),
         Pos   = ifelse(Cond == 1, 
                        cumsum(Number) - (0.5 * Number) + max(Dummy), 
                        Max - (0.5 * Number)),
         Low   = max(Dummy)) %>%
  ungroup() %>%
  mutate(Rate  = ifelse(Total / lag(Total) < 1, 
                        paste0("      ", formatC(Total / lag(Total) * 100, 
                                                 format = "f", digits = 2), "%"), 
                        NA),
         Text  = ifelse(Cond == 1, 
                        paste0(Label, "<br>", sprintf("%.0f", Number / 1000), "K"), 
                        paste0(sprintf("%.0f", Number / 1000), "K"))) 
f
# A tibble: 8 x 13
       Step          Label Number    Id  Total    RN  Cond Dummy    Max    Pos   Low         Rate
     <fctr>         <fctr>  <dbl> <int>  <dbl> <int> <dbl> <dbl>  <dbl>  <dbl> <dbl>        <chr>
1 awareness           main 150000     1 230000     1     1     0 230000  75000     0         <NA>
2 awareness     ad landing  80000     1 230000     2     1     0 230000 190000     0         <NA>
3  interest      product 4  25000     2 180000     1     1 25000 205000  37500 25000       78.26%
4  interest      product 3  35000     2 180000     2     1     0 205000  67500 25000         <NA>
5  interest      product 2  40000     2 180000     3     1     0 205000 105000 25000         <NA>
6  interest      product 1  80000     2 180000     4     1     0 205000 165000 25000         <NA>
7    desire  shopping cart 130000     3 130000     1     0 50000 180000 115000 50000       72.22%
8    action thank you page 120000     4 120000     1     0 55000 175000 115000 55000       92.31%
# ... with 1 more variables: Text <chr>
# Annotations
anno <- list()
for (i in seq_len(nrow(f))) {
  m <- f[i, ]
  anno[[i]] <- list(
    x = m$Pos,
    y = m$Step,
    text = m$Text,
    showarrow = FALSE,
    arrowhead = 0,
    font = list(color = toRGB("white"), size = 10),
    xanchor = "center")
}
str(anno[1])
List of 1
 $ :List of 7
  ..$ x        : num 75000
  ..$ y        : Factor w/ 4 levels "action","awareness",..: 2
  ..$ text     : chr "main<br>150K"
  ..$ showarrow: logi FALSE
  ..$ arrowhead: num 0
  ..$ font     :List of 2
  .. ..$ color: chr "rgba(255,255,255,1)"
  .. ..$ size : num 10
  ..$ xanchor  : chr "center"
# Plot
f %>%
  plot_ly(x = Dummy, y = Step, 
          type = "bar", 
          orientation = "h", 
          marker = list(color = toRGB("white")),
          showlegend = FALSE) %>% 
  add_trace(x = Number, y = Step, 
            type = "bar",
            color = Label,
            orientation = "h", 
            colors = c("#0D0887", "#3A049A", "#5E01A6", "#7E03A8", 
                       "#9C179E", "#B52F8C", "#CB4679", "#DE5F65"),
            showlegend = FALSE) %>%
  add_trace(x = Low, y = Step, 
            mode = "lines",
            line = list(width = 10, 
                        color = toRGB("grey50"))) %>%
  add_trace(x = 0, y = 0, 
            mode = "markers", 
            fill = 'tonextx', 
            fillcolor = "white", 
            marker = list(color = toRGB("white"))) %>%
  add_trace(x = Max, y = Step, 
            mode = "text+lines", 
            line = list(width = 10, 
                        color = toRGB("grey50")),
            text = Rate, 
            textposition = "middle right",
            textfont = list(size = 10,
                            color = toRGB("blue"))) %>%
  add_trace(x = max(Max), y = 0, 
            mode = "markers", 
            fill = "tonextx", 
            fillcolor = toRGB("white"), 
            marker = list(color = toRGB("white"))) %>%
  layout(yaxis = list(title = "",
                      autorange = "reversed",
                      tickmode  = "array",
                      tickvals  = Step),
         xaxis = list(title = "",
                      zeroline = FALSE,
                      showticklabels = FALSE,
                      showgrid = FALSE),
         barmode = "stack",
         margin = list(l = 150),
         annotations = anno,
         showlegend = FALSE,
         hovermode = FALSE,
         bargap = 0.0000001)
LS0tCnRpdGxlOiAiU2FsZXMgZnVubmVsIHVzaW5nIHBsb3RseSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKSGVyZSdzIG15IGF0dGVtcHQgYXQgY3JlYXRpbmcgYSBzYWxlcyBmdW5uZWwgdXNpbmcgcGxvdGx5IChpbnNwaXJhdGlvbiBmcm9tIHRoaXMgW3Bvc3RdKGh0dHA6Ly9hbmFseXplY29yZS5jb20vMjAxNS8wNi8yMy9zYWxlcy1mdW5uZWwtdmlzdWFsaXphdGlvbi13aXRoLXIvKSkuIEZlZWwgZnJlZSB0byBwcm92aWRlIGZlZWRiYWNrIC8gaW1wcm92ZW1lbnRzIC8gc3VnZ2VzdGlvbnM6IGJlYXVwcmUuc3RldmVuQGdtYWlsLmNvbQoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZHBseXIpCmZ1bm5lbCA8LSBkYXRhLmZyYW1lKExhYmVsID0gYygnbWFpbicsICdhZCBsYW5kaW5nJywKJ3Byb2R1Y3QgMScsICdwcm9kdWN0IDInLCAncHJvZHVjdCAzJywgJ3Byb2R1Y3QgNCcsCidzaG9wcGluZyBjYXJ0JywKJ3RoYW5rIHlvdSBwYWdlJyksClN0ZXAgPSBjKCdhd2FyZW5lc3MnLCAnYXdhcmVuZXNzJywKJ2ludGVyZXN0JywgJ2ludGVyZXN0JywgJ2ludGVyZXN0JywgJ2ludGVyZXN0JywKJ2Rlc2lyZScsCidhY3Rpb24nKSwKTnVtYmVyID0gYygxNTAwMDAsIDgwMDAwLAo4MDAwMCwgNDAwMDAsIDM1MDAwLCAyNTAwMCwKMTMwMDAwLAoxMjAwMDApKQpgYGAKCgpgYGB7ciBEYXRhLCBlY2hvPVRSVUV9CmZ1bm5lbApgYGAKCmBgYHtyIERhdGFQcmVwLCBlY2hvPVRSVUV9CiMgRGF0YSBwcmVwCmYgPC0gZnVubmVsICU+JQogIHNlbGVjdChTdGVwLCBMYWJlbCwgTnVtYmVyKSAlPiUKICBtdXRhdGUoSWQgPSBkYXRhLnRhYmxlOjpybGVpZChTdGVwKSkgJT4lCiAgYXJyYW5nZShJZCwgZGVzYyhMYWJlbCkpICU+JQogIGdyb3VwX2J5KFN0ZXApICU+JQogIG11dGF0ZShUb3RhbCA9IHN1bShOdW1iZXIpLCAKICAgICAgICAgUk4gICAgPSByb3dfbnVtYmVyKCksCiAgICAgICAgIENvbmQgID0gaWZlbHNlKG4oKSA+IDEsIDEsIDApKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKER1bW15ID0gaWZlbHNlKFJOID09IDEsIChtYXgoVG90YWwpIC0gVG90YWwpIC8gMiwgMCkpICU+JQogIGdyb3VwX2J5KFN0ZXApICU+JQogIG11dGF0ZShNYXggICA9IFRvdGFsICsgbWF4KER1bW15KSwKICAgICAgICAgUG9zICAgPSBpZmVsc2UoQ29uZCA9PSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgY3Vtc3VtKE51bWJlcikgLSAoMC41ICogTnVtYmVyKSArIG1heChEdW1teSksIAogICAgICAgICAgICAgICAgICAgICAgICBNYXggLSAoMC41ICogTnVtYmVyKSksCiAgICAgICAgIExvdyAgID0gbWF4KER1bW15KSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShSYXRlICA9IGlmZWxzZShUb3RhbCAvIGxhZyhUb3RhbCkgPCAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCIgICAgICAiLCBmb3JtYXRDKFRvdGFsIC8gbGFnKFRvdGFsKSAqIDEwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgTkEpLAogICAgICAgICBUZXh0ICA9IGlmZWxzZShDb25kID09IDEsIAogICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoTGFiZWwsICI8YnI+Iiwgc3ByaW50ZigiJS4wZiIsIE51bWJlciAvIDEwMDApLCAiSyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKHNwcmludGYoIiUuMGYiLCBOdW1iZXIgLyAxMDAwKSwgIksiKSkpIApmCmBgYAoKYGBge3IgQW5ub3RhdGlvbnMsIGVjaG89VFJVRX0KIyBBbm5vdGF0aW9ucwphbm5vIDwtIGxpc3QoKQpmb3IgKGkgaW4gc2VxX2xlbihucm93KGYpKSkgewogIG0gPC0gZltpLCBdCiAgYW5ub1tbaV1dIDwtIGxpc3QoCiAgICB4ID0gbSRQb3MsCiAgICB5ID0gbSRTdGVwLAogICAgdGV4dCA9IG0kVGV4dCwKICAgIHNob3dhcnJvdyA9IEZBTFNFLAogICAgYXJyb3doZWFkID0gMCwKICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gdG9SR0IoIndoaXRlIiksIHNpemUgPSAxMCksCiAgICB4YW5jaG9yID0gImNlbnRlciIpCn0Kc3RyKGFubm9bMV0pCmBgYAoKYGBge3IgUGxvdCwgZWNobz1UUlVFLCBmaWcud2lkdGg9MTB9CiMgUGxvdApmICU+JQogIHBsb3RfbHkoeCA9IER1bW15LCB5ID0gU3RlcCwgCiAgICAgICAgICB0eXBlID0gImJhciIsIAogICAgICAgICAgb3JpZW50YXRpb24gPSAiaCIsIAogICAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9IHRvUkdCKCJ3aGl0ZSIpKSwKICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgJT4lIAogIGFkZF90cmFjZSh4ID0gTnVtYmVyLCB5ID0gU3RlcCwgCiAgICAgICAgICAgIHR5cGUgPSAiYmFyIiwKICAgICAgICAgICAgY29sb3IgPSBMYWJlbCwKICAgICAgICAgICAgb3JpZW50YXRpb24gPSAiaCIsIAogICAgICAgICAgICBjb2xvcnMgPSBjKCIjMEQwODg3IiwgIiMzQTA0OUEiLCAiIzVFMDFBNiIsICIjN0UwM0E4IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIiM5QzE3OUUiLCAiI0I1MkY4QyIsICIjQ0I0Njc5IiwgIiNERTVGNjUiKSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSAlPiUKICBhZGRfdHJhY2UoeCA9IExvdywgeSA9IFN0ZXAsIAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gdG9SR0IoImdyZXk1MCIpKSkgJT4lCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gMCwgCiAgICAgICAgICAgIG1vZGUgPSAibWFya2VycyIsIAogICAgICAgICAgICBmaWxsID0gJ3RvbmV4dHgnLCAKICAgICAgICAgICAgZmlsbGNvbG9yID0gIndoaXRlIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSB0b1JHQigid2hpdGUiKSkpICU+JQogIGFkZF90cmFjZSh4ID0gTWF4LCB5ID0gU3RlcCwgCiAgICAgICAgICAgIG1vZGUgPSAidGV4dCtsaW5lcyIsIAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB0b1JHQigiZ3JleTUwIikpLAogICAgICAgICAgICB0ZXh0ID0gUmF0ZSwgCiAgICAgICAgICAgIHRleHRwb3NpdGlvbiA9ICJtaWRkbGUgcmlnaHQiLAogICAgICAgICAgICB0ZXh0Zm9udCA9IGxpc3Qoc2l6ZSA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB0b1JHQigiYmx1ZSIpKSkgJT4lCiAgYWRkX3RyYWNlKHggPSBtYXgoTWF4KSwgeSA9IDAsIAogICAgICAgICAgICBtb2RlID0gIm1hcmtlcnMiLCAKICAgICAgICAgICAgZmlsbCA9ICJ0b25leHR4IiwgCiAgICAgICAgICAgIGZpbGxjb2xvciA9IHRvUkdCKCJ3aGl0ZSIpLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9IHRvUkdCKCJ3aGl0ZSIpKSkgJT4lCiAgbGF5b3V0KHlheGlzID0gbGlzdCh0aXRsZSA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgYXV0b3JhbmdlID0gInJldmVyc2VkIiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2ttb2RlICA9ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrdmFscyAgPSBTdGVwKSwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpLAogICAgICAgICBiYXJtb2RlID0gInN0YWNrIiwKICAgICAgICAgbWFyZ2luID0gbGlzdChsID0gMTUwKSwKICAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vLAogICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UsCiAgICAgICAgIGhvdmVybW9kZSA9IEZBTFNFLAogICAgICAgICBiYXJnYXAgPSAwLjAwMDAwMDEpCmBgYAo=