The PerkiespresentPerkify
Perkify is a Paperless, Digital, Local Loyalty app
Perkify is a paperless, digital loyalty app designed to incentivise repeat custom for local businesses.
We decided to work on a loyalty card app due to it addressing a real world problem: the ongoing financial and ecological cost of paper-based loyalty stamp cards. Small businesses, facing lower footfall and higher overheads, simply cannot afford the initial cost to develop a bespoke app themselves. Paper-based loyalty cards are also easily lost, take up space in a customer's wallet, are damaging to the environment, and easy to defraud.
By using Perkify, merchants are spared the hassle of rolling out an app, they can be easily onboarded, saving them both time and money. Perkify allows merchants to track how a loyalty program is performing which is significantly more difficult with a paper-based loyalty program.
For customers, Perkify offers convenience; allowing them to safely store all their loyalty cards in a single place, preventing them from going through the effort of downloading an app for each vendor they shop with. Never lose a stamp card again!
After opening Perkify, users can very easily activate a loyalty card from their favourite merchants. Once a card has been activated, a user can now begin collecting stamps after being scanned from the merchant. Once a loyalty card has the required total stamps, it can now be redeemed for a free reward from the merchant!
The Team
Hamoudi Abdulkawi
Matthew Cross
Kevin Zehner
Daniel Anderson
Alejandro Barroso
Technologies
![Technologies section image](https://images.prismic.io/northcoders/58ca4bc1-04ac-4203-8225-b9f223720f48_Perkify.png?auto=compress%2Cformat&fit=max&q=60&w=800)
We used: TypeScript, React Native, Expo, Node.js, Express, Postgres, SQL
Our main goals with the Frontend was to choose a tech stack that:
- we can all learn and pickup quickly within 1-2 weeks
- can create apps for both Android and iOS platforms using a single codebase
Our choice was between React Native and Flutter. We decided with React Native.
Why React Native + Expo?
Given that we were already familiar with React, picking up React Native was really fast.
Using Expo as our framework has also helped get us setup a lot quicker, making us a lot more productive without having to learn all the intricacies of learning a new language and framework in the case of Flutter & Dart.
Why Express and PostgreSQL?
On the back-end Perkify is written in TypeScript, built using Node.js and Express, with a PostgreSQL database. All of these technologies are good for creating web applications, they’re free and open source.
We also chose to go with a relational database over using a non-relational database due to the relationship of our loyalty cards and loyalty programs having multiple one-to-many connections.
We chose this stack due to our time constraints, we wanted something familiar so we could focus on implementing our new tech.
Why TypeScript?
Given that we decided to use React Native on the Frontend and that we’re using JavaScript on the backend, we believed it was best to learn TypeScript in order to have synergy and shared types between our frontend and backend codebases.
Whilst there was a small initial learning curve that set us slightly back at the start of the project, we received much better productivity benefits through using types and quality-of-life features such as autocomplete.
Challenges Faced
1. The initial setting up phase was a little more challenging than expected due to using TypeScript and having to learn how to deal with the type-checker. Also getting TypeScript to not get in the way when using libraries that didn't include types
2. Authentication was a completely new concept for us and therefore came with several of its own challenges. We had to learn the whole process of authenticating with a 3rd part auth-provider using JWT
3. Designing the database schema came with a few problems when creating the relationship between loyalty programs and loyalty cards
4. Dealing with errors in React Native was extremely challenging as often the errors were incredibly vague and required niche knowledge and we've spent hours trying to find solutions
5. We didn't identify every route/endpoint in the planning phase and we've had to add more during development, which resulted in us having to think a few of the routes