RecurlyEventHandler.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. const AnalyticsManager = require('../Analytics/AnalyticsManager')
  2. function sendRecurlyAnalyticsEvent(event, eventData) {
  3. switch (event) {
  4. case 'new_subscription_notification':
  5. _sendSubscriptionStartedEvent(eventData)
  6. break
  7. case 'updated_subscription_notification':
  8. _sendSubscriptionUpdatedEvent(eventData)
  9. break
  10. case 'canceled_subscription_notification':
  11. _sendSubscriptionCancelledEvent(eventData)
  12. break
  13. case 'expired_subscription_notification':
  14. _sendSubscriptionExpiredEvent(eventData)
  15. break
  16. case 'renewed_subscription_notification':
  17. _sendSubscriptionRenewedEvent(eventData)
  18. break
  19. case 'reactivated_account_notification':
  20. _sendSubscriptionReactivatedEvent(eventData)
  21. break
  22. case 'paid_charge_invoice_notification':
  23. if (
  24. eventData.invoice.state === 'paid' &&
  25. eventData.invoice.total_in_cents > 0
  26. ) {
  27. _sendInvoicePaidEvent(eventData)
  28. }
  29. break
  30. case 'closed_invoice_notification':
  31. if (
  32. eventData.invoice.state === 'collected' &&
  33. eventData.invoice.total_in_cents > 0
  34. ) {
  35. _sendInvoicePaidEvent(eventData)
  36. }
  37. break
  38. }
  39. }
  40. function _sendSubscriptionStartedEvent(eventData) {
  41. const userId = _getUserId(eventData)
  42. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  43. AnalyticsManager.recordEvent(userId, 'subscription-started', {
  44. plan_code: planCode,
  45. quantity,
  46. is_trial: isTrial,
  47. })
  48. AnalyticsManager.setUserProperty(userId, 'subscription-plan-code', planCode)
  49. AnalyticsManager.setUserProperty(userId, 'subscription-state', state)
  50. AnalyticsManager.setUserProperty(userId, 'subscription-is-trial', isTrial)
  51. }
  52. function _sendSubscriptionUpdatedEvent(eventData) {
  53. const userId = _getUserId(eventData)
  54. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  55. AnalyticsManager.recordEvent(userId, 'subscription-updated', {
  56. plan_code: planCode,
  57. quantity,
  58. })
  59. AnalyticsManager.setUserProperty(userId, 'subscription-plan-code', planCode)
  60. AnalyticsManager.setUserProperty(userId, 'subscription-state', state)
  61. AnalyticsManager.setUserProperty(userId, 'subscription-is-trial', isTrial)
  62. }
  63. function _sendSubscriptionCancelledEvent(eventData) {
  64. const userId = _getUserId(eventData)
  65. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  66. AnalyticsManager.recordEvent(userId, 'subscription-cancelled', {
  67. plan_code: planCode,
  68. quantity,
  69. is_trial: isTrial,
  70. })
  71. AnalyticsManager.setUserProperty(userId, 'subscription-state', state)
  72. AnalyticsManager.setUserProperty(userId, 'subscription-is-trial', isTrial)
  73. }
  74. function _sendSubscriptionExpiredEvent(eventData) {
  75. const userId = _getUserId(eventData)
  76. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  77. AnalyticsManager.recordEvent(userId, 'subscription-expired', {
  78. plan_code: planCode,
  79. quantity,
  80. is_trial: isTrial,
  81. })
  82. AnalyticsManager.setUserProperty(userId, 'subscription-plan-code', planCode)
  83. AnalyticsManager.setUserProperty(userId, 'subscription-state', state)
  84. AnalyticsManager.setUserProperty(userId, 'subscription-is-trial', isTrial)
  85. }
  86. function _sendSubscriptionRenewedEvent(eventData) {
  87. const userId = _getUserId(eventData)
  88. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  89. AnalyticsManager.recordEvent(userId, 'subscription-renewed', {
  90. plan_code: planCode,
  91. quantity,
  92. is_trial: isTrial,
  93. })
  94. AnalyticsManager.setUserProperty(userId, 'subscription-plan-code', planCode)
  95. AnalyticsManager.setUserProperty(userId, 'subscription-state', state)
  96. AnalyticsManager.setUserProperty(userId, 'subscription-is-trial', isTrial)
  97. }
  98. function _sendSubscriptionReactivatedEvent(eventData) {
  99. const userId = _getUserId(eventData)
  100. const { planCode, quantity, state, isTrial } = _getSubscriptionData(eventData)
  101. AnalyticsManager.recordEvent(userId, 'subscription-reactivated', {
  102. plan_code: planCode,
  103. quantity,
  104. })
  105. AnalyticsManager.setUserProperty(userId, 'subscription-plan-code', planCode)
  106. AnalyticsManager.setUserProperty(userId, 'subscription-state', state)
  107. AnalyticsManager.setUserProperty(userId, 'subscription-is-trial', isTrial)
  108. }
  109. function _sendInvoicePaidEvent(eventData) {
  110. const userId = _getUserId(eventData)
  111. AnalyticsManager.recordEvent(userId, 'subscription-invoice-collected')
  112. AnalyticsManager.setUserProperty(userId, 'subscription-is-trial', false)
  113. }
  114. function _getUserId(eventData) {
  115. let userId
  116. if (eventData && eventData.account && eventData.account.account_code) {
  117. userId = eventData.account.account_code
  118. } else {
  119. throw new Error(
  120. 'account.account_code missing in event data to identity user ID'
  121. )
  122. }
  123. return userId
  124. }
  125. function _getSubscriptionData(eventData) {
  126. const isTrial =
  127. eventData.subscription.trial_started_at &&
  128. eventData.subscription.current_period_started_at &&
  129. eventData.subscription.trial_started_at.getTime() ===
  130. eventData.subscription.current_period_started_at.getTime()
  131. return {
  132. planCode: eventData.subscription.plan.plan_code,
  133. quantity: eventData.subscription.quantity,
  134. state: eventData.subscription.state,
  135. isTrial,
  136. }
  137. }
  138. module.exports = {
  139. sendRecurlyAnalyticsEvent,
  140. }