diff --git a/app/controllers/api/schools_controller.rb b/app/controllers/api/schools_controller.rb index 9bc829bb8..f4d9956c9 100644 --- a/app/controllers/api/schools_controller.rb +++ b/app/controllers/api/schools_controller.rb @@ -2,6 +2,16 @@ module Api class SchoolsController < ApiController + MARKETING_PARAMETER_KEYS = %i[ + utm_source + utm_medium + utm_campaign + utm_term + utm_content + gclid + fbclid + ].freeze + before_action :authorize_user load_and_authorize_resource skip_load_and_authorize_resource only: :import @@ -20,7 +30,13 @@ def create if result.success? @school = result[:school] - track_event('School - Created', school_id: @school.id) + track_event( + 'School - Created', + marketing_parameters.merge( + school_id: @school.id, + first_landing_page: params[:first_landing_page] + ) + ) render :show, formats: [:json], status: :created else render json: { @@ -77,6 +93,13 @@ def import private + def marketing_parameters + marketing_params = params[:marketing_parameters] + return {} unless marketing_params.is_a?(ActionController::Parameters) + + marketing_params.permit(*MARKETING_PARAMETER_KEYS).to_h + end + def create_params params.expect( school: %i[name diff --git a/spec/features/school/creating_a_school_spec.rb b/spec/features/school/creating_a_school_spec.rb index f288d719a..90d15f3a2 100644 --- a/spec/features/school/creating_a_school_spec.rb +++ b/spec/features/school/creating_a_school_spec.rb @@ -67,4 +67,40 @@ time: be_within(1.second).of(Time.current) ) end + + it 'records marketing parameters as top-level event properties' do + post( + '/api/schools', + headers:, + params: params.merge( + first_landing_page: '/signup', + marketing_parameters: { + utm_source: 'newsletter', + utm_campaign: 'back-to-school', + unexpected_email: 'person@example.com' + } + ) + ) + + properties = Event.last.properties + expect(properties).to include( + 'school_id' => School.last.id, + 'first_landing_page' => '/signup', + 'utm_source' => 'newsletter', + 'utm_campaign' => 'back-to-school' + ) + expect(properties).not_to have_key('marketing_parameters') + expect(properties).not_to have_key('unexpected_email') + end + + it 'ignores malformed marketing parameters' do + post( + '/api/schools', + headers:, + params: params.merge(marketing_parameters: 'newsletter') + ) + + expect(response).to have_http_status(:created) + expect(Event.last.properties).to eq('school_id' => School.last.id) + end end