Bladeren bron

Add new analytics events in the new plans page and update analytics event in the current plans page (#7639)

GitOrigin-RevId: 71a4e7b0b041bbe7ea6df11cad28857978c77e4e
M Fahru 4 jaren geleden
bovenliggende
commit
1b2cefa63e

+ 1 - 0
services/web/app/src/Features/Subscription/SubscriptionController.js

@@ -95,6 +95,7 @@ async function plansPage(req, res) {
     groupPlans: GroupPlansData,
     groupPlans: GroupPlansData,
     groupPlanModalOptions,
     groupPlanModalOptions,
     groupPlanModalDefaults,
     groupPlanModalDefaults,
+    newPlansPageVariantV2,
     useNewPlanName,
     useNewPlanName,
     initialLocalizedGroupPrice:
     initialLocalizedGroupPrice:
       SubscriptionHelper.generateInitialLocalizedGroupPrice(
       SubscriptionHelper.generateInitialLocalizedGroupPrice(

+ 13 - 1
services/web/app/views/subscriptions/plans-marketing/_group_plan_modal.pug

@@ -58,7 +58,14 @@ div.modal.fade(tabindex="-1" role="dialog" data-ol-group-plan-modal)
 								.form-group
 								.form-group
 									label(for='size')
 									label(for='size')
 										| Number of users
 										| Number of users
-									select.form-control(id="size")
+									select.form-control(
+										id="size"
+										event-tracking="groups-modal-group-size"
+										event-tracking-mb="true"
+										event-tracking-trigger="click"
+										event-tracking-element="select"
+										event-segmentation='{"plans-page-layout-v2": "' + (newPlansPageVariantV2 ? 'new-plans-page' : 'default') + '"}'
+									)
 										for size in groupPlanModalOptions.sizes
 										for size in groupPlanModalOptions.sizes
 											option(
 											option(
 												value=size
 												value=size
@@ -81,6 +88,11 @@ div.modal.fade(tabindex="-1" role="dialog" data-ol-group-plan-modal)
 										id="usage"
 										id="usage"
 										type="checkbox"
 										type="checkbox"
 										autocomplete="off"
 										autocomplete="off"
+										event-tracking="groups-modal-edu-discount"
+										event-tracking-mb="true"
+										event-tracking-trigger="click"
+										event-tracking-element="checkbox"
+										event-segmentation='{"plans-page-layout-v2": "' + (newPlansPageVariantV2 ? 'new-plans-page' : 'default') + '"}'
 									)
 									)
 									span This license is for educational purposes (applies to students or faculty using Overleaf for teaching)
 									span This license is for educational purposes (applies to students or faculty using Overleaf for teaching)
 
 

+ 26 - 3
services/web/app/views/subscriptions/plans-marketing/v2/_cards_controls_tables.pug

@@ -3,17 +3,35 @@ include ./_mixins
 .row.plans-v2-top-switch
 .row.plans-v2-top-switch
 	.col-xs-12
 	.col-xs-12
 		ul.nav.plans-v2-nav
 		ul.nav.plans-v2-nav
-			li.active.plans-v2-top-switch-individual(data-ol-plans-v2-view-tab='individual')
+			li.active.plans-v2-top-switch-individual(
+				data-ol-plans-v2-view-tab='individual'
+				event-tracking="plans-page-toggle-plan"
+				event-tracking-mb="true"
+				event-tracking-trigger="click"
+				event-segmentation='{"button": "individual", "plans-page-layout-v2": "new-plans-page"}'
+			)
 				a.btn.btn-default-outline(
 				a.btn.btn-default-outline(
 					href="#"
 					href="#"
 				) #{translate("indvidual_plans")}
 				) #{translate("indvidual_plans")}
-			li.plans-v2-top-switch-group(data-ol-plans-v2-view-tab='group')
+			li.plans-v2-top-switch-group(
+				data-ol-plans-v2-view-tab='group'
+				event-tracking="plans-page-toggle-plan"
+				event-tracking-mb="true"
+				event-tracking-trigger="click"
+				event-segmentation='{"button": "group", "plans-page-layout-v2": "new-plans-page"}'
+			)
 				a.btn.btn-default-outline(
 				a.btn.btn-default-outline(
 					href="#"
 					href="#"
 				)
 				)
 					span #{translate("group_plans")} 
 					span #{translate("group_plans")} 
 					span (save 30% or more)
 					span (save 30% or more)
-			li.plans-v2-top-switch-student(data-ol-plans-v2-view-tab='student')
+			li.plans-v2-top-switch-student(
+				data-ol-plans-v2-view-tab='student'
+				event-tracking="plans-page-toggle-plan"
+				event-tracking-mb="true"
+				event-tracking-trigger="click"
+				event-segmentation='{"button": "student", "plans-page-layout-v2": "new-plans-page"}'
+			)
 				a.btn.btn-default-outline(
 				a.btn.btn-default-outline(
 					href="#"
 					href="#"
 				) #{translate("student_plans")}
 				) #{translate("student_plans")}
@@ -26,6 +44,11 @@ include ./_mixins
 				type="checkbox"
 				type="checkbox"
 				role="switch"
 				role="switch"
 				autocomplete="off"
 				autocomplete="off"
+				event-tracking="plans-page-toggle-period"
+				event-tracking-mb="true"
+				event-tracking-trigger="click"
+				event-tracking-element="checkbox"
+				event-segmentation='{"plans-page-layout-v2": "new-plans-page"}'
 			)
 			)
 			span
 			span
 		.plans-v2-m-a-switch-annual-text-container
 		.plans-v2-m-a-switch-annual-text-container

+ 59 - 13
services/web/app/views/subscriptions/plans-marketing/v2/_mixins.pug

@@ -41,7 +41,7 @@ mixin table_individual(period)
 					p.plans-v2-table-th-content-title #{translate("professional")}
 					p.plans-v2-table-th-content-title #{translate("professional")}
 					+table_head_price('professional', period)
 					+table_head_price('professional', period)
 					.plans-v2-table-btn-buy-container-mobile
 					.plans-v2-table-btn-buy-container-mobile
-						+btn_buy_individual_professional()
+						+btn_buy_individual_professional(period)
 					ul.plans-v2-table-th-content-benefit
 					ul.plans-v2-table-th-content-benefit
 						li !{translate("x_collaborators_per_project", {collaboratorsCount: '10'})}
 						li !{translate("x_collaborators_per_project", {collaboratorsCount: '10'})}
 						li #{translate("all_premium_features")}
 						li #{translate("all_premium_features")}
@@ -119,7 +119,7 @@ mixin table_group
 							| per user / year
 							| per user / year
 					.plans-v2-table-btn-buy-container-mobile
 					.plans-v2-table-btn-buy-container-mobile
 						+btn_buy_group_collaborator()
 						+btn_buy_group_collaborator()
-						small.plans-v2-table-th-content-additional-link !{translate("or_contact_us", {}, [{name: 'a', attrs: {href: '/for/enterprises/sales-contact', target: '_blank'}}])}
+						+additional_link_group('group_collaborator')
 					ul.plans-v2-table-th-content-benefit
 					ul.plans-v2-table-th-content-benefit
 						li #{translate("up_to")} !{translate("x_collaborators_per_project", {collaboratorsCount: '10'})}
 						li #{translate("up_to")} !{translate("x_collaborators_per_project", {collaboratorsCount: '10'})}
 						li
 						li
@@ -127,7 +127,7 @@ mixin table_group
 							span  #{translate("total_per_year_lowercase")}
 							span  #{translate("total_per_year_lowercase")}
 					.plans-v2-table-btn-buy-container-desktop
 					.plans-v2-table-btn-buy-container-desktop
 						+btn_buy_group_collaborator()
 						+btn_buy_group_collaborator()
-						small.plans-v2-table-th-content-additional-link !{translate("or_contact_us", {}, [{name: 'a', attrs: {href: '/for/enterprises/sales-contact', target: '_blank'}}])}
+						+additional_link_group('group_collaborator')
 
 
 			th.plans-v2-table-green-highlighted
 			th.plans-v2-table-green-highlighted
 				div.plans-v2-table-th-content
 				div.plans-v2-table-th-content
@@ -142,7 +142,7 @@ mixin table_group
 							| per user / year
 							| per user / year
 					.plans-v2-table-btn-buy-container-mobile
 					.plans-v2-table-btn-buy-container-mobile
 						+btn_buy_group_professional()
 						+btn_buy_group_professional()
-						small.plans-v2-table-th-content-additional-link !{translate("or_contact_us", {}, [{name: 'a', attrs: {href: '/for/enterprises/sales-contact', target: '_blank'}}])}
+						+additional_link_group('group_professional')
 					ul.plans-v2-table-th-content-benefit
 					ul.plans-v2-table-th-content-benefit
 						li #{translate("unlimited_collaborators_in_each_project")}
 						li #{translate("unlimited_collaborators_in_each_project")}
 						li
 						li
@@ -150,7 +150,7 @@ mixin table_group
 							span  #{translate("total_per_year_lowercase")}
 							span  #{translate("total_per_year_lowercase")}
 					.plans-v2-table-btn-buy-container-desktop
 					.plans-v2-table-btn-buy-container-desktop
 						+btn_buy_group_professional()
 						+btn_buy_group_professional()
-						small.plans-v2-table-th-content-additional-link !{translate("or_contact_us", {}, [{name: 'a', attrs: {href: '/for/enterprises/sales-contact', target: '_blank'}}])}
+						+additional_link_group('group_professional')
 						
 						
 			th
 			th
 				div.plans-v2-table-th-content
 				div.plans-v2-table-th-content
@@ -164,7 +164,14 @@ mixin table_group
 						li #{translate("best_choices_companies_universities_non_profits")}
 						li #{translate("best_choices_companies_universities_non_profits")}
 						li #{translate("for_groups_or_site_wide")}
 						li #{translate("for_groups_or_site_wide")}
 						li
 						li
-							a(href="/for/enterprises/sales-contact") #{translate("also_available_as_on_premises")}
+							a(
+								target="_blank"
+								href="/for/enterprises/sales-contact"
+								event-tracking="plans-page-click"
+								event-tracking-mb="true"
+								event-tracking-trigger="click"
+								event-segmentation='{"button": "group_organization-link", "location": "table-header-list", "period": "annual", "plans-page-layout-v2": "new-plans-page"}'
+							) #{translate("also_available_as_on_premises")}
 					.plans-v2-table-btn-buy-container-desktop
 					.plans-v2-table-btn-buy-container-desktop
 						+btn_buy_group_organization()
 						+btn_buy_group_organization()
 						small.plans-v2-table-th-content-additional-link.invisible(aria-hidden="true")
 						small.plans-v2-table-th-content-additional-link.invisible(aria-hidden="true")
@@ -262,10 +269,10 @@ mixin table_student(period)
 					div.plans-v2-table-comments-icon
 					div.plans-v2-table-comments-icon
 						i.fa.fa-comments-o
 						i.fa.fa-comments-o
 					.plans-v2-table-btn-buy-container-mobile
 					.plans-v2-table-btn-buy-container-mobile
-						+btn_buy_student_university
+						+btn_buy_student_university(period)
 					p.plans-v2-table-th-content-benefit !{translate("all_our_group_plans_offer_educational_discount", {}, [{name: 'b'}, {name: 'b'}])}
 					p.plans-v2-table-th-content-benefit !{translate("all_our_group_plans_offer_educational_discount", {}, [{name: 'b'}, {name: 'b'}])}
 					.plans-v2-table-btn-buy-container-desktop
 					.plans-v2-table-btn-buy-container-desktop
-						+btn_buy_student_university
+						+btn_buy_student_university(period)
 			th
 			th
 
 
 		for planFeaturesPerSection in planFeatures.student
 		for planFeaturesPerSection in planFeatures.student
@@ -356,6 +363,11 @@ mixin group_plans_license_picker()
 				id="plans-v2-license-picker-select"
 				id="plans-v2-license-picker-select"
 				autocomplete="off"
 				autocomplete="off"
 				data-ol-plans-v2-license-picker-select
 				data-ol-plans-v2-license-picker-select
+				event-tracking="plans-page-group-size"
+				event-tracking-mb="true"
+				event-tracking-trigger="click"
+				event-tracking-element="select"
+				event-segmentation='{"plans-page-layout-v2": "new-plans-page"}'
 			)
 			)
 				option(value="2") 2
 				option(value="2") 2
 				option(value="3") 3
 				option(value="3") 3
@@ -371,6 +383,11 @@ mixin group_plans_license_picker()
 					id="license-picker-educational-discount"
 					id="license-picker-educational-discount"
 					autocomplete="off"
 					autocomplete="off"
 					data-ol-plans-v2-license-picker-educational-discount-input
 					data-ol-plans-v2-license-picker-educational-discount-input
+					event-tracking="plans-page-edu-discount"
+					event-tracking-mb="true"
+					event-tracking-trigger="click"
+					event-tracking-element="checkbox"
+					event-segmentation='{"plans-page-layout-v2": "new-plans-page"}'
 				)
 				)
 				span #{translate("apply_educational_discount")}
 				span #{translate("apply_educational_discount")}
 			//- will only appear on screen width >= 768px (using CSS)
 			//- will only appear on screen width >= 768px (using CSS)
@@ -419,17 +436,17 @@ mixin btn_buy_individual_free()
 mixin btn_buy_individual_personal(period)
 mixin btn_buy_individual_personal(period)
 	+btn_buy_individual('paid-personal', period, false)
 	+btn_buy_individual('paid-personal', period, false)
 	if (period === 'monthly')
 	if (period === 'monthly')
-		small.plans-v2-table-th-content-additional-link !{translate("or_buy_now", {}, [{name: 'a', attrs: {href: '/user/subscription/new?planCode=paid-personal&currency=' + recommendedCurrency + '&itm_campaign=plans&itm_content=card'}}])}
+		+additional_link_buy('paid-personal', period)
 
 
 mixin btn_buy_individual_collaborator(period)
 mixin btn_buy_individual_collaborator(period)
 	+btn_buy_individual('collaborator', period, true)
 	+btn_buy_individual('collaborator', period, true)
 	if (period === 'monthly')
 	if (period === 'monthly')
-		small.plans-v2-table-th-content-additional-link !{translate("or_buy_now", {}, [{name: 'a', attrs: {href: '/user/subscription/new?planCode=collaborator&currency=' + recommendedCurrency + '&itm_campaign=plans&itm_content=card'}}])}
+		+additional_link_buy('collaborator', period)
 
 
 mixin btn_buy_individual_professional(period)
 mixin btn_buy_individual_professional(period)
 	+btn_buy_individual('professional', period, false)
 	+btn_buy_individual('professional', period, false)
 	if (period === 'monthly')
 	if (period === 'monthly')
-		small.plans-v2-table-th-content-additional-link !{translate("or_buy_now", {}, [{name: 'a', attrs: {href: '/user/subscription/new?planCode=professional&currency=' + recommendedCurrency + '&itm_campaign=plans&itm_content=card'}}])}
+		+additional_link_buy('professional', period)
 
 
 mixin btn_buy_group_collaborator() 
 mixin btn_buy_group_collaborator() 
 	a.btn.btn-default.plans-v2-table-btn-buy(
 	a.btn.btn-default.plans-v2-table-btn-buy(
@@ -475,15 +492,44 @@ mixin btn_buy_student_student(period)
 		else 
 		else 
 			span #{translate("buy_now")}
 			span #{translate("buy_now")}
 	if (period === 'monthly')
 	if (period === 'monthly')
-		small.plans-v2-table-th-content-additional-link !{translate("or_buy_now", {}, [{name: 'a', attrs: {href: '/user/subscription/new?planCode=student&currency=' + recommendedCurrency + '&itm_campaign=plans&itm_content=card'}}])}
+		+additional_link_buy('student', period)
 
 
-mixin btn_buy_student_university()
+mixin btn_buy_student_university(period)
 	a.btn.btn-default.plans-v2-table-btn-buy(
 	a.btn.btn-default.plans-v2-table-btn-buy(
 		href="/for/enterprises/sales-contact"
 		href="/for/enterprises/sales-contact"
 		target="_blank"
 		target="_blank"
+		event-tracking="plans-page-click"
+		event-tracking-mb="true"
+		event-tracking-trigger="click"
+		event-segmentation='{"button": "student-university", "location": "table-header-list", "period": "' + period + '", "plans-page-layout-v2": "new-plans-page"}'
 	)
 	)
 		span #{translate("contact_us_lowercase")}
 		span #{translate("contact_us_lowercase")}
 
 
+mixin additional_link_group(plan)
+	- var buttonSegmentation = plan + '-link'
+	small.plans-v2-table-th-content-additional-link
+		| #{translate("or")} 
+		a(
+			href="/for/enterprises/sales-contact"
+			target="_blank"
+			event-tracking="plans-page-click"
+			event-tracking-mb="true"
+			event-tracking-trigger="click"
+			event-segmentation='{"button": "' + buttonSegmentation + '", "location": "table-header", "plans-page-layout-v2": "new-plans-page"}'
+		) #{translate("contact_us_lowercase")}
+
+mixin additional_link_buy(plan, period)
+	- var buttonSegmentation = plan + '-link'
+	small.plans-v2-table-th-content-additional-link
+		| #{translate("or")} 
+		a(
+			href="/user/subscription/new?planCode=paid-personal&currency=" + recommendedCurrency + "&itm_campaign=plans&itm_content=card"
+			event-tracking="plans-page-click"
+			event-tracking-mb="true"
+			event-tracking-trigger="click"
+			event-segmentation='{"button": "' + buttonSegmentation + '", "location": "table-header", "period": "' + period + '", "plans-page-layout-v2": "new-plans-page"}'
+		) #{translate("buy_now_no_exclamation_mark")}
+
 mixin table_sticky_header
 mixin table_sticky_header
 	.row.plans-v2-table-sticky-header.plans-v2-table-sticky-header-individual.sticky(data-ol-plans-v2-table-sticky-header='individual')
 	.row.plans-v2-table-sticky-header.plans-v2-table-sticky-header-individual.sticky(data-ol-plans-v2-table-sticky-header='individual')
 		.plans-v2-table-sticky-header-item
 		.plans-v2-table-sticky-header-item

+ 7 - 0
services/web/frontend/js/features/event-tracking/index.js

@@ -19,10 +19,17 @@ function setupEventTracking(el) {
   const sendMB = el.getAttribute('event-tracking-mb')
   const sendMB = el.getAttribute('event-tracking-mb')
   const trigger = el.getAttribute('event-tracking-trigger')
   const trigger = el.getAttribute('event-tracking-trigger')
   const sendOnce = el.getAttribute('event-tracking-send-once')
   const sendOnce = el.getAttribute('event-tracking-send-once')
+  const element = el.getAttribute('event-tracking-element')
   const segmentation = JSON.parse(el.getAttribute('event-segmentation') || '{}')
   const segmentation = JSON.parse(el.getAttribute('event-segmentation') || '{}')
   segmentation.page = window.location.pathname
   segmentation.page = window.location.pathname
 
 
   function submit() {
   function submit() {
+    if (element === 'checkbox') {
+      segmentation.checkbox = el.checked ? 'checked' : 'unchecked'
+    } else if (element === 'select') {
+      segmentation.selectValue = el.value
+    }
+
     if (sendMB) {
     if (sendMB) {
       if (sendOnce) {
       if (sendOnce) {
         eventTracking.sendMBOnce(key, segmentation)
         eventTracking.sendMBOnce(key, segmentation)

+ 6 - 3
services/web/frontend/js/pages/user/subscription/plans-v2/plans-v2-main.js

@@ -1,5 +1,6 @@
 import '../../../../marketing'
 import '../../../../marketing'
 
 
+import * as eventTracking from '../../../../infrastructure/event-tracking'
 import {
 import {
   setUpStickyHeaderObserver,
   setUpStickyHeaderObserver,
   switchStickyHeader,
   switchStickyHeader,
@@ -65,9 +66,11 @@ function setUpTabSwitching() {
 
 
     el.querySelector('a').addEventListener('click', function (e) {
     el.querySelector('a').addEventListener('click', function (e) {
       e.preventDefault()
       e.preventDefault()
-      // TODO: analytics
-      // eventTracking.send('subscription-funnel', 'plans-page', `${view}-prices`)
-      // eventTracking.sendMB('plans-page-toggle', { button: view })
+      eventTracking.send(
+        'subscription-funnel',
+        'plans-page',
+        `${viewTab}-prices`
+      )
       selectTab(viewTab)
       selectTab(viewTab)
     })
     })
   })
   })

+ 11 - 1
services/web/frontend/js/pages/user/subscription/plans.js

@@ -3,6 +3,8 @@ import '../../../features/plans/group-plan-modal'
 import * as eventTracking from '../../../infrastructure/event-tracking'
 import * as eventTracking from '../../../infrastructure/event-tracking'
 import getMeta from '../../../utils/meta'
 import getMeta from '../../../utils/meta'
 
 
+const PLANS_PAGE_LAYOUT_V2 = 'plans-page-layout-v2'
+
 let currentView = 'monthly'
 let currentView = 'monthly'
 let currentCurrencyCode = getMeta('ol-recommendedCurrency')
 let currentCurrencyCode = getMeta('ol-recommendedCurrency')
 
 
@@ -23,11 +25,16 @@ function selectView(view) {
 }
 }
 
 
 function setUpViewSwitching(liEl) {
 function setUpViewSwitching(liEl) {
+  const plansPageV2SplitTestVariant =
+    getMeta('ol-splitTestVariants')?.[PLANS_PAGE_LAYOUT_V2] ?? 'default'
   const view = liEl.getAttribute('data-ol-view-tab')
   const view = liEl.getAttribute('data-ol-view-tab')
   liEl.querySelector('a').addEventListener('click', function (e) {
   liEl.querySelector('a').addEventListener('click', function (e) {
     e.preventDefault()
     e.preventDefault()
     eventTracking.send('subscription-funnel', 'plans-page', `${view}-prices`)
     eventTracking.send('subscription-funnel', 'plans-page', `${view}-prices`)
-    eventTracking.sendMB('plans-page-toggle', { button: view })
+    eventTracking.sendMB('plans-page-toggle', {
+      button: view,
+      PLANS_PAGE_LAYOUT_V2: plansPageV2SplitTestVariant,
+    })
     selectView(view)
     selectView(view)
   })
   })
 }
 }
@@ -46,6 +53,8 @@ function setUpCurrencySwitching(linkEl) {
 }
 }
 
 
 function setUpSubscriptionTracking(linkEl) {
 function setUpSubscriptionTracking(linkEl) {
+  const plansPageV2SplitTestVariant =
+    getMeta('ol-splitTestVariants')?.[PLANS_PAGE_LAYOUT_V2] ?? 'default'
   const plan =
   const plan =
     linkEl.getAttribute('data-ol-tracking-plan') ||
     linkEl.getAttribute('data-ol-tracking-plan') ||
     linkEl.getAttribute('data-ol-start-new-subscription')
     linkEl.getAttribute('data-ol-start-new-subscription')
@@ -63,6 +72,7 @@ function setUpSubscriptionTracking(linkEl) {
       button: plan,
       button: plan,
       location,
       location,
       period,
       period,
+      PLANS_PAGE_LAYOUT_V2: plansPageV2SplitTestVariant,
     })
     })
   })
   })
 }
 }

+ 1 - 0
services/web/frontend/stylesheets/app/plans-v2.less

@@ -875,6 +875,7 @@ strike.plans-v2-table-annual-price-before-discount {
 }
 }
 
 
 small.plans-v2-table-th-content-additional-link {
 small.plans-v2-table-th-content-additional-link {
+  text-transform: lowercase;
   margin-top: @margin-xs;
   margin-top: @margin-xs;
   font-size: @font-size-extra-small;
   font-size: @font-size-extra-small;
   height: 16px;
   height: 16px;

+ 1 - 2
services/web/locales/en.json

@@ -1310,6 +1310,7 @@
   "restricted": "Restricted",
   "restricted": "Restricted",
   "start_x_day_trial": "Start Your __len__-Day Free Trial Today!",
   "start_x_day_trial": "Start Your __len__-Day Free Trial Today!",
   "buy_now": "Buy Now!",
   "buy_now": "Buy Now!",
+  "buy_now_no_exclamation_mark": "Buy now",
   "cs": "Czech",
   "cs": "Czech",
   "view_all": "View All",
   "view_all": "View All",
   "terms": "Terms",
   "terms": "Terms",
@@ -1734,8 +1735,6 @@
   "saving_20_percent": "Saving 20%!",
   "saving_20_percent": "Saving 20%!",
   "feature_included": "Feature included",
   "feature_included": "Feature included",
   "feature_not_included": "Feature not included",
   "feature_not_included": "Feature not included",
-  "or_contact_us": "or <0>contact us</0>",
-  "or_buy_now": "or <0>buy now</0>",
   "all_our_group_plans_offer_educational_discount": "All of our <0>group plans</0> offer an <1>educational discount</1> for students and faculty",
   "all_our_group_plans_offer_educational_discount": "All of our <0>group plans</0> offer an <1>educational discount</1> for students and faculty",
   "unlink_dropbox_folder": "Unlink Dropbox Account",
   "unlink_dropbox_folder": "Unlink Dropbox Account",
   "unlink_dropbox_warning": "Any projects that you have synced with Dropbox will be disconnected and no longer kept in sync with Dropbox. Are you sure you want to unlink your Dropbox account?",
   "unlink_dropbox_warning": "Any projects that you have synced with Dropbox will be disconnected and no longer kept in sync with Dropbox. Are you sure you want to unlink your Dropbox account?",