Some time ago, one of our clients hired us for a new challenging development. This time, we started an amazing project we’d like to share with you 😊 We created FinTech based project. This two blog post series review all the tech decisions we made while developing the back-end/front-end code and iOS app
Our latest project is a FinTech company based in California who was looking for someone to develop their product. Through the platform online investment application, you can place your funds in a series of fixed interest accounts. Link your bank account and make deposits with zero fees to invest and zero fees to withdraw. The main features this project needed to implement were:
- Sign in and sign up based on an exclusive invitations system.
- Edit profile, reset the account password and verify account canonical features.
- Link bank accounts to their profile so they can make transfers easily.
- Transfer money from the client account to any fixed interest account and the other way around.
- Create an event feed where the client can review their activity.
- Let the user review a forecast of their earnings based on the current account balance and the remix configuration.
However, these requirements were just from the final user point of view. What about the management of the company? From the back office, the client would need the following features:
- Restrict the access to the back office to just a bunch of wealth managers and admins.
- List all the information related to a member or a member transaction.
- Keep a log of every change made by a wealth manager, an admin or a member in our transactions or members information.
- Update the state of every transaction from the member account to the final fixed interest account.
- Minimize the number of transactions made from one account to the fixed interest accounts.
- Calculate compound interest per member per second with different investment planes.
- Compute some metrics related to financial concepts such as the annual percentage yield or the net cash flow.
- Generate monthly reports in PDF we send to our users with all the information about their accounts and the latest movements.
- Send emails with some useful information for our users.
- Send push notifications with some communications related to the state of the members' account.
Last but not least, what about the non-functional requirements? We needed to automatically deploy the server side code, the back office code, and the application code. Implement auto-scaling mechanisms, database backups, and replication, multi-region deployment support, network configuration, so part of the API and the back office is not accessible if you are not connected through the company VPN and response time faster than 200 ms for every HTTP request.
While reading the list of features, we could only see tons of Jira tickets moving around our kanban board. After a product requirement analysis, we decided to start reviewing the server and back office stack. This time we decided to use a stack based on Play Framework, Scala, admin-on-rest (based on React and Redux), AWS Beanstalk, AWS SNS, AWS SQS, AWS Cloudwatch, AWS Elasticache, Aurora and some cool Scala and Java libraries. So of course, all the infrastructure handled thanks to Docker and Terraform!
However, the stack wasn't so relevant in this scenario. We've implemented projects based on a similar stack in the past, and we didn't face significant issues. The biggest challenge in this project was the implementation of some financial concepts such as the compound interest, the date time management based on strong rules dependent of different time zones and all the business rules we had to implement based on the user and the transactions state. The keys to success when implementing these features were:
- The usage of different testing strategies from regular unit tests to integration tests using property-based testing generators. You can find an example in this blog post we published in the past.
- Implementing money amounts with BigDecimal and configuring the rounding correctly instead of floating point types. You can find an excellent blog post about the floating point types limitation here.
- We are designing our domain and business logic based on behavior and structural software design patterns such as commands or strategies.
- We are using an impressive library for the dates management like JodaTime.
- The generation of the client monthly statements using HTML and CSS instead of regular PDF libraries.
The result, our project is up and running and ready to rock! We created a resilient, extensible and scalable software. Wealth managers and users are seeing how their money grows every day. In the following days, we will publish another blog post explaining how we implemented the iOS application. Stay tuned!
If you need to develop any similar product and you need help, we'll always be happy to review your project needs and try to find the best way to create the platform your users are going to love! Contact us at firstname.lastname@example.org