Skip to content
EmailLinkedIn - Solving a Real World Problem and Lessons Learned

coding & tutorials, projects5 min read

I'll go through this project by defining STAR:

  • Situation (problem statement)

  • Task & Action (what need to be and has been done)

  • Results

And most importantly the Lessons Learned :)

NOTE: This project has been developed, published with a few versions and peacefully rested after 1 year that brought me lots of insightful lessons that i'll talk more about later.


Many people around the world are flying to visit Vietnam for its great people, landscape, cuisine, culture and so on. Citizens from 91 countries are visa-free or can apply visa-on-arrival to Vietnam. evisa-vn was an authorized application to provide Tourist & Business visa, single or multiple entries that can last up to 1 year.

Task & Action

There are 3 applications: 1. user facing app with optimized responsive design at, 2. api server that serves the requests and input/output data from the database at, and 3. admin panel for operational tasks at

User-facing application

The main selling point of this whole project relies on the responsive UI with simple and convenient flow to apply for visa with instantly fast speed. So let's get right into it.

Homepage - full

Applying for visa can be a hassle and there are many fields to fill in. The application process at evisa-vn is simplified and broken down into 3 smaller forms as steps: 1. Visa details, 2. Applicant details and 3. Payment. The progress is saved so the users can come back at anytime and continue to form.

Apply - step 1 Apply - step 2 Apply - step 3

API server

The server is written in NodeJS to serve HTTP endpoints for data input/output as JSON format, and send out emails upon certain flows of the application. Nothing fancy here :)

Admin panel

The project uses admin-on-rest, which helps building admin panel with minimum effort needed. It follows convention based HTTP requests for create-read-update-delete with search-sort-pagination and many customizable UI from dashboard, info card, list view, details view and forms.


After running for almost a year, I am happy to share some numbers. At least it's not a total failure :)

users vs average session duration 2018 pageviews vs average time on page 2018

On the first few weeks after launch, 1st to 7th April 2018 marked a sweet and promising future ahead. There were 944 Pageviews, 40 Users with an Average Session Duration of almost 12 minutes. This proved our marketing campaigns ran well and there were first transactions happened that are logged at the Admin Panel. We made sure we targeted the right customer groups and proves are the the frequent spikes on the charts that turned into happy transactions.

Originally there was a page that explains the application process at /how/, which is separated from the homepage. The reports helped me to simplify the copy and put it in the homepage instead. It turned out the homepage has the most Pageviews with roughly 2 minutes 40 seconds Average Time on Page, followed by /apply/ page with 3 minutes 30 seconds.

The headline - Easiest way to get Vietnam Visa is not exaggerated. Real data has proved you can apply visa to Vietnam in 3 minutes and 30 seconds.

Lessons Learned

Solving problems with technology is easy, doing business is hard and making profit is journey.

For first timers, if you do something for profit in mind, it'll be stressful, sometimes it can cause emotional turbulence, and there's a high risk of failure. Every year, there are countless number of ventured-backed and self-funding companies that fail, even big time, so you are not alone. I started this project aiming that within a year or two, I'll start having profit and even with just only 1% of the market share, i'll be damn rich by doing almost nothing after making the system automated with scaling supported by Google Cloud Platform. The reality has shown me that making profit is a journey. The first customers had shown me so many things that I didn't notice, because i was thinking as use-my-experience, instead of User-Experience.

Docker, Kubenetes and GCP make local development to production deployment seamless.

I have always wondered, an i bet many of you do: "what it takes to make app running perfectly on localhost to the web". In simple words: 1. Dockerize your local development. 2. Push image to Google Cloud Registry. 3. Update .yaml config files (deployment, ingress & service) and 4. Run kubectl apply -f . to apply changes to production. It's neat! (I will write another post about this setup and link back to this post later, stay tuned!).

Success comes from opportunities, not ideas.

In other words: fail fast and succeed faster. Success is just one of the failure that turns out to be good amongst the bad. If you fail, learn what could be done to make it better. There should not be finger-pointing, in stead try to be better after each failure. If you succeed, keep and improve the success factors. There is no perfect time or perfect person to rely on when we are ready to do something. Stay calm and strategic, provide a feasible solution and test out fast and keep on iterating.

Found a startup means you are a jack of all trades.

Why? Almost everyone in a startup does more than 1 job, because there are more work needs to be done in a limited time with not-so-much money. Being the so-called technical guy doesn't mean you can sit in front of your lovely workstation all day and someone else is going outside to market about your product. You are that someone. More than ever, you will value the existence of your family, friends, colleagues or any random people that help you from the smallest thing. I am so lucky to have learned so much along the way thanks to my friends, colleagues and my family. This is typical for a small team and everyone should enjoy the ride while it lasts and focus on building what you love :)