00:00:07.759
I'm Radoslav. You can find me online as R Stankov pretty much everywhere.
00:00:14.480
I started a newsletter this year because I thought I could use the free time in my life.
00:00:21.080
All my slides are here; I will show a lot of links and information.
00:00:27.480
I noticed that people try to take photos, but I switch slides very quickly.
00:00:33.800
So, if you're missing something you want to capture, the URL is provided here.
00:00:41.320
As engineers, we always say, 'It depends.' Everything depends on context.
00:00:47.039
Let's start with some context. My company is called Angry Buildings, and it's not related to Angry Birds.
00:01:00.160
It is facility management software, specifically accounting software for facility management.
00:01:05.519
Actually, every software evolves into an ERP system if it lasts long enough.
00:01:12.759
We are transforming the ERP system for companies. It started as a side project.
00:01:18.240
Many people ask me how the idea originated. A few friends came to me with a proposal.
00:01:23.960
I initially thought it was a stupid idea. They returned with a much better idea.
00:01:30.960
I suggested what they needed to do, and this is how it came to fruition.
00:01:36.880
The project began three years ago. I held the title of CTO at my previous job.
00:01:42.000
Last year, I realized I was more excited to work on weekends than at my day job.
00:01:48.759
This is our team; most people have short titles.
00:01:54.759
As you can see, there's only one technical person on the team.
00:02:01.880
That's the Bulgarian way of being the only engineer in the company.
00:02:08.319
However, it's not just about that; in a business setting, there are several areas to manage.
00:02:14.280
There are customer pipelines, marketing, sales, and onboarding, especially for business software. You need to provide training and support.
00:02:22.680
These areas are usually not favored by developers.
00:02:29.319
Let's do a little quiz here: what scares us the most?
00:02:35.160
Is it a coffee machine that doesn't work? In my case, it can have too many buttons.
00:02:42.200
Another scary thing is when a PM says, 'This should be easy!' Or when someone calls, expecting you to have all the answers.
00:02:56.159
In those moments, I can’t help but think of a specific scene from a TV show.
00:03:03.400
But the thing is, my team handles these phone calls. They are the ones who speak with businesses that still prefer calling in the 2000s.
00:03:10.280
We move fast and have breakfast.
00:03:16.400
The project officially started on April 1st. Our first commit dates back to then.
00:03:22.680
We kept building, building, and building until we reached some business milestones.
00:03:29.479
Currently, we are in a default alive state, which means if we stop doing anything, the business remains operational.
00:03:35.160
My favorite metric is zero churn so far. We have not lost a single customer, which is fantastic.
00:03:42.880
We usually see a 5000% growth, but that's from one to two customers.
00:03:49.440
Right now, we manage around 30,000 apartments through our software.
00:03:55.160
Our company's lifecycle involved discovering something we call Product-Market Fit.
00:04:04.920
The key is that sales must become repeatable and scalable.
00:04:11.639
In a way, we want to create a formula that can be replicated by more salespeople.
00:04:18.240
However, achieving Product-Market Fit isn’t a one-time event. We find it can vary from one segment to another.
00:04:26.239
When building an MVP, the common advice is often misguided.
00:04:33.000
It's better to start with something that almost works and manually push it out until it's automated.
00:04:40.960
This often involves fixing bugs through the Rails console until the software operates seamlessly.
00:04:47.720
Ultimately, you will want to develop something that is clean and effective.
00:04:53.240
Regarding competition, surprisingly many companies still use pen and paper.
00:04:59.960
Others may utilize Excel or Google Sheets, which almost amounts to the same thing.
00:05:06.879
We also have competitors who seem like they haven't modernized in the last 10 years.
00:05:13.760
Our product journey initially focused on individuals managing their own buildings.
00:05:22.079
Over time, we pivoted to target companies because they have the resources.
00:05:29.960
We focused on what are called non-consumption companies, as these were the only ones talking to us.
00:05:37.040
Non-consumption companies typically used pen and paper and Excel, which meant adding our software was appealing.
00:05:45.239
Even if our software didn't cover all their needs, it still offered them a safer pathway to transition.
00:05:52.160
Our initial focus was on construction companies, given their prevalence in the market.
00:05:59.600
The market shifted, and we also targeted facility management companies that were just starting.
00:06:08.799
This approach allowed us to develop more features tailored to serve them and encouraged them to cancel their Microsoft subscription.
00:06:15.760
We focused on competitors once we believed our software was strong enough.
00:06:23.200
We identified growing companies in the facility management space since many competitors were still outdated.
00:06:30.239
We found that addressing the needs of growing companies was key.
00:06:38.120
However, a significant challenge is convincing stable companies to switch software.
00:06:48.760
Even though we can import their data and offer better features, many still resist change.
00:06:55.600
Mistakes were made during this journey, often resulting from chaotic decision-making.
00:07:01.680
One of my biggest mistakes involved incorrectly named database fields.
00:07:08.640
While fixing code is often straightforward, changing a database name can be challenging.
00:07:15.759
Even when there is a typo spanning a decade, no one seems eager to correct it.
00:07:22.000
Making a decision regarding the user model turned out to be quite technical.
00:07:28.800
On the business front, we tried to launch a service marketplace linked to our mobile application.
00:07:37.000
Every person living in the building is given access to a mobile app, but we lacked the necessary usage.
00:07:44.160
We tried to expand prematurely to Spain, which turned out to be an overcommitment.
00:07:50.640
Many mistakes occurred simply because we attempted things without a solid plan.
00:07:57.680
As one developer, I would often ship a singular pipeline.
00:08:06.160
The product growth is currently on an upward trajectory, moving us toward reaching early majorities.
00:08:12.640
Our next challenge is to convince companies to transition to our software.
00:08:19.440
Some words of wisdom: when starting a product, target businesses that aren't currently using anything.
00:08:25.920
That could mean replacing Excel with something they can easily implement into their workflows.
00:08:33.280
As a developer, you should be involved in sales, support, and onboarding.
00:08:42.080
Some of our biggest customers even have my personal phone number.
00:08:48.200
When you hear 'no' from potential clients, grab that feedback quickly and understand why they aren't interested.
00:08:56.160
One of our significant growth opportunities emerged when we learned about clients holding onto past data.
00:09:07.360
So we created an import feature that facilitated their transition.
00:09:14.680
Receiving precise problems rather than solutions from customers and sales is crucial.
00:09:22.240
This forms the basis of building better products that truly cater to their needs.
00:09:31.040
Having intuition in decision-making is vital for becoming an expert in any domain.
00:09:40.680
This intuition helps determine if a specific feature is applicable to only one client or if it's a broader need.
00:09:46.160
It's easy to get swept up in saying 'yes' to everything when trying to stay afloat.
00:09:54.319
Allow me to share three examples of how we address client needs.
00:10:02.840
Firstly, we have ePay in Bulgaria for paying facility bills like electricity.
00:10:10.160
One of our clients, managing over 200 buildings, requested the ability to import payments from this system.
00:10:15.999
This simplification saved them from spending days in Excel.
00:10:22.000
However, I had to create a straightforward solution despite the varied building names across different systems.
00:10:29.360
Thus, I generated an Excel template for the client to export and upload their data effortlessly.
00:10:36.760
It's about making life easier for them, even if it takes slightly longer.
00:10:43.920
Often, I find myself lacking intuition on how to best serve our customers.
00:10:51.200
I created a module called 'special cases' for unique requirements, allowing customized software adaptations.
00:10:57.560
This offers a quick overview of how many clients desire specific features.
00:11:04.440
Another example links back to our clients wanting to print documents.
00:11:10.960
I grew tired of creating PDFs and opted to let users select their desired settings.
00:11:16.560
This functionality became a favorite, often garnering incredible reactions from potential clients.
00:11:25.000
I realized that helping our customers is essential to ensuring our business's success.
00:11:31.560
Managing priorities as the sole developer necessitated careful organization.
00:11:38.560
The primary focus became reducing churn, followed by gaining new customers.
00:11:45.760
The final point is saving the company money, which often correlates with generating revenue.
00:11:52.960
Another key strategy is the 10-minute fix; small changes are usually highly valued by clients.
00:11:59.920
Additionally, Fridays are my time for bug fixing and technical maintenance.
00:12:07.240
This leads to weekly reviews of all sales, features, and support under a relaxed atmosphere.
00:12:14.600
Now, let's delve into more technical aspects. When I started the project, I faced the challenge of managing everything alone.
00:12:25.159
I had to oversee the management portal and mobile applications for both iOS and Android.
00:12:32.640
Our tech stack consists mainly of Ruby on Rails, with React Native used for mobile apps.
00:12:43.040
The majority of complexity resides in the Rails app, which handles essential business operations.
00:12:50.680
My domain model revolves around accounts, buildings, and apartments.
00:12:56.760
Rails facilitates aggregation; for instance, querying apartments under an account is straightforward.
00:13:03.360
Currently, I have more than 563 routes and 105 Active Record models in the codebase.
00:13:10.760
I've managed to run 2,176 tests in just three minutes, supporting three languages.
00:13:19.560
My focus has been on keeping things simple yet effective, avoiding unnecessary complexity.
00:13:27.560
For automation, I relied on the annotate gem to help track table names and indexes.
00:13:36.240
By minimizing dependencies and sticking to vanilla Rails, I've reduced development friction.
00:13:43.800
One essential component was ensuring internalization was in place from the project's inception.
00:13:51.560
Some features not officially documented in Rails needed custom solutions, which I promptly addressed.
00:13:57.560
I'm particularly fond of the Counter Culture gem for managing smart counter caches.
00:14:05.560
View components have also streamlined our ability to build and manage reusable UI elements.
00:14:13.560
For authorization, I utilize a DSL I built during my time at Product Hunt.
00:14:20.800
Setting permission levels allows us to grant or restrict actions for various user roles.
00:14:28.800
I leverage service objects when making decisions, keeping everything organized.
00:14:35.040
MiniForm is another gem I depend on for creating streamlined form validations.
00:14:42.960
Finally, I employ search objects for effective filtering and data retrieval.
00:14:50.720
Metadata organization keeps everything in its rightful place to avoid confusion.
00:14:57.760
I prefer structured layouts for easy navigation of the project's components.
00:15:04.320
Tests play an essential role in ensuring uptime and reliability.
00:15:11.760
Our end-to-end feature tests provide excellent coverage, ensuring all UI components function correctly.
00:15:18.000
Custom helpers simplify interactions and testing within our framework.
00:15:25.520
Thank you for your time! It's almost time for lunch, and I appreciate your attention.