Michael AI Notes Article

Load/Prep Data

Here is now I’m classifying the tools, please let me know if there are any corrections required:

  • Generic

    • Fathom
    • FieldKo
    • Fieldnote.ai
    • Fireflies
    • Otter
    • Sembly
    • Supernormal
    • tldv
    • Zoom
  • Industry

    • Finmate AI
    • Jump
    • Vega
    • Zeplyn
    • Zocks
  • Unable to classify

    • Other

    • Unsure

Show the code
library(tidyverse)
setwd('~/Downloads')
prod <- read.csv('profiles.csv')

prod <- prod %>% 
  mutate(swai3 = case_when(swai == 'No' ~ 'No',
                           (swaifathom == 1 | swaifieldko == 1 | swaifilenote == 1 | 
                           swaifireflies == 1 | swaiotter == 1 | swaisembly == 1 |
                             swaisupernormal == 1 | swaitldv == 1 | swaizoom == 1) & 
                             (is.na(swaifinmate) & is.na(swaijump) & is.na(swaivega) &
                             is.na(swaizeplyn) & is.na(swaizocks)) ~ 'Generic',
                           
                           swaifinmate == 1 | swaijump == 1 | swaivega == 1 |
                             swaizeplyn == 1 | swaizocks == 1 ~ 'Industry',
                           
                           swaioth == 1 | swaiunsure == 1 ~ 'Unable to Classify'),
        swai3 = factor(swai3, 
                       levels = c('No', 'Generic', 'Industry', 'Unable to Classify')) )

Some descriptive stats to help you set the stage

Show the code
prod %>% 
  drop_na(swai3) %>%
  count(swai3) %>% 
  mutate(pct = prop.table(n),
         label = scales::percent(pct, accuracy = 0.1)) %>%  
  ggplot(aes(x = "", y = pct, fill = swai3)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") +
  theme_void() +
  labs(fill = "swai3", title = "Use of AI Meeting Notes Tools") +
  theme(legend.position = "right") +
  geom_text(aes(label = label), 
            position = position_stack(vjust = 0.5), 
            size = 3)  

At this point, you’ll probably want to follow up with Figure 4.45 and Figure 4.46 in the study and note that while generic tools are more widely adopted, the most highly rated tool is an industry solution (Jump)

Time Allocation by Use of AI Notes and Clients Per Advisor

Note

Please note that while you asked me to examine both time spent doing meeting preparation AND client service, the results for the latter were consistently inconsistent and super messy. There is no story there. So I’m focusing on meeting preparation where, as you’ll see, we do get a cool story, although it diverges a bit from what we’d expect.

Because in the report we only found that the impact of AI notes was visible when looking at advisors with established client bases, I’m segmenting this by clients x advisor.

  • When you have 50+ clients per advisor, you do spend less time on meeting preparation, but this is only when using generic tools!

  • When you have <50 clients per advisor, there is a minuscule lift when using generic tools, but spend MORE time when using industry tools. In practice, this may be because the sample is smaller for the <50 groups.

MY RECOMMENDATION: For your article, I’d just show the right-hand graphic, but you can just briefly note that you restrict your sample to advisors with enough clients to actually have a good about of meeting preparation to be reduced in the first place.

Show the code
prod %>% 
  filter(swai3 != '',
         swai3 != 'Unable to Classify') %>% 
  mutate(clxadv2 = ifelse(clxadv >= 50, 
                          '50+ Clients Per Advisor', 
                          '<50 Clients Per Advisor')) %>%
  drop_na(swai3, clxadv2) %>%
  group_by(clxadv2, swai3) %>% 
  summarize(`Meeting Preparation` = mean(hrshrprep, na.rm = TRUE)) %>% 
  mutate(useai = ifelse(swai3 == 'No', 'No', 'Yes')) %>% 
  ggplot(aes(x = factor(swai3, levels = c('No', 'Industry', 'Generic')), 
             y = `Meeting Preparation`,
             fill = useai)) +
  geom_col(color = 'black') +
  geom_text(aes(label = scales::percent(`Meeting Preparation`, accuracy = 0.1)), 
            vjust = -0.5, size = 5) +  # Add labels above bars
  facet_wrap(~clxadv2) +
  labs(x = 'Use of AI Notes', 
       y = 'Share of Workweek Preparing for Client Meetings') +
  scale_y_continuous(labels = scales::percent,
                     limits = c(0, .15)) +
  theme_minimal()
`summarise()` has grouped output by 'clxadv2'. You can override using the
`.groups` argument.

Time Allocation by Use of AI Notes and Practice Structure (50+ clients/advisor)

While here you asked for “unsupported solos versus all others,” I’m including all four structures here because, as you’ll see, that is where most of the lift is. I’m presenting two versions of this chart.

  1. Breaking out AI notes between industry and generic
  2. Grouping all use of AI notes together

#1 is cool, but we get a funky number for unsupported solos for “industry tools.”

Show the code
prod %>% 
  filter(swai3 != '',
         clxadv >= 50,
         swai3 != 'Unable to Classify'
        ) %>% 
  drop_na(swai3, pstructure) %>%
  group_by(pstructure, swai3) %>% 
  summarize(`Meeting Preparation` = mean(hrshrprep, na.rm = TRUE)) %>% 
  mutate(useai = ifelse(swai3 == 'No', 'No', 'Yes')) %>% 
  ggplot(aes(x = factor(swai3, levels = c('No', 'Industry', 'Generic')), 
             y = `Meeting Preparation`,
             fill = useai)) +
  geom_col(color = 'black') +
  geom_text(aes(label = scales::percent(`Meeting Preparation`, accuracy = 0.1)), 
            vjust = -0.5, size = 5) +  # Add labels above bars
  facet_wrap(~clxadv2) +
  labs(x = 'Use of AI Notes', 
       y = 'Share of Workweek Preparing for Client Meetings') +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal() +
  facet_wrap(~pstructure)

Show the code
prod %>% 
  filter(swai != '',
         clxadv >= 50) %>% 
  drop_na(swai, pstructure) %>%
  group_by(pstructure, swai) %>% 
  summarize(`Meeting Preparation` = mean(hrshrprep, na.rm = TRUE)) %>% 
  ggplot(aes(x = factor(swai), 
             y = `Meeting Preparation`,
             fill = swai)) +
  geom_col(color = 'black') +
  geom_text(aes(label = scales::percent(`Meeting Preparation`, accuracy = 0.1)), 
            vjust = -0.5, size = 5) +  
  facet_wrap(~clxadv2) +
  labs(x = 'Use of AI Notes', 
       y = 'Share of Workweek Preparing for Client Meetings') +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal() +
  facet_wrap(~pstructure)

Revenue Per Advisor By Use of AI Meeting Notes (50+ Clients/Advisor)

Show the code
prod %>% 
  filter(clxadv >= 50,
         swai3 != 'Unable to Classify') %>%
  mutate(pstructure3 = ifelse(pstructure %in% c('Silo', 'Ensemble'),
                              'Silo/Ensemble', pstructure)) %>%
  drop_na(swai3) %>%
  group_by(pstructure3, swai3) %>% 
  summarize(`Revenue Per Advisor` = median(rvxadv, na.rm = T))
`summarise()` has grouped output by 'pstructure3'. You can override using the
`.groups` argument.
# A tibble: 9 × 3
# Groups:   pstructure3 [3]
  pstructure3      swai3    `Revenue Per Advisor`
  <chr>            <fct>                    <dbl>
1 Silo/Ensemble    No                     723810.
2 Silo/Ensemble    Generic                681121.
3 Silo/Ensemble    Industry               875000 
4 Supported Solo   No                     600000 
5 Supported Solo   Generic                462500 
6 Supported Solo   Industry               597727.
7 Unsupported Solo No                     300000 
8 Unsupported Solo Generic                335000 
9 Unsupported Solo Industry               225000 
Show the code
prod %>% 
  filter(clxadv >= 50,
         swai != '') %>%
  mutate(pstructure3 = ifelse(pstructure %in% c('Silo', 'Ensemble'),
                              'Silo/Ensemble', pstructure)) %>%
  drop_na(swai) %>%
  group_by(pstructure3, swai) %>% 
  summarize(`Revenue Per Advisor` = median(rvxadv, na.rm = T))
`summarise()` has grouped output by 'pstructure3'. You can override using the
`.groups` argument.
# A tibble: 6 × 3
# Groups:   pstructure3 [3]
  pstructure3      swai  `Revenue Per Advisor`
  <chr>            <chr>                 <dbl>
1 Silo/Ensemble    No                  723810.
2 Silo/Ensemble    Yes                 775000 
3 Supported Solo   No                  600000 
4 Supported Solo   Yes                 600000 
5 Unsupported Solo No                  300000 
6 Unsupported Solo Yes                 320000