AnalyticsRegistrationSourceHelper.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. var RefererParser = require('referer-parser')
  2. const { URL } = require('url')
  3. const AnalyticsManager = require('./AnalyticsManager')
  4. function clearSource(session) {
  5. if (session) {
  6. delete session.required_login_for
  7. delete session.required_login_from_product_medium
  8. delete session.required_login_from_product_source
  9. }
  10. }
  11. const UTM_KEYS = [
  12. 'utm_campaign',
  13. 'utm_source',
  14. 'utm_term',
  15. 'utm_medium',
  16. 'utm_count',
  17. ]
  18. function parseUtm(query) {
  19. var utmValues = {}
  20. for (const utmKey of UTM_KEYS) {
  21. if (query[utmKey]) {
  22. utmValues[utmKey] = query[utmKey]
  23. }
  24. }
  25. return Object.keys(utmValues).length > 0 ? utmValues : null
  26. }
  27. function parseReferrer(referrer, url) {
  28. if (!referrer) {
  29. return {
  30. medium: 'direct',
  31. }
  32. }
  33. const parsedReferrer = new RefererParser(referrer, url)
  34. const referrerValues = {
  35. medium: parsedReferrer.medium,
  36. source: parsedReferrer.referer || 'other',
  37. }
  38. if (referrerValues.medium === 'unknown') {
  39. try {
  40. const referrerHostname = new URL(referrer).hostname
  41. if (referrerHostname) {
  42. referrerValues.medium = 'link'
  43. referrerValues.source = referrerHostname
  44. }
  45. } catch (error) {
  46. // ignore referrer parsing errors
  47. }
  48. }
  49. return referrerValues
  50. }
  51. function setInbound(session, url, query, referrer) {
  52. const inboundSession = {
  53. referrer: parseReferrer(referrer, url),
  54. utm: parseUtm(query),
  55. }
  56. if (inboundSession.referrer || inboundSession.utm) {
  57. session.inbound = inboundSession
  58. }
  59. }
  60. function clearInbound(session) {
  61. if (session) {
  62. delete session.inbound
  63. }
  64. }
  65. function addUserProperties(userId, session) {
  66. if (!session) {
  67. return
  68. }
  69. if (session.required_login_from_product_medium) {
  70. AnalyticsManager.setUserPropertyForUser(
  71. userId,
  72. `registered-from-product-medium`,
  73. session.required_login_from_product_medium
  74. )
  75. if (session.required_login_from_product_source) {
  76. AnalyticsManager.setUserPropertyForUser(
  77. userId,
  78. `registered-from-product-source`,
  79. session.required_login_from_product_source
  80. )
  81. }
  82. } else if (session.referal_id) {
  83. AnalyticsManager.setUserPropertyForUser(
  84. userId,
  85. `registered-from-bonus-scheme`,
  86. true
  87. )
  88. AnalyticsManager.setUserPropertyForUser(
  89. userId,
  90. `registered-from-product-medium`,
  91. 'bonus-scheme'
  92. )
  93. }
  94. if (session.required_login_for) {
  95. AnalyticsManager.setUserPropertyForUser(
  96. userId,
  97. `registered-from-${session.required_login_for}`,
  98. true
  99. )
  100. }
  101. if (session.inbound) {
  102. if (session.inbound.referrer && session.inbound.referrer.medium) {
  103. AnalyticsManager.setUserPropertyForUser(
  104. userId,
  105. `registered-from-referrer-medium`,
  106. `${session.inbound.referrer.medium
  107. .charAt(0)
  108. .toUpperCase()}${session.inbound.referrer.medium.slice(1)}`
  109. )
  110. if (session.inbound.referrer.source) {
  111. AnalyticsManager.setUserPropertyForUser(
  112. userId,
  113. `registered-from-referrer-source`,
  114. session.inbound.referrer.source
  115. )
  116. }
  117. }
  118. if (session.inbound.utm) {
  119. for (const utmKey of UTM_KEYS) {
  120. if (session.inbound.utm[utmKey]) {
  121. AnalyticsManager.setUserPropertyForUser(
  122. userId,
  123. `registered-from-${utmKey.replace('_', '-')}`,
  124. session.inbound.utm[utmKey]
  125. )
  126. }
  127. }
  128. }
  129. }
  130. }
  131. module.exports = {
  132. clearSource,
  133. setInbound,
  134. clearInbound,
  135. addUserProperties,
  136. }