On Friday, April 22, we had an uneventful evening in the office. We moved. And that was it. We expected more excitement (bottles of Prosecco awaited), but our planning and execution of migrating from meetearnest.com to earnest.com—a milestone in our startup story—made it a seamless and indeed anticlimactic transition.
However, it was the behind-the-scenes work and key decisions leading up to the big day made that it all seem effortless. We wanted to share with you what happened under the hood, how our teams worked together, and how we moved our clients to our new home at earnest.com.
Getting Everything on the Table
Securing our .com was met with excitement from everyone at Earnest earlier this spring, yet the transition was just beginning and required coordination from nearly every team. The largest involvement in our ecosystem was from Infrastructure, Engineering, Marketing, Design, IT, Communications, and Legal.
The first step was getting those who best knew our business and systems into the same room to talk through requirements and potential snags. By exposing areas of focus and getting everyone on the same page, it allowed us to begin choreographing the move. It also helped us identify shared success criteria for the migration:
- Zero downtime and disruption to clients
- Zero loss of site traffic, affiliate and referral tracking, redirections, etc.
- Zero negative SEO impact
- Zero disruption to Earnest employees (accounts, email addresses, internal applications)
Establishing Our Timeline
After gathering all of our requirements, we next identified the date and time for the switch. We’ve executed migrations and upgrades before and know our lowest traffic occurs from Friday evening through early Saturday morning. That was the most opportune time. The date itself was more challenging. We had to allow for both sufficient planning and lead times required to secure Google Apps, SSL certificates, execute SEO strategy, and update our applications. Additionally, we needed to minimize impact to our business objectives. With this in mind, we settled on April 22, which gave us three weeks to plan.
Three Weeks Out: Making a Technical Plan and Key Decisions
Three weeks from the big day we focused on detailed requirements analysis. We met 1:1 with stakeholders to ensure we understood the details, affected parties and systems, and what acceptance criteria looked like. Once we had completed this discovery phase, we crafted our technical plan.
We would start by migrating our staging environment. Once complete, we would make our production environment available at earnest.com while on our internal network. This allowed for sufficient testing without impacting our clients. Here’s what the infrastructure and engineering schedules looked like:
Infrastructure Timeline & Key Tasks
- Acquire SSL certificates for staging domains
- Rollout staging environment (point OpsWork, Kubernetes to new domain)
- Redirect current staging environment to new staging environment
- Set up and point earnest.com to new production stack (restricted internal access only)
- Implement nginx redirect from *.meetearnest.com to *.earnest.com
Engineering Timeline & Key Tasks
- Migrate staging fixtures to support @earnest.com for internal tools
- Update applications to use earnest.com in emails, site links, and tests
- Update Google Maps for addresses
- Update Google Auth for tools
- Update LinkedIn API integration
- Ensure 3rd-party integrations would support a change in domains (Google Analytics, Mixpanel, Segment, etc.)
While these plans certainly helped set the stage for a successful migration, what really led to an uneventful evening were the key decisions we made early on. Here are some of those decisions, which we hope are instructive to anyone confronted with a similar task of migrating domains.
Redirect Before the Switch?
As we didn’t migrate the day the domain became available to us, we were left with the decision of whether or not to temporarily redirect earnest.com to meetearnest.com. After research and consulting with folks both internally and externally, we decided against doing so for the purposes of SEO.
A temporary 302 redirect sounded enticing, but it turns out that after a time Google treats 302 as a permanent 301 redirect. Given the added work, minimal benefit, and a desire to minimize recovery to our search authority, we left earnest.com untouched until the migration.
Segmenting Outbound Email
Another key decision we made as a part of the migration was to segment our business, transactional, and marketing email. This allowed us to have tighter controls around the earnest.com domain by cleaning our MX/SPF/DKIM records. It let the world know who is allowed to send outbound emails as someone claiming to be from Earnest. This, in turn, lets us delegate marketing emails to a sub-domain managed by our third-party mail provider, which eventually improves deliverability to our clients. We started implementing and testing these a few weeks ahead to ensure we had all our ducks in a row.
Cutover & Rollback: DNS or 301 Redirect?
We made sure a few weeks ahead of time that the DNS TTLs on all our primary domains were turned to the lowest allowed values on Route53, our DNS provider. We debated the merits of a DNS change from meetearnest.com to earnest.com versus a 301 redirect on the meetearnest.com web server that sent all traffic to earnest.com. Availability being the highest concern and given the possibility of misconfigured DNS servers not honoring our TTLs, we decided to go with a 301 redirect. This option allowed us to have a quick rollback procedure in case of catastrophic failure of earnest.com servers during launch; all we would have to do is remove the 301 redirects and our legacy domain would still be up and serving traffic. Thankfully, however, our migration went without a problem and we did not have to rely on the rollback procedures.
Google Apps and Email: Domain Alias or New Domain?
It’s always our IT team’s goal to make transitions as seamless and invisible as possible. When deciding how to migrate emails and applications, we had to choose between recommended methods for short-term success and what was best for Earnest in the long term. We weighed Google’s suggested method of adding a domain alias against moving fully into the new domain.
With the suggested alias addition, each user would be given an email address on the new domain, but all our services would still be branded with meetearnest.com. That option seemed messy and limiting in the long run. We’re only going to grow so moving fully into a new domain was the better option while we’re “small.” Plus we can drop off correspondence @meetearnest.com to end-users whenever the time comes.
There were a lot of precautions, but as we’re not a heavy usage Google shop, beyond Mail, OAuth, Drive, and Hangouts, we were minimally affected. The only thing that is now broken and will take some time for Google to get reprovisioned are our Chromeboxes for meetings. And at the moment, they still work! The risks, despite Google’s initial pushing toward the “easier” option, were pretty low and non-affecting to our environment, so it’s good that we probed deeper into that before just taking Google’s word on it.
Prioritizing Services Migration
The other critical IT decision was to prioritize the migration of public-facing services like email and those that require authentication against Google (OAuth). We delayed migrating all other services, including those that use SSO and SAML, which were also critical pieces to follow the migration. Instead of switching those over at the same time as public services and hoping all went well, we opted to push them out a few weeks. Once the dust settles we’ll tackle the remainder.
Planning for SEO & Marketing Consistency
One of the larger and looming set of decisions was around SEO. The goal was to have zero negative impact on our organic traffic and mitigate any drop in our position / search ranking. Clearly, changing a domain will impact (to some level) the content indexed. Our priority was to deploy a set of best practices prior to our move and over-communicate with search engines immediately after the migration to ensure we regained our position. It was critical to monitor our branded and non-branded ranking of our new domain on a continual basis to track success.
The following checklist was followed before the migration:
- Build new sitemaps and work with Engineering on URL mapping
- Eliminate redirect chains
- Perform crawls of our staging environment to ensure all content and links rendered correctly
- Ensure both old and new domains were configured within Google Search Console (GSC) & Bing Webmaster Tools
- Submit both the old and new sitemaps as extra precaution
Once the migration was finished and earnest.com was live, we updated the change of address in GSC. The extra precaution and effort from an SEO perspective allowed Google to crawl and index our new domain as soon as possible.
In parallel to the technical SEO planning, it was important for us to audit existing traffic channels, data integrations, and benchmark top non-brand keyword positions for meetearnest.com. This included:
- An audit of all active acquisition channels and ads to catalog URLs and assets that would need updating
- Evaluate all site cookies and pixels to determine those that checked against meetearnest.com and would need to be updated to earnest.com to ensure no loss of behavior or performance analytics
- An audit of all Segment integrations to determine if any settings required updating our domain name
- Communicate internally that switching the domain will give users a “new cookie” and that we may see an initial spike in new users once the migration happened
Next, we wanted to prepare an update for all paid, owned and earned channels by creating new display & destinations URLs. This included:
- Duplicate/create all ads with new destination URLs and display URLs; have those geared up so that in the minutes after launch, the new ads were able to get turned on; monitoring any affect or change to our performance through the weekend (minimal)
- This also meant for some channels, like podcasts, that we developed two separate scripts with our new domain for all shows going live after 4/22; these shows were recorded several weeks in advance so planning on acquisition channel update needed to happen as soon as the date of the migration was finalized.
- For ads where the URL was in the display creative (such as Pinterest), we worked with our design team to change to earnest.com and launched those at the time of the migration.
- A consistent test on all redirects to ensure no UTM parameters were stripped and that the new URL structure displayed as expected
Two Weeks Out: Staying on Track
Two weeks out, with key decisions made, we started executing behind the scenes. We had standup meetings on Monday, Wednesday, and Friday to keep things on track, coordinate across Engineering and Infrastructure, and our Marketing and IT teams to ensure we were all moving forward in sync. We also developed an internal communications doc for employees to answer FAQ they may have. We also brought the message to the whole company with a live presentation to at our weekly company-wide All Hands meeting.
One Week Out: Execution
The week of the migration, we were granular and had a daily plan, which our Growth Engineering Lead put together and executed with support of our Infrastructure and QA teams:
|Wednesday||Anytime||Send internal email only incidents or P0s can be merged or deployed by team leads|
|TBD||Internal email communication: Staging Internal and WWW will be available later today|
|Anytime||Code freeze. Set github.com/meetearnest permissions to READ-only for engineering & contractors (allow leads to merge)|
|Anytime||Update NGINX on legacy Staging OpsWorks, redirecting all traffic from www.staging.meetearnest.com to www.staging.earnest.com|
|Anytime||Ensure Smoke Tests are able to run successfully on new Staging|
|Anytime||Team leads to validate new Staging stack works|
|Thursday||Anytime||Update CI & CLI deployments to deploy to new Staging OpsWorks|
|Anytime||Test deployment to new Staging OpsWorks for CLI|
|Anytime||Update CI with access to deploy to new Staging OpsWorks|
|Anytime||Complete, merge and deploy banner to new staging and production|
|Friday||Anytime||Update and merge PR with all copy edits|
|Anytime||Update CI & CLI deployments to deploy to new Production OpsWorks|
|Anytime||Test deployment to new Production OpsWorks for CLI|
|Anytime||Run QA synthetic tests in new (internal) production|
|Anytime||Internal GA production testing (all internal teams should be using *.internal.earnest.com)|
|Anytime||Ensure monitoring is reporting (NewRelic & DataDog)|
|Anytime||Team leads to validate new Production stack is working properly|
|7:00 PM||Communicate that process will begin at 7:30 PM|
|7:30 PM||Change Sendgrid whitelisting defaults to earnest.com|
|7:30 PM||Update NGINX on new Production OpsWorks, redirecting all legacy traffic from www.meetearnest.com to www.earnest.com|
|7:30 PM||Run QA synthetic tests in new (public) production|
|Team leads to validate new Production stack is working properly|
|7:30 PM||Migrate primary email accounts from @meetearnest.com to @earnest.com addresses|
|7:32 PM||Run DB migration for internal users to @earnest.com address|
Updating Our Clients About the Change
We broke the news to our clients with an email and blog post the day before the migration announcing our move. It was an exciting moment for all of us and helped make sure that our clients knew emails and alerts from the new domain weren’t tied to phishing or other malevolent activities.
We also planned for a site-wide banner the day of the migration to over-communicate to returning users that everything is exactly the same, just a new web address:
April 22: Move Day
The day of the migration, our Infrastructure Team put together a by-the-minute plan for the migration:
|7:20||Start tailing logs for all www & API servers on both meetearnest.com and earnest.com||Preparation|
|7:27||7:20||Push meetearnest.com production nginx configs to s3|
|7:32||7:25||Add public access security groups to www.earnest.com and api.earnest.com ELB’s||Making Earnest.com Live|
|7:33||7:30||Verify earnest.com is reachable over a non-internal network (e.g. your cell phone, non-vpn home computer)|
|7:40||7:30||Redeploy last release of production www app, picking up the new nginx configs with redirects.||Redirecting meetearnest.com -> earnest.com|
|7:40||7:35||Verify meetearnest.com, www.meetearnest.com (and https equivalents) are redirecting to https://www.earnest.com||Validate redirect and begin basic testing|
|7:48||7:40||Turn on Non-Cron-scheduler Production servers||Switch Task Runner|
|7:30||7:firstname.lastname@example.org the default in email sender|
|7:50||7:45||Deploy the latest configs to Production|
|7:52||7:50||Turn off all meetearnest.com Production servers (Non-Cron and Cron)|
|7:55||8:00||Turn on Cron-Scheduler in Production|
|7:56||8:00||Deploy the latest configs to Production|
|8:00||8:10||Test all-the-things||full earnest.com site validation|
We had a Google hangout with remote folks and it was all done within minutes. The rollback plan remained dormant and untouched. By 9:03pm we were live across the board:
Immediately after the switch, we jumped into the live view from our analytics dashboards to see all user sessions being captured and all actions/events firing exactly as they should. We also ran a full crawl of our site post launch to monitor all 301s to ensure all metadata and canonical tags were being captured as expected and monitored traffic through the weekend.
In addition to the data be captured correctly, we also evaluated our position in Google Search Console, Moz, and SEMrush.
- Crawl stats and index status of earnest.com in GSC showed all pages and content being accessed by Googlebot
- Regained position of all top brand & non-brand keywords shortly after launch (brand keywords within first few days, non-brand keywords within the first week)
Thanks to the dedicated planning, coordination, and superb execution, we had minimal cleanup awaiting us over the weekend and through the following week. Switching anomaly detection, monitoring traffic, updating external job boards and the like, remained among the few housekeeping exercises we had to knock out. Otherwise, it has been business as usual. Somewhat lackluster, but everything we needed and wanted it to be. We’re settling in and loving our new home and hope this post can guide other teams as they navigate the ever-evolving Web.