Lessons from Building The World’s Largest Social Music Platform

Matthew Ogle & Anil Bawa Cavia FoWA 2007

How does it work?

How does it work?
Listen
- to your own music - to Last.fm radio

How does it work?
Listen
- to your own music - to Last.fm radio

Share
-your taste instead of files - automatic, via “scrobbling”

How does it work?
Listen
- to your own music - to Last.fm radio

Discover
- via your friends - via people with similar taste

Share
-your taste instead of files - automatic, via “scrobbling”

How does it work?
Listen
- to your own music - to Last.fm radio

Discover
- via your friends - via people with similar taste

Share
-your taste instead of files - automatic, via “scrobbling”

15 million tracks scrobbled / day

15 million tracks scrobbled / day (175 scrobbles per second)

15 million tracks scrobbled / day (175 scrobbles per second) Over 6 billion tracks scrobbled since 2003

15 million tracks scrobbled / day (175 scrobbles per second) Over 6 billion tracks scrobbled since 2003 10 million artists

15 million tracks scrobbled / day (175 scrobbles per second) Over 6 billion tracks scrobbled since 2003 10 million artists 70 million tracks

15 million tracks scrobbled / day (175 scrobbles per second) Over 6 billion tracks scrobbled since 2003 10 million artists 70 million tracks 700k tracks streamable on Last.fm radio

15 million tracks scrobbled / day (175 scrobbles per second) Over 6 billion tracks scrobbled since 2003 10 million artists 70 million tracks 700k tracks streamable on Last.fm radio 17 million items tagged

15 million tracks scrobbled / day (175 scrobbles per second) Over 6 billion tracks scrobbled since 2003 10 million artists 70 million tracks 700k tracks streamable on Last.fm radio 17 million items tagged 145k artist wikis

Last.fm World Domination Headquarters Whitechapel, London, 2004

Early Growth Lessons

Early Growth Lessons
Don’t overextend – scale with your growth, not before

Early Growth Lessons
Don’t overextend – scale with your growth, not before Make sure revenue sources scale with increased usage

Early Growth Lessons
Don’t overextend – scale with your growth, not before Make sure revenue sources scale with increased usage
Google ads

Early Growth Lessons
Don’t overextend – scale with your growth, not before Make sure revenue sources scale with increased usage
Google ads User subscriptions

Early Growth Lessons
Don’t overextend – scale with your growth, not before Make sure revenue sources scale with increased usage
Google ads User subscriptions

Involve users in your web application’s story

Early Growth Lessons
Don’t overextend – scale with your growth, not before Make sure revenue sources scale with increased usage
Google ads User subscriptions

Involve users in your web application’s story
Make growth a selfish aim for existing users

Early Growth Lessons
Don’t overextend – scale with your growth, not before Make sure revenue sources scale with increased usage
Google ads User subscriptions

Involve users in your web application’s story
Make growth a selfish aim for existing users Be as open as you can afford

Audioscrobbler.com homepage, late 2004

Openness and Growth

Openness and Growth
In 2004, we had a cool service, but needed data

Openness and Growth
In 2004, we had a cool service, but needed data Audioscrobbler Protocol 1.0

Openness and Growth
In 2004, we had a cool service, but needed data Audioscrobbler Protocol 1.0 Webservices for accessing users’ music profile data

Openness and Growth
In 2004, we had a cool service, but needed data Audioscrobbler Protocol 1.0 Webservices for accessing users’ music profile data Together, provided “round trip” incentive for plugin developers

Openness and Growth
In 2004, we had a cool service, but needed data Audioscrobbler Protocol 1.0 Webservices for accessing users’ music profile data Together, provided “round trip” incentive for plugin developers
Winamp, iTunes, WMP, Amarok

Openness and Growth
In 2004, we had a cool service, but needed data Audioscrobbler Protocol 1.0 Webservices for accessing users’ music profile data Together, provided “round trip” incentive for plugin developers
Winamp, iTunes, WMP, Amarok Foobar, QCD, mpd, XMMS, mpg321

Openness and Growth
In 2004, we had a cool service, but needed data Audioscrobbler Protocol 1.0 Webservices for accessing users’ music profile data Together, provided “round trip” incentive for plugin developers
Winamp, iTunes, WMP, Amarok Foobar, QCD, mpd, XMMS, mpg321 Noatun, Quod Libet, Jinzora, Ampache

Openness and Growth
In 2004, we had a cool service, but needed data Audioscrobbler Protocol 1.0 Webservices for accessing users’ music profile data Together, provided “round trip” incentive for plugin developers
Winamp, iTunes, WMP, Amarok Foobar, QCD, mpd, XMMS, mpg321 Noatun, Quod Libet, Jinzora, Ampache (and dozens more)

Openness and Users

Openness and Users
Involve non-technical users as well

Openness and Users
Involve non-technical users as well Promote a community around your application

Openness and Users
Involve non-technical users as well Promote a community around your application Talk to your users (bad news > no news)

Openness and Users
Involve non-technical users as well Promote a community around your application Talk to your users (bad news > no news) More likely to tolerate growing pains…

Moving into the new office Old Street, London, May 2006

Growing up

Growing up
process

Growing up
process product

Growing up
process product

Growing up
process product

20 to 40+ employees in 6 months

Growing up
process product

• •

20 to 40+ employees in 6 months “people trump process”

Growing up
process product

• • •

20 to 40+ employees in 6 months “people trump process” simple tools are effective tools

Growing up
process product

• • • •

20 to 40+ employees in 6 months “people trump process” simple tools are effective tools radiate information across different channels in the company

Growing up
process excerpt from #last.fm irc channel

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872)

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners'

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid.

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release..

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764 felix: hey abc when did you put the adsense leaderboard on bottom cat pages live?

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764 felix: hey abc when did you put the adsense leaderboard on bottom cat pages live? abc: friday

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764 felix: hey abc when did you put the adsense leaderboard on bottom cat pages live? abc: friday 3:45 PM

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764 felix: hey abc when did you put the adsense leaderboard on bottom cat pages live? abc: friday 3:45 PM mokele: ? lookup track 11082618

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764 felix: hey abc when did you put the adsense leaderboard on bottom cat pages live? abc: friday 3:45 PM mokele: ? lookup track 11082618 irccat: track.id(11082618) Zetan Spore ??? Subspace Distortion http://www.last.fm/music/Zetan+Spore/_/Subspace+Distortion (lastfm=t)

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764 felix: hey abc when did you put the adsense leaderboard on bottom cat pages live? abc: friday 3:45 PM mokele: ? lookup track 11082618 irccat: track.id(11082618) Zetan Spore ??? Subspace Distortion http://www.last.fm/music/Zetan+Spore/_/Subspace+Distortion (lastfm=t) pete_bug: jonty, can you please suspend PP campaign 3670?

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764 felix: hey abc when did you put the adsense leaderboard on bottom cat pages live? abc: friday 3:45 PM mokele: ? lookup track 11082618 irccat: track.id(11082618) Zetan Spore ??? Subspace Distortion http://www.last.fm/music/Zetan+Spore/_/Subspace+Distortion (lastfm=t) pete_bug: jonty, can you please suspend PP campaign 3670? jonty: pete_bug, sure one sec.

Growing up
process excerpt from #last.fm irc channel
irccat: SVN commit by norman (23872) 'randomSplitter: splits data into train and test sets randomly' (changeset: https://admindev.last.fm/ trac/changeset/23872) 3:40 PM irccat: *** jonty is refreshing webnodes now: 'Fix for group owners' mischa: jonty: memcache key should be set to: java-playlist-10093 where 10093 ==userid. irccat: Trac: ticket #1779 (http://support.last.fm/trac/ticket/1779) changed by julian, Comment: Fixed for the next release.. irccat: number of anon flash streams is 1440, number of registered flash streams is 764 felix: hey abc when did you put the adsense leaderboard on bottom cat pages live? abc: friday 3:45 PM mokele: ? lookup track 11082618 irccat: track.id(11082618) Zetan Spore ??? Subspace Distortion http://www.last.fm/music/Zetan+Spore/_/Subspace+Distortion (lastfm=t) pete_bug: jonty, can you please suspend PP campaign 3670? jonty: pete_bug, sure one sec. irccat: Trac: ticket #1526 (http://support.last.fm/trac/ticket/1526) "group recommendations are slow" created by muz.

Growing up
process excerpt from #last.fm irc channel

osmotic communication

Growing up
process product

Growing up
process product

15 million unique users a month

Growing up
process product

• •

15 million unique users a month plan for going global

Growing up
process product

• • •

15 million unique users a month plan for going global affiliations should enhance the user experience

Growing up
process product

• • • •

15 million unique users a month plan for going global affiliations should enhance the user experience harness critical mass

Growing up
process product

• • • • •

15 million unique users a month plan for going global affiliations should enhance the user experience harness critical mass embed your service in others

Growing up
process product

• • • • • •

15 million unique users a month plan for going global affiliations should enhance the user experience harness critical mass embed your service in others make the transition from service to platform

Growing up
product harness critical mass

Growing up
product harness critical mass

Growing up
product harness critical mass

user-generated content

Growing up
product harness critical mass network effects of socialization

user-generated content

Growing up
product harness critical mass network effects of socialization

user-generated content

affiliate services

Growing up
product harness critical mass network effects of socialization

user moderation user-generated content

affiliate services

Growing up
product harness critical mass

user-generated content drives feature design

Growing up
product

Growing up
product embed your service in others

Growing up
product embed your service in others

quilts

Growing up
product embed your service in others

quilts

charts

Growing up
product embed your service in others

quilts

charts

radio

Growing up
product embed your service in others

allow users to export

Growing up
product

Growing up
product transition from service to platform

Growing up
product transition from service to platform

Growing up
product transition from service to platform

Growing up
product transition from service to platform

Growing up
product transition from service to platform

openness is key to web platforms

Attention and “Myware”

Attention and “Myware”

Attention and “Myware”

When you pay attention to something (or don’t), data is created

Attention and “Myware”

When you pay attention to something (or don’t), data is created Myware: spying on yourself

Attention and “Myware”

When you pay attention to something (or don’t), data is created Myware: spying on yourself Attention economy alters traditional meaning of “active user”

Attention and “Myware”

When you pay attention to something (or don’t), data is created Myware: spying on yourself Attention economy alters traditional meaning of “active user” Social web + attention aggregators = where the action is

Attention data
Monetizing attention

Attention data
Monetizing attention
1 - Microchunk it - Reduce the content to its simplest form.

Attention data
Monetizing attention
1 - Microchunk it - Reduce the content to its simplest form. 2 - Free it - Put it out there without walls around it or strings on it.

Attention data
Monetizing attention
1 - Microchunk it - Reduce the content to its simplest form. 2 - Free it - Put it out there without walls around it or strings on it. 3 - Syndicate it - Let anyone take it and run with it.

Attention data
Monetizing attention
1 - Microchunk it - Reduce the content to its simplest form. 2 - Free it - Put it out there without walls around it or strings on it. 3 - Syndicate it - Let anyone take it and run with it. 4 - Monetize it - Put the monetization and tracking systems into the microchunk.

Attention data
Monetizing attention
1 - Microchunk it - Reduce the content to its simplest form. 2 - Free it - Put it out there without walls around it or strings on it. 3 - Syndicate it - Let anyone take it and run with it. 4 - Monetize it - Put the monetization and tracking systems into the microchunk.

Fred Wilson, The Future of Media, November 2005

Attention data
Monetizing attention

Attention data
Monetizing attention

Powerplay is sponsored airtime

Attention data
Monetizing attention

Powerplay is sponsored airtime Individualized targeting based on attention history

Attention data
Monetizing attention

Powerplay is sponsored airtime Individualized targeting based on attention history New attention metrics for reporting

Attention data
Monetizing attention

Powerplay is sponsored airtime Individualized targeting based on attention history New attention metrics for reporting No more CPMs - the ‘scrobble’ is our attention unit

Attention data
Case study: tag cloud moderation

Attention data
Case study: tag cloud moderation

Paris Hilton tag cloud, October 2006

Attention data
Case study: tag cloud moderation

Paris Hilton tag cloud, October 2006

Paris Hilton tag cloud, February 2007

Attention data
Case study: tag cloud moderation

Attention data
Case study: tag cloud moderation Censorship is not acceptable in a folksonomy

Attention data
Case study: tag cloud moderation Censorship is not acceptable in a folksonomy Attention data does not lie

Attention data
Case study: tag cloud moderation Censorship is not acceptable in a folksonomy Attention data does not lie Weigh user tags by volume of attention user gives to content

Attention data
Case study: tag cloud moderation Censorship is not acceptable in a folksonomy Attention data does not lie Weigh user tags by volume of attention user gives to content Attention earns trust

Future of Last.fm

Future of Last.fm
more

Future of Last.fm
more less

Future of Last.fm
more less

Future of Last.fm
more less

more growth

Future of Last.fm
more less

• •

more growth more streamable music

Future of Last.fm
more less

• • •

more growth more streamable music more ambient findability

Future of Last.fm
more less

• • • •

more growth more streamable music more ambient findability more personalization / things you can do with your data

Future of Last.fm
more less

Future of Last.fm
more less

fewer interfaces

Future of Last.fm
more less

• •

fewer interfaces fewer barriers to entry

Future of Last.fm
more less

• • •

fewer interfaces fewer barriers to entry fewer gradients?

Thank-you. Questions?

matt@last.fm

anil@last.fm