I used to play Madden NFL franchise mode religiously as a kid.
I was obsessed with drafting the perfect fantasy team, designing the jerseys, managing the salary cap, and watching the seasons play out as some teams made the playoffs and others fell to the bottom of their divisions.
Fast-forward to early 2019.
Years had passed since I last fired up a console. While I originally set out to play a football simulation game, a novel idea popped into my head: why not create one?
Maybe even a multiplayer version that you could play online with your friends. How hard could it be to build something like that after all?
It seemed reasonable at the time. Plus, I could learn how to program and market a game at the same time.
The more I thought about it, the more excited I got about the idea.
I even came up with a name for the project: Move the Chains Football.
I thought it was genius (to my credit, it’s a pretty cool name).
Then I stepped back.
Hold on a second, I’m not a programmer by trade. Where do I even start?
I had some previous programming experience.
But I was far from a professional developer and I had never attempted to build anything this ambitious. My idea of programming was copying and pasting code from tutorials online. Where would I even start?
At the time, I also didn’t realize how much of a massive undertaking this project was going to be. Like most starry-eyed novices, you simply don’t know what you don’t know.
But I was determined to give this a shot, so that’s what I set out to do.
I’m going to first start by talking briefly about learning how to code, the market research process, my early plans for the game, and the early development stages.
Then I’ll jump into how I generated a bunch of sign-ups and validated the idea by driving traffic from Facebook ads to a landing page. Click here to skip to that section.
Lastly, I’ll touch upon continued development, pivoting, why I ended up failing, and how you can avoid the same mistakes I made.
Alright, let’s dive in.
It became obvious pretty quickly that I couldn’t just dive straight into building this game. I had to revisit the basics of Python and continue learning other core web development skills.
I’ll leave the full learning process for another post but basically, I started working my way through Automate the Boring Stuff with Python by Al Sweigart as a refresher tutorial and Corey Shafer’s tutorials on Youtube. I built your standard blog application, some automation scripts, and simple stuff like that.
I even began coding a basic command line version of the game in Python to get the hang of the object-oriented programming (OOP) paradigms I learned from Corey’s tutorials. Looking back on it today, my code was a plate of spaghetti but there’s no doubt I learned a lot throughout the process.
It also occurred to me that building a web application in Python would require some kind of web framework. After some further research online, all signs pointed to Django being the best option for rapid and secure development so I followed a few tutorials to get the fundamentals of that down as well.
If you’re interested in learning Django because you want to build cool stuff, I recommend starting with the official Django tutorial. That should give you the basics. Then build a full application (with help) using the Mozilla Django tutorial or Corey Shafer’s Django video series.
Make sure to brush up on your Python skills and a little bit of OOP before jumping into Django. Just don’t get stuck in tutorial purgatory as I did. Build and iterate on ideas of your own as soon as possible because that’s how you’ll learn the fastest. Plus it’s more fun.
Let’s put technology aside for a second and reflect on the market for this game.
There are a few simple football sim titles out there but nothing like what soccer fans have with the Football Manager series. European football has a much larger international market.
Despite the smaller market size, the research pointed to pigskin fans practically begging someone to develop a comprehensive football simulation game. Especially one they could play with friends.
No surprise there I guess. We all know how passionate people are about football here in the states.
Over the next few weeks, I immersed myself in these niche football forums online and a strange world of simulation football fanatics that I never knew existed.
I guess I’m not the only one after all.
Now that I was fully in tune with the market, it was time to look at the competition.
Through this research, I learned about a massive football sim project called Beyond the Sidelines planned for release by the same company that developed another popular sports simulation game called Out of the Park Baseball.
Unfortunately, the lead developer ended up passing away in the middle of the development process. As a result, that project stalled and a lot of people were heartbroken and disappointed.
This was the market validation I thought I needed.
Now I just had to build it and all the people would throw their money at me, right?
Eh, not quite.
If I could go back in time, I would engage with the market way more before starting to build.
After a few months of learning the basics of Django and web development, I decided it was time to start building out the MVP for the game.
Looking back, I didn’t put nearly enough consideration into the design, neither architecturally nor concerning the UI/UX.
For future projects, I would at least put together some wireframes or try to sketch out the structure of the MVP before writing a line of code. I would also make a list of what features to include and consider trimming that list down by at least 50% and maybe even cutting that in half.
It’s never going to be perfect right off the bat, but you can save a lot of time by planning these things out.
Throughout this early process, I struggled with translating my vision for the game into code. This was partly due to my lack of experience as a developer.
That said, I did make some decent progress early on. I managed to write a parser that randomly generated player names from a CSV of retired NFL players I found online. It also gave players realistic attributes based on their position.
Random names were necessary because using a player’s likeness without their permission is illegal.
It’s also not possible to use NFL team names without securing a licensing deal with the organization. Since EA has an exclusive deal with the NFL for Madden, I wasn’t able to use those team names in my production game under any circumstances unless I added a custom CSV roster import feature.
I did mess around with using them locally during development for fun though.
Here’s an early screenshot of what the roster screen looked like. Not the nicest looking piece of software in the world, but it was something.
Some other functionality I was able to add in the early prototype included:
- Creating, saving, and loading leagues
- Generating 32 teams in each league
- Randomly generating a full 53-man roster for each team with attributes
- Team homepages where you could edit your team info, view the roster, etc.
- User login - only showing leagues you were part of and editing teams you owned
As my tech stack evolved down the line, I added a lot more features but this was the base functionality I had right out of the gate.
I wanted to get the skeleton of the project setup before I moved on to the real bulk of the work - coding the actual simulation engine.
After a few weeks of working on the game and implementing the functionality above, I realized just how difficult doing this myself was going to be.
I started to toy with the idea of teaming up with a programmer or even taking on investors so I could hire some.
I also started getting shiny object syndrome as there were far simpler applications I could build that would likely be more profitable in a proven market.
Still, I was determined not to give up for at least a few more months. As a compromise, I decided to test demand for real with hard data before I wasted any more time building a game people weren’t even going to play.
Plus, I would get some real-world practice running Facebook ads.
My next move was to build a landing page with some strong copy, send some paid traffic to it, and hope for the best.
One of my favorite tools for building these quickly is the WordPress landing page builder Elementor. It requires no coding skills, just a basic knowledge of WordPress and a willingness to learn how the software works. Highly recommend you check it out.
After a few days, I had a basic WordPress funnel put together. The landing page outlined the features of the game with a few Call to Action (CTA) buttons, and a simple splash page with an email opt-in.
I hooked the forms up to the Mailchimp API and created an email list to collect leads. In Mailchimp, I put together an automated welcome email that told people more about my vision for the game and asked them to reply directly with any feedback they had to offer.
Lastly, I created a free Zoho mail account for my domain, configured DNS, and I was off to the races.
This was a very simple funnel but it’s all you need to run some basic ads for demand testing. I planned to simulate the sign-up process as if the game already existed, then clarify that we were in development in the welcome email and ask for feedback.
Below are a few screenshots showcasing partial snippets of the landing page I ran paid traffic to.
Above the fold, I placed a header with a CTA and a brief description of the game. Notice how I used a unifying color scheme that is familiar to football fans.
The next section is painting a picture in the user’s head about how they could play the game. The structure of the design is intended to keep them scrolling.
Here I went over a few of the main features that were important to the market and went into further detail about them.
This is an example of one of five snippets where I went deeper into the feature set and played further into the aspirational angle.
Lastly, I added another CTA at the bottom of the landing page and made it clear that we were still in development. If I were to do it over, I would’ve left that part out but being transparent was important for receiving good feedback, in my opinion.
I played around with designing a squeeze page to collect email addresses but ultimately went with just the landing page for my testing.
Again, nothing crazy.
The idea of the copy on the landing page was to sell the dream to my audience. Everyone who loves football wants to know what it feels like to be in control as the GM or head coach, and it’s in their competitive nature to beat out their friends in the process.
I also outlined some of the cool features I planned to include in the MVP like league customization, playbook design, and player development tracking.
I could speak to the market well because I was the market, so writing the copy came naturally. With that said, it’s always best to do some market research before writing copy - even if you think you know what your audience wants.
Now that the landing page and a simple funnel were set up, it was time to drive some traffic to it.
This was my first time running Facebook Ads but I created a local lead generation campaign with Google Adwords in the past, so I wasn’t completely new to paid traffic.
The reason I chose Facebook Ads was their targeting options. I knew that’s primarily where my market would be hanging out. It’s also a great place to advertise a web-based game on the cheap as opposed to say, Google search ads.
With paid search, you have to throw a little bit of money around to get some solid data on your audience. I planned to spend no more than $300-400 dollars on this campaign just to get a feel for the market.
That may seem like a decent chunk of change, but the market insight you get in return is 100% worth it.
Next, I’m going to go over the process of creating the ads and targeting options.
To start, I created a single A/B tested campaign with 2 ad sets, each with a single image ad. I was A/B testing creative, which was essentially just the ad copy. A/B testing is simply using two variants to test a hypothesis. In marketing, that’s usually finding out which variant performs better based on the collected data.
For the image, all I did was grab a high-quality picture of a football on a field from a royalty-free images site like Pexels. In hindsight, I probably should have used Photoshop or Canva to overlay some font. People don’t like to read small text.
Before running the ads, I made sure to set up a custom conversion for email sign-ups and of course install the Facebook pixel on my landing page to track them.
My daily budget was $100 per day split evenly between the ad sets. I scheduled the ads to start on Saturday afternoon and planned to leave them running for 3-4 days.
Lastly, I used the automatic option for my ad placements (optimized for conversions). This is just Facebook jargon for “let us figure out who to show your ads to”.
In my mind, the audience I was targeting fit into two categories: football fans and gamers.
I didn’t want to target each subset individually because I felt that was too broad. Not every football fan likes games and I’m positive not every gamer likes football.
Here’s a quick overview of what my targeting strategy looked like:
- Demographics: Men aged 18-50 living in the United States
- Primary interests: NFL, College Football, Fantasy football, American football
- Must also match: MMO games, Simulation games, Esports, Browser games, Sports games
Looking back on it, I wish I had targeted the 13-17 age range as well with a separate ad set. I left them out initially because I was trying to gauge the demand for customers with deeper pockets. Maybe the younger crowd would just steal their parent’s credit cards, who knows (don’t do this).
As I mentioned earlier, the ad copy was the variation I was A/B testing with these ads.
Unfortunately, I logged back into my Facebook Ads Manager to review the creative before writing this and discovered that I no longer have access to them. I must have removed the page it was tied to so I’m going to have to go off my memory alone here.
To sum it up, one ad was more verbose and direct, outlining the core features and what the game was all about. The other was more cryptic - it hit harder on the emotional side of things but didn’t give out as much info or reveal what the game was exactly.
To my surprise, they both ended up performing equally well. Let’s dive in and analyze the results.
I was tracking email sign-ups and ended up converting 482 people over the span of 4 days. This means that 482 people visited my landing page, saw value in what I had to offer, and opted-in via the sign-up form fully expecting to play the game.
I was quite happy with these results considering my initial doubts about the idea. Seeing your list grow from what was previously just a simple concept in your head and having that semi-validated in real-time is one of the best feelings ever (second to actual dollars in your bank account).
The on-page conversion rate itself was also very high. This is how many people who reached my landing page entered their email addresses.
I forgot to mention earlier that I also had a Goal set up in Google Analytics to track conversions alongside the Facebook pixel. You want to set this up so you don’t have to do the calculations manually based on the data in Facebook Ads Manager.
If we divide the total number of conversions (482) by the total amount of unique link clicks (1,684), the rate comes out to just over 28.6%.
That’s a pretty high conversion rate, which isn’t surprising considering how targeted the traffic was.
I suspect that most people who clicked on the link were really curious about what the game was all about once they got to the landing page. That and my copy was strong. An email address isn’t a huge commitment either, although if you’re like me you probably guard yours pretty closely.
Another notable metric was the Cost Per Result. This is how much ad spend was required for a single conversion - in this case, an email sign-up.
You could also technically define this as Cost Per Acquisition (CPA) if the value exchange involves a cash outlay of some sort. This is more typical in eCommerce where it’s likely that someone will buy from you before joining your email list.
In this case, I was just fishing for leads so it’s more accurate to call it the Cost per Lead (CPL).
So all in all, I was spending roughly $0.82 to get one person to commit to trying the game out.
While going through this whole process, I was racking my brain for how I could monetize this thing in the future. I had a few ideas floating around, but I was leaning towards some kind of freemium subscription model.
Without a complete funnel in place yet (there’s no bottom half of the funnel, which for most software products is email marketing and retargeting), this $0.82 figure could mean anything. It’s hard to say how meaningful it is.
If we were to gather some data on the conversion rate from lead to paying customer and an estimated churn rate, we would have a better idea of roughly what we’d be looking at for customer Lifetime Value (LTV). We could then more easily determine how much a lead is worth and work to stay under that number in our campaigns.
As a hypothetical exercise, let’s estimate that the conversion rate is 2.5%. This means I would convert a lead to a customer for every $32.80 in ad spend.
($0.82 * (1 / .025)) = $32.80
If the subscription costs are $9.99 per month and the average customer stays on for 6 months total across their lifetime, that’s a customer LTV of $27.14 because it cost $32.80 to acquire them.
($9.99 * 6) - 32.80 = $27.14
Of course, this doesn’t take into account additional expenses like server costs or customer support.
Impressions are how many times your ads are shown in total.
My test ads were able to reach almost 50k unique people and an additional 15k impressions were repeat placements, bringing the total to just under 55k. The Link CTR was 2.72% per impression and 3.42% per person, which means that 3.42% of people who were shown my ad clicked through to the landing page.
I think I could have gotten this above 5 percent if my image was stronger and I ran the ads for longer, tweaking the creatives as I gathered more data.
This was such a short test that it wasn’t worth doing any major ongoing A/B testing. I just wanted the ads to run and gather as much data as possible. This is why I did a more broad split test from the start with two slightly different approaches to the ad copy.
To get a better understanding of how my targeting was and what my audience demographics were like, I ran a few reports on age and geographic location by state.
Not surprisingly, lots of rural states like Texas and Ohio that are big into football made up the majority of the impression share. There were simply more people to target in these areas.
My CPM (cost per 1k impressions) metrics were much more favorable for the younger demographic. The older my audience got the worse they converted until it hit the 45-54 range where surprisingly my CPL dropped and the conversion rate went up significantly. The oldest demographic had a higher CTR as well.
I suspect part of this may have been due to a higher attention span (sorry younger generations, I know memes are entertaining).
That’s about it for the Facebook campaign. I thought it went pretty well for a first go.
I would love to give a longer-term campaign a shot in the future, as a short test like this doesn’t give you much flexibility or experience with ongoing campaign optimization.
While I was running the ads, I was also responding to a dozen or so emails that were coming through with suggestions.
In the welcome sequence, I encouraged users to reach out so I had some great 1-on-1 conversations with people. They had some great ideas for features and generally expressed their excitement for the release of the game.
I used Zoho mail for this which I can’t recommend enough if you’re ever in need of a free business email provider. It’s not perfect, but if you don’t want to drop 5 dollars per license on Google Workspace it’s a great free alternative.
Now that I had some semblance of validation for my idea, it was time to go back to the drawing board. I revisited which features I felt were necessary for the MVP and scrapped anything else where the trade-off between value and complexity was too high.
Even then, I was still determined to ship this as a multiplayer game and I believe that ambition combined with my stubbornness to do it all myself is where I fell short in the end. It was just too much and I wasn’t skilled enough yet as a web developer to pull it off.
In hindsight, I would have been better off releasing a single-player version first and improving on it over time.
Nevertheless, I continued for another month or two chipping away at the skeleton of the game.
Somewhere down the line, I decided that a Single Page Application (SPA) was the better move for a game like this so the data could update in real-time in the user’s browser. Plus I would have an API to build off if my users seemed interested in a mobile version of the game.
In the meantime, I moved away completely from rendering static templates in Django and converted all my existing views to Django REST Framework serializers. I was now fully on board with building an API that I could detach from my frontend static files.
It was at this point that I started to learn a lot more about modern web development, how to deploy Python applications and other useful tech knowledge.
As a multiplayer game, the game needed some way to invite your friends to a league.
To handle this, I implemented a basic invitation system that used Mailgun as a transactional SMTP provider. These are the types of services that are commonly used to send notifications, password reset attempts and other “transactional” emails.
I began to chip away at the actual simulation as well and started to get a better handle on OOP after reading the first few chapters of the book Problem Solving With Algorithms and Data Structures Using Python and going through the latter half of the Official Python.org Tutorial.
I had reached the point where most of the Django models and views I created to represent teams, players, leagues, seasons, and individual games were in place. I even had a basic simulation going where a team’s overall rating - calculated with the random attributes of each team’s players - was used to determine the winner of the game based on basic probabilities and a dice roll.
Now the scheduling algorithm and game loop are where I got somewhat lost.
I needed to create some kind of game loop so the seasons could be played out. To do that, I had to figure out how to write some kind of match scheduling algorithm. I wanted the game to be as realistic as possible, so I tried my hand at writing a complex set of algorithms to automatically generate a schedule at the start of each season.
Here’s the catch - I wanted it to be exactly like the NFL schedule where each team plays teams in their division and conference X amount of times. It’s more complicated than that, but you get the idea.
After many days of trying, I was so close but simply couldn’t figure out how to solve the problem on my own. I could get the schedule to generate 14/17 weeks without issue, but the program would crash after that.
I eventually gave in and hired a skilled programmer on Upwork to help me out. According to his expertise, the problem was NP-hard which in programming terms means that there’s no real efficient solution for it. He had to write something in C++ and port it to Python which did end up solving it eventually. Here is the module he wrote on PyPI if you’re interested.
After this experience, I began to realize that I was slightly in over my head with this project. I was having fun learning how to code and everything but I wanted to work on something smaller to get my feet wet.
I began talking to a friend of mine about it who also does web development and he suggested we build something together for practice. I agreed.
He’s a frontend developer by trade. I had some experience with building out an API with Django and some Linux skills to deploy it. We ended up being a pretty good team.
Long story short, we completed that project, launched it on Reddit, and got ~50 users to sign-up for a free account. Unfortunately, the market wasn’t the best, it was more just a hobby project and is no longer maintained. But that whole process of building and shipping a full web application was invaluable, to say the least.
By the time the second project was finished, I felt pretty burnt out and didn’t have much motivation to work on the football game. What I ultimately decided to do was keep the repo on GitHub and possibly revisit the project someday if I ever feel like working on a passion project again.
All in all, I learned a lot throughout this whole process and wouldn’t hesitate to build another software project if the opportunity presented itself.