Measuring user retention using cohort analysis with R

Cohort analysis is super important if you want to know if your service is in fact a leaky bucket despite nice growth of absolute numbers. There’s a good write up on that subject “Cohorts, Retention, Churn, ARPU” by Matt Johnson.

So how to do it using R and how to visualize it. Inspired by examples described in “Retention, Cohorts, and Visualizations” I came up with the following solution.

First, get the data in a suitable format, like this:

cohort  signed_up  active_m0  active_m1  active_m2
2011-10 12345      10432      8765       6754
2011-11 12345      10432      8765       6754
2011-12 12345      10432      8765       6754

Cohort here is in “YYYY-MM” format, signed_up is the number of users who have created accounts in the given month, active_m0 – number of users who have been active in the same month as they registered, active_m1 – number of users who have been active in the following month, and so forth. For newest cohorts you’ll be getting zeroes in some of active_mN columns, since there’s no data on them yet. This is taken into account in processing scripts.

require(plyr)

# Load SystematicInvestor's plot.table (https://github.com/systematicinvestor/SIT)
con = gzcon(url('http://www.systematicportfolio.com/sit.gz', 'rb'))
source(con)
close(con)

# Read the data
cohorts
# Let's convert absolute values to percentages (% of the registered users remaining active)
cohort_p as.numeric(df$active_m0/df$signed_up), as.numeric(df$active_m1/df$signed_up), as.numeric(df$active_m2/df$signed_up),
as.numeric(df$active_m3/df$signed_up), as.numeric(df$active_m4/df$signed_up), as.numeric(df$active_m5/df$signed_up),
as.numeric(df$active_m6/df$signed_up), as.numeric(df$active_m7/df$signed_up), as.numeric(df$active_m8/df$signed_up) ))

# Create a matrix
temp = as.matrix(cohort_p[,3:(length(cohort_p[1,])-1)])
colnames(temp) = paste('Month', 0:(length(temp[1,])-1), sep=' ')
rownames(temp) = as.vector(cohort_p$V1)

# Drop 0 values and format data
temp[] = plota.format(100 * as.numeric(temp), 0, '', '%')
temp[temp == " 0%"] # Plot cohort analysis table
plot.table(temp, smain='Cohort(users)', highlight = TRUE, colorbar = TRUE)

This code produces nice visualizations of the cohort analysis as a table:

I used articles “Visualizing Tables with plot.table” and “Response to Flowingdata Challenge: Graphing obesity trends” as an inspiration for this R code.

If you want to get nice colours as in the example above, you’ll need to adjust rainbow interval for plot.table. I managed to do it by editing functions code directly from R environment:

plot.table.helper.color <- edit(plot.table.helper.color)
function
(
 temp # matrix to plot
){
 # convert temp to numerical matrix
 temp = matrix(as.double(gsub('[%,$]', '', temp)), nrow(temp), ncol(temp))

highlight = as.vector(temp)
 cols = rep(NA, len(highlight))
 ncols = len(highlight[!is.na(highlight)])
 cols[1:ncols] = rainbow(ncols, start = 0, end = 0.3)

o = sort.list(highlight, na.last = TRUE, decreasing = FALSE)
 o1 = sort.list(o, na.last = TRUE, decreasing = FALSE)
 highlight = matrix(cols[o1], nrow = nrow(temp))
 highlight[is.na(temp)] = NA
 return(highlight)
}

Adjust interval in line 11 to 0.5, 0.6 to get shades of blue.
plot.table.helper.colorbar <- edit(plot.table.helper.colorbar)

function
(
 plot.matrix # matrix to plot
)
{
 nr = nrow(plot.matrix) + 1
 nc = ncol(plot.matrix) + 1

c = nc
 r1 = 1
 r2 = nr

rect((2*(c - 1) + .5), -(r1 - .5), (2*c + .5), -(r2 + .5), col='white', border='white')
 rect((2*(c - 1) + .5), -(r1 - .5), (2*(c - 1) + .5), -(r2 + .5), col='black', border='black')

y1= c( -(r2) : -(r1) )

graphics::image(x = c( (2*(c - 1) + 1.5) : (2*c + 0.5) ),
 y = y1,
 z = t(matrix( y1 , ncol = 1)),
 col = t(matrix( rainbow(len( y1 ), start = 0.5, end = 0.6) , ncol = 1)),
 add = T)
}

Adjust interval in line 21 to 0.5, 0.6 to get shades of blue.

Now if you want to draw the cycle-like graph:

# make matrix shorter for the graph (limit to 0-6 months)
temp = as.matrix(cohort_p[,3:(length(cohort_p[1,])-1)])
temp temp[temp == "0"]
library(RColorBrewer)
colnames(temp) = paste('Month', 0:(length(temp[1,])-1), 'retention', sep=' ')
palplot(temp[,1],pch=19,xaxt="n",col=pal[1],type="o",ylim=c(0,as.numeric(max(temp[,-2],na.rm=T))),xlab="Cohort by Month",ylab="Retention",main="Retention by Cohort")

for(i in 2:length(colnames(temp))) {
 points(temp[,i],pch=19,xaxt="n",col=pal[i])
 lines(temp[,i],pch=19,xaxt="n",col=pal[i])
}

axis(1,at=1:length(cohort_p$cohort),labels=as.vector(cohort_p$cohort),cex.axis=0.75)
legend("bottomleft",legend=colnames(temp),col=pal,lty=1,pch=19,bty="n")
abline(h=(seq(0,1,0.1)), col="lightgray", lty="dotted")

This code produces nice visualizations of the cohort analysis as multicolour cycle graph:


Comments

197 responses to “Measuring user retention using cohort analysis with R”

  1. This is great stuff. I’ve been asked to do produce subscription-based cohort models, i.e. How many people signed up? vs How many people subscribed in the following days? I’ve been doing most of my work in Excel, but I’m finding it hard to automate. Your code looks like something I’ll be able to learn a lot from. Aside from R, do you have any recommendations for how you could build something in Microsoft office after pulling data from a SQL query? Thanks for sharing!

  2. […] Measuring user retention using cohort analysis with R | Ivan Kuznetsov […]

  3. Great piece, Ivan! Thanks for this 🙂

  4. thanks for this article, when i try to run your script , it tell me that cohorts not found
    > con = gzcon(url(‘http://www.systematicportfolio.com/sit.gz’, ‘rb’))
    > source(con)
    > close(con)
    > cohorts
    Error: object ‘cohorts’ not found
    thanks in advance

  5. I reqd his post compleely about the diffgerence oof
    most rehent and prefeding technologies, it’s awesome article.

  6. Itss uch as yyou leadn my thoughts! Youu apear to graszp sso mucdh
    about this, succh as yoou wrrote thee ebook inn itt
    orr something. I ffeel thqt you simply can do wifh sopme p.c.

    to pressuure tthe message housse a little bit, however oother thann that, tha
    is exceellent blog. An excellennt read. I will ceryainly be back.

  7. Howdy! This iss kind oof offf topic but I nee
    some guuidance frokm aan estabhlished blog. Is iit very difficult to set up your own blog?
    I’m not very techincal but I can figure tings oout pretty fast.
    I’m thinking abot creating myy ownn butt I’m noot surfe wher
    tto start. Do you hqve any tils or suggestions? Many thanks

  8. Havee you ever thought about wrting an e-book or guet autboring onn other sites?
    I have a bloog based onn thee samke subjects youu discuss annd wold rreally lioke
    to have you share som stories/information. I kknow my subscriberts wouild ennjoy
    our work. If you are even reotely interested, feel free to senhd me aan e mail.

  9. What’s up all, her eveery one iss sharing these knowledge, thuys it’s gokod
    to read this weblog, and I used too pay a vusit thijs webpage daily.

  10. Jamesmub

    achat kamagra: acheter Kamagra sans ordonnance – pharmacie en ligne france pas cher

  11. Williamhow

    pommade ketum: fluocaril bi fluoré 250 – angine medicament sans ordonnance

  12. Williamhow

    curso online gratuito auxiliar de farmacia: se puede comprar viagra en españa sin receta – comprar viagra sin receta contrareembolso

  13. Williamhow

    comprar adventan sin receta: comprar eq zona sin receta – farmacia online genericos

  14. Williamhow

    pedido online farmacia: farmacia greco online – comprar viagra españa farmacia online

  15. Williamhow

    ozempic comprar sin receta andorra: Confia Pharma – donde puedo comprar viagra sin receta barcelona

  16. Williamhow

    tobradex unguento oftalmico: Farmacia Subito – kestine lio

  17. Hey there! Thiss plst could nnot be wrditten anny better!
    Reading thiss post reminds mme off mmy oldd
    rroom mate! He aways kept chattingg abnout this. I wijll forwwrd this write-up to him.

    Fairl certain he will have a good read. Thanos for sharing!

  18. BradleyNub

    aglae pillola scatola kestine prezzo niferex compresse

  19. MichaeldwebY

    zhekort spray nasale prezzo: quiz farmacia online – xanax 1 mg

  20. Thomasdut

    zolpidem prix pharmacie sans ordonnance: l’amoxicilline sans ordonnance – arnica montana 7 ch

  21. MichaeldwebY

    dicloreum per cervicale: Farmacia Subito – bentelan 1 mg senza ricetta

  22. Thomasdut

    exicort spray nasale: Farmacia Subito – ibuprofene 600 bustine

  23. Dannyfax

    http://farmaciasubito.com/# mascherine farmacia online

  24. Josephtut

    vitamine d en pharmacie sans ordonnance: douleur dentaire medicament sans ordonnance – ordonnance pharmacie en ligne

  25. BradleyNub

    monuril sans ordonnance pharmacie gel douche aderma voir un orl sans ordonnance

  26. MichaeldwebY

    monurelle plus: neodidro 0 266 mg prezzo – niferex prezzo

  27. Josephtut

    etacortilen collirio prezzo: Farmacia Subito – resilient 83 costo

  28. MichaeldwebY

    facoltГ  farmacia online: visunac collirio prezzo – modafinil farmacia online

  29. Dannyfax
  30. Josephtut

    puis-je consulter un orl sans ordonnance: Pharmacie Express – acheter tadalafil 5mg en ligne

  31. MichaeldwebY

    caudalie demaquillant: imodium avec ou sans ordonnance – blemish age defense skinceuticals

  32. BradleyNub

    spedra 200 mg gГ©nГ©rique que prendre pour une infection urinaire sans ordonnance vaccin grippe pharmacie sans ordonnance

  33. Josephtut

    vmp pasta per gatti controindicazioni: Farmacia Subito – xarelto 10 mg prezzo

  34. MichaeldwebY

    tobradex pomata prezzo: Farmacia Subito – senshio compresse prezzo

  35. BradleyNub

    se puede comprar prednisona sin receta test de antigenos farmacia online gactos de farmacia online gratis

  36. MichaeldwebY

    niferex a cosa serve: di base 25000 – buccolam 10 mg

  37. BradleyNub

    farmacia en casa online gastos de envГ­o gratis farmacia mallol sunyer online farmacia online sin gastos de envio

  38. Williamrib

    https://pharmexpress24.com/# russian pharmacy online usa

  39. PeterDralo

    http://pharmmex.com/# muscle relaxers mexico

  40. RogerRak

    meds from india: india online pharmacy – e pharmacy india

  41. CharlesMut

    purple pharmacy price list: canadian pharmacy no rx – mounjaro cost in mexico

  42. MatthewBlani

    Methocarbamol pharmacy customer care viagra propecia inhouse pharmacy

  43. RogerRak

    e pharmacy india: InPharm24 – buy medicines online in india

  44. MatthewBlani

    overseas pharmacy Pharm Mex mexican pharmacy stores near me

  45. CharlesMut

    cleocin online pharmacy: Prasugrel – premarin cream pharmacy

  46. Williamrib

    https://pharmexpress24.com/# prevacid online pharmacy

  47. RogerRak

    what to get at mexican pharmacy: Pharm Mex – international pharmacy online

  48. Randallmaymn

    best indian pharmacy: india pharmacy market outlook – retail pharmacy market in india

  49. MatthewBlani

    order medicine online india InPharm24 india medicine

  50. CharlesMut

    uk online pharmacy international delivery: kaiser permanente online pharmacy – winn dixie pharmacy

  51. RogerRak

    lexapro pharmacy coupons: asda viagra pharmacy – custom rx pharmacy kuna

  52. Randallmaymn

    los algodones purple pharmacy prices: mexican pharmacy coupon code – buy viagra in mexico

  53. Williamrib

    https://inpharm24.com/# india pharmacy viagra

  54. MatthewBlani

    all day pharmacy india ex officio member of pharmacy council of india india pharmacy reviews

  55. RogerRak

    india pharmacy of the world: history of pharmacy in india – online pharmacy in india

  56. CharlesMut

    medicine from india: india pharmacies – pharmacy india website

  57. MatthewBlani

    cheap online prescriptions Pharm Mex medicine mexico

  58. RogerRak

    medicine from india: medicine delivery in vadodara – b pharmacy salary in india

  59. Williamrib

    https://inpharm24.com/# online pharmacy company in india

  60. MatthewBlani

    asacol pharmacy celebrex target pharmacy generic zoloft online pharmacy

  61. CharlesMut

    the peoples pharmacy: Pharm Express 24 – concerta online pharmacy

  62. Randallmaymn

    levitra mexican pharmacy: Pharm Mex – mexico meds

  63. RogerRak

    worldwide pharmacy online: Pharm Express 24 – online pharmacy quick delivery

  64. MatthewBlani

    pharmacy store requirements Pharm Express 24 renova online pharmacy

  65. Randallmaymn

    tretinoin cream mexican pharmacy: mexican pharmacy methylphenidate – online pharmacy for pain relief

  66. RogerRak

    buy mounjaro from mexico: purple pharmacy mexico – adderall in mexican pharmacy

  67. CharlesMut

    divya pharmacy india: medicine online india – online medicine order

  68. MatthewBlani

    pharmacies in india InPharm24 pharmacy online india

  69. Williamrib

    https://inpharm24.com/# drugs from india

  70. RogerRak

    mexico pharmacy drug list: tijuana pharmacy prices – can you buy antibiotics over the counter in mexico

  71. CharlesMut

    india e-pharmacy market size 2025: pharmacies in india – ex officio member of pharmacy council of india

  72. MatthewBlani

    differin guardian pharmacy phendimetrazine online pharmacy cheapest pharmacy to fill prescriptions without insurance

  73. RogerRak

    india pharmacy reviews: india pharmacy delivery – online pharmacy app developer in india

  74. CharlesMut

    buy steroids from mexico: buy medications – percocet mexico

  75. MatthewBlani

    god of pharmacy in india InPharm24 b pharmacy fees in india

  76. RogerRak

    xanax cost in mexico: mexican pharmacy online medications – buy semaglutide online mexico

  77. Williamrib

    https://pharmmex.shop/# amoxicillin mexican store

  78. MatthewBlani

    buy drugs from india online pharmacy india ship to usa buy drugs from india

  79. RogerRak

    Cefixime: strattera online pharmacy – aciclovir in pharmacy

  80. CharlesMut

    meijers pharmacy: general health – target pharmacy montelukast

  81. MatthewBlani

    Atarax viagra apollo pharmacy rx express pharmacy hurley ms

  82. RogerRak

    mexican pharmacy mail order: mexican pharmacy chains – tramadol in mexico name

  83. Williamrib

    https://pharmmex.com/# overseas pharmacy

  84. JamesNeN

    where to buy cheap viagra in usa: viagra online order in india – how to buy real viagra

  85. Brandonrob

    20 mg viagra daily cost of viagra per pill order sildenafil india

  86. Billypap

    can you buy viagra over the counter in canada: VGR Sources – viagra medication online

  87. BrianSwelm

    where can i buy viagra otc: buy viagra in europe – 10mg viagra tablets

  88. JamesNeN

    where to viagra online: VGR Sources – best online viagra site

  89. Brandonrob

    female viagra india online average cost for viagra cost of viagra 100mg tablet

  90. Billypap

    order viagra 50 mg: female viagra canada – buy viagra online 100mg

  91. RodneyMeene

    https://vgrsources.com/# where to get sildenafil online

  92. BrianSwelm

    generic sildenafil 20mg cost: VGR Sources – 75 mg viagra

  93. JamesNeN

    buy cheap sildenafil uk: viagra price in india – sildenafil pharmacy australia

  94. Brandonrob

    viagra soft sale VGR Sources how to use viagra

  95. Billypap

    female viagra sildenafil: VGR Sources – buy cheap viagra tablets

  96. JamesNeN

    price of viagra 50mg in india: VGR Sources – best female viagra pills

  97. BrianSwelm

    best rx prices for sildenafil: VGR Sources – where to buy cheap sildenafil

  98. Billypap

    viagra india online purchase: VGR Sources – buy viagra online australia paypal

  99. RodneyMeene

    https://vgrsources.com/# buy cheap viagra usa

  100. Brandonrob

    viagra 100 mg price in usa where to buy viagra online uk viagra online europe

  101. JamesNeN

    sildenafil 20 mg daily: buy sildenafil 20 mg tablets – sildenafil paypal

  102. BrianSwelm

    rx sildenafil tablets: VGR Sources – viagra pills online india

  103. Billypap

    buy viagra online with visa: VGR Sources – order viagra mexico

  104. Brandonrob

    buy viagra cheap VGR Sources viagra singapore prescription

  105. JamesNeN

    Viagra 50mg: viagra website – cheap generic viagra for sale

  106. BrianSwelm

    sildenafil 50mg united states: VGR Sources – sildenafil online cheap

  107. Billypap

    generic viagra best price: viagra generic 20 mg – price for sildenafil 100 mg

  108. RodneyMeene

    https://vgrsources.com/# viagra mexico cost

  109. Brandonrob

    viagra pill price in mexico VGR Sources cheap viagra pills online

  110. JamesNeN

    buy female viagra online canada: female viagra otc – india viagra online

  111. BrianSwelm

    sildenafil in usa: safe place to buy viagra – generic sildenafil soft tabs

  112. Billypap

    on line viagra: buy female viagra usa – viagra 100mg cost in india

  113. Brandonrob

    where to buy female viagra canada VGR Sources cheap viagra generic best price

  114. JamesNeN

    where can you get generic viagra: VGR Sources – viagra generic cheap

  115. Billypap

    sildenafil 20 mg tablet: buy genuine viagra online canada – viagra online australia paypal

  116. BrianSwelm

    can you buy viagra canada: VGR Sources – average cost of generic viagra

  117. RodneyMeene

    https://vgrsources.com/# where can i get viagra in canada

  118. JamesNeN

    sildenafil otc: VGR Sources – viagra 500mg tablet

  119. Billypap

    how to get sildenafil: buy viagra tablet india online – female viagra cost

  120. BrianSwelm

    order viagra paypal: VGR Sources – where to get over the counter viagra

  121. Brandonrob

    viagra gel for sale viagra soft canada sildenafil india purchase

  122. JamesNeN

    purchase viagra: VGR Sources – how to get viagra uk

  123. Billypap

    generic sildenafil 20 mg cost: sildenafil paypal – sildenafil over the counter united states

  124. BrianSwelm

    generic viagra where to buy: VGR Sources – viagra online with prescription

  125. Brandonrob

    where to order real viagra usa viagra 100 buying viagra on line

  126. Billypap

    generic female viagra in india: VGR Sources – best otc female viagra

  127. JamesNeN

    buy viagra best price: sildenafil price singapore – purchase sildenafil citrate

  128. RodneyMeene

    https://vgrsources.com/# viagra side effects

  129. BrianSwelm

    purchase viagra over the counter: female viagra pills australia – viagra buy usa

  130. Billypap

    sildenafil 20 mg: buy viagra online best price – buy viagra europe

  131. Brandonrob

    sildenafil 10mg tablets VGR Sources generic viagra india online

  132. JamesNeN

    best price for generic sildenafil: VGR Sources – generic viagra australia online

  133. BrianSwelm

    sildenafil pills online: viagra cheap – buy viagra australia

  134. Billypap

    canada viagra: cheap viagra prescription online – viagra tablet 25 mg

  135. Brandonrob

    cheap viagra for women sildenafil 6mg sildenafil from india

  136. JamesNeN

    how to buy cheap viagra online: VGR Sources – cheap generic viagra online usa

  137. RodneyMeene

    https://vgrsources.com/# price of sildenafil 50 mg

  138. BrianSwelm

    sildenafil generic usa: generic sildenafil paypal – generic viagra online canadian

  139. Billypap

    where can you get viagra uk: VGR Sources – how can i get a prescription for viagra

  140. Brandonrob

    where to buy viagra without prescription VGR Sources sildenafil 20 mg tablet cost

  141. JamesNeN

    cheap brand viagra 100mg: generic viagra online best price – viagra canada no prescription

  142. BrianSwelm

    compare prices viagra: generic over the counter viagra – viagra otc

  143. Billypap

    viagra tablets online australia: VGR Sources – viagra 100 price in india

  144. Brandonrob

    buy sildenafil without a prescription VGR Sources buy generic viagra australia

  145. JamesNeN

    generic viagra online europe: VGR Sources – generic viagra from usa

  146. RodneyMeene

    https://vgrsources.com/# sildenafil pharmacy nz

  147. Billypap

    order viagra 100mg online: order no prescription viagra – viagra 100mg cost in usa

  148. BrianSwelm

    where to buy viagra over the counter usa: VGR Sources – viagra online from mexico

  149. Alfonsodomia

    Predni Pharm: online prednisone 5mg – PredniPharm

  150. Albertoroale

    Semaglu Pharm rybelsus prix is ozempic a semaglutide

  151. EstebanChait

    Where to buy Semaglutide legally: Semaglu Pharm – Semaglutide tablets without prescription

  152. Billyhem

    what happens if you forget to take atorvastatin: LipiPharm – Affordable Lipitor alternatives USA

  153. Alfonsodomia

    6 prednisone: PredniPharm – PredniPharm

  154. Albertoroale

    prednisone pills 10 mg PredniPharm Predni Pharm

  155. EstebanChait

    Predni Pharm: buy prednisone 20mg – prednisone tablets

  156. Billyhem

    Online statin therapy without RX: Crestor Pharm – Best price for Crestor online USA

  157. Alfonsodomia

    SemagluPharm: rybelsus 7 mg side effects – Semaglu Pharm

  158. Albertoroale

    fda compounded semaglutide No prescription diabetes meds online п»їBuy Rybelsus online USA

  159. EstebanChait

    Semaglutide tablets without prescription: rybelsus covered by medicaid – Semaglu Pharm

  160. Alfonsodomia

    doses of crestor: Crestor Pharm – crestor generic names

  161. Billyhem

    Predni Pharm: prednisone tablets canada – PredniPharm

  162. EstebanChait

    Rybelsus for blood sugar control: Online pharmacy Rybelsus – FDA-approved Rybelsus alternative

  163. Albertoroale

    PredniPharm prednisone 5mg cost can i order prednisone

  164. Alfonsodomia

    Crestor Pharm: crestor 5 mg vs 10 mg – Crestor mail order USA

  165. Albertoroale

    alternative to crestor Crestor Pharm п»їBuy Crestor without prescription

  166. Billyhem

    crestor brand name: crestor lipophilic – CrestorPharm

  167. Alfonsodomia

    nursing implications for lipitor: atorvastatin 10 – Lipi Pharm

  168. Frankwaick

    SemagluPharm: SemagluPharm – Order Rybelsus discreetly

  169. Albertoroale

    Online statin therapy without RX Affordable cholesterol-lowering pills rosuvastatin indications

  170. Alfonsodomia

    Lipi Pharm: LipiPharm – LipiPharm

  171. Billyhem

    SemagluPharm: Affordable Rybelsus price – Semaglu Pharm

  172. Albertoroale

    Rybelsus online pharmacy reviews oral semaglutide cost Semaglu Pharm

  173. Alfonsodomia

    Crestor Pharm: CrestorPharm – Crestor Pharm

  174. Jamesvew
  175. Billyhem

    pill identifier atorvastatin 20 mg: Affordable Lipitor alternatives USA – Order cholesterol medication online

  176. Frankwaick

    Semaglu Pharm: Semaglu Pharm – Semaglu Pharm

  177. Albertoroale

    LipiPharm LipiPharm LipiPharm

  178. Alfonsodomia

    SemagluPharm: SemagluPharm – SemagluPharm

  179. Frankwaick

    pravastatin vs atorvastatin side effects: No RX Lipitor online – No RX Lipitor online

  180. Albertoroale

    prednisone pill 50mg prednisone tablet average cost of prednisone

  181. Billyhem

    Cheap Lipitor 10mg / 20mg / 40mg: Lipi Pharm – Lipi Pharm

  182. Alfonsodomia

    rybelsus natural alternatives: SemagluPharm – semaglutide injection sites

  183. Albertoroale

    Predni Pharm over the counter prednisone medicine PredniPharm

  184. Billyhem

    SemagluPharm: SemagluPharm – SemagluPharm

  185. Alfonsodomia

    what not to take with atorvastatin: Lipi Pharm – Lipi Pharm

  186. Albertoroale

    п»їBuy Lipitor without prescription USA LipiPharm what are the side effects of atorvastatin

  187. Alfonsodomia

    CrestorPharm: is crestor better than lipitor – CrestorPharm

  188. Billyhem

    Semaglutide tablets without prescription: Semaglu Pharm – Rybelsus for blood sugar control

  189. Albertoroale

    SemagluPharm Semaglu Pharm No prescription diabetes meds online

  190. Alfonsodomia

    SemagluPharm: SemagluPharm – semaglutide rybelsus 3mg

  191. Billyhem

    Semaglu Pharm: semaglutide expiration – Semaglu Pharm

  192. Albertoroale

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.