Context
For our voter registration efforts, we've been using two platforms -- TurboVote (TV) and Rock the Vote (RTV). We've already documented and done the work to import the TV file and now we need to do the same with the RTV file.
Here's what the referral code looks like in the RTV file (NS ID hidden) -- a major difference from the TV referral code is that it some also includes iframe?r=
:
Similar to the TV file, the referral code:
- Might be populated
- Might have NS ID
- Might have a campaign ID, but no Run, vice versa, or have both
- Might be a duplicate if a user returns again
We want to import this CSV into Rogue as signups and posts so that these users can be served experiences based on their registration status, they can be messaged, and we can accurately report this information in Looker (and do deeper data analysis when needed).
Problem
RTV records and Rogue posts do not have the same schema! We want to figure out how to store RTV records in Rogue so that other DoSomething Apps can get this information via the Rogue API and be able to serve this data to internal teams and serve customized user experiences based on a user’s registration status.
Solution
Use Chompy, our importer app!
Record cleaning 💅
There are some records that might show up in the RTV record that we want to ignore. The rules around that data cleaning are outlined below:
- If an
email
includes thing.org
in the address, ignore it.
- If an
email
includes @dosome
in the address, ignore it.
- If a last name includes
Baloney
, ignore it.
- If an email includes
test
, ignore it.
- If an email includes
rockthevote.com
, ignore it.
- If an email includes
+
, ignore it
- If an email includes Ashley or Luke's personal email address (not posting here for privacy)
Status Translation Rules
Ultimately, there are 4 post
statuses we want to capture for voter-reg
posts for Rock the Vote (Note RTV doesn't have a confirmed
status like TurboVote did):
register-form
- User completed the registration form
register-OVR
- User completed the registration form on their state's Online Voter Registration platform
ineligible
- User is ineligible to register for whatever reason
uncertain
- We can not be certain about this user registration status
This is the logic for how to determine what a post
status should be.
- If
status
is complete
and finish with state
is no
--> register-form
- If
status
is complete
and finish with state
is yes
--> register-OVR
- If
status
is any of the step
s --> uncertain
- If
status
is rejected
--> ineligible
Because we're pulling some of the columns into the post details, data will then be able to know if they, for example, pre-registered or why their registration was ineligible.
Status Hierarchy
**When a RTV CSV has multiple records per user we use the following hierarchy to determine which status should be reported on the Rogue post. If when importing, there is an existing status per the campaign and user from any previous import (TV or RTV), follow the hierarchy. **
register-form
register-OVR
confirmed
ineligible
uncertain
For example: If a user has a confirmed
status already from a TV import, and the RTV file suggests that it should be uncertain
, do not update.
We’ve established this hierarchy because each time a user interacts with the RTV form a new row is created in the CSV. There are the edge cases when a user is chased to finish their registration that they would be interacting with the same row (thus the "steps"). The hierarchy is the simplest approach to dealing with varying statuses, but we anticipate some edge cases that we may need to deal with as they come up.
Here’s one example:
- User A completes the RTV form —>
register-form
status
- User A, for whatever reason, starts the RTV form again and drops off -->
uncertain
status
In this case, we would want to count the form completion (register-form
). It’s important to note that the hierarchy is for internal reporting and doesn’t prevent the user from interacting with the RTV form if they want to do so.
Dealing with Non-Member Registrants
If the referral column doesn't have a NS ID, we should do what we do with the TV import.
- Try to match to a member on number
- Try to match to a member on email
If those don't work, then create a NS account for them with the relevant information (First name, last name, contact information) like we do with TurboVote. For the sms_status
we should populate it for the time being with what's in the partner SMS opt-in column.
Note: Referral links will come in this format: https://vote.dosomething.org/member-drive?userId=NSID&r=user:NSID,campaign:####,campaignRunID=####,referral=true
How to count these as impact
Based on the above statuses, some should be counted as a RB and some should not. This determination was made by the executive team and allows us to report internally progress towards the organization's report back goal. Here's what counts as a reportback from the RTV export:
register-form
register-OVR
Note: register-form
and register-OVR
are the only statuses that count as registrations.
Rogue will NOT store this information, but will return a derived value in the JSON response when the voter registration post is created or read that holds this information. The logic to determine this is as follows:
if (in_array($rogueStatus, ['confirmed', 'register-form', 'register-OVR'])) {
$reportbackStatus = 'T';
} else {
$reportbackStatus = 'F';
}
Other Important Information
- The
details
on the post will have the row of information available for data to use.
- The
submission_created_at
date is when the importer ran. Details about when the registration was created/updated are in the source_details
.
- All of these signups will have a
source
of importer-client
(this is how messaging is suppressed in C.io)
- All of these posts have a
type
= voter-reg
- The month that the registration came in is what informs the
action
column (e.g., february-2018-rockthevote)
- For now, if not available in the referral, we will attribute every
voter-reg
post to the Grab the Mic campaign to maintain a 1:1 relationship. This is what we have done with TurboVote.
- Quasar will be pushed these posts from Rogue but if Data needs to do a deeper analysis, they will use the raw RTV CSV to do that work.
- If a user shares their UTM'ed URL with other people, there could be duplicate referral codes but associated with different registrants:
See a screenshot of what this data looks like (note: the user depicted in this spreadsheet is fake.)
Next Steps
- Create this logic for RTV
- Start importing!
- Move post voter reg status onto NS profile
- Coordinate w/ Marketing for email (weeklydo only) and sms suppression (no status filled)
Open Questions
- How can we distinguish between TV and RTV import? Do we need to?
- RTV has more birthdays in it, can we use that on the NS profile when we create accounts? (TV didn't provide this)
- We've been having some Chompy validation issues w/ the TV import -- is this the good time to tackle those things? If so, is a running list the best way of communicating some of the things we've seen in the referral column? There's one specific referral that's different and it's just
ads
-- these are from Google ads and the only way they could set up tracking that Google likes. Would love to talk through best way to deal with these...if it's something unique!