A few days ago, I (Santi) had to send some money to family in Colombia - I ended up using Western Union, which wasn't a great experience. The remittances industry is not very transparent, and it is often not clear what is that best service to use -- that's why we decided to build RemitRates.
What it does
Given where you're sending money from and to, and how much money your sending, RemitRates tells you which service gives you the best rates. Right now, you can compare rates from RationalFX, TransferWise, Western Union, XE, and Xoom -- and we're planning to add even more after the hackathon!
How we built it
We've got a Flask backend deployed on Heroku that takes care of most of the heavy lifting. The frontend -- built on JQuery and Bootstrap -- sends the user's request (a tuple of their source country, target country, and amount to send) to an API endpoint on the backend. The backend then runs through all the services we support, and scrapes / requests the required data from each website.
Challenges we ran into
Our first challenge was an assumption we'd made that each of these services lets you "convert money from currency A to currency B," so we built our UI and API around passing currencies around. We soon realized that lots of these services only let you "send money from country A to country B," and since there's no one-to-one mapping from currencies to countries (it's one-to-many -- thanks, Eurozone!), we had to rebuild around a country-centered model. (Luckily, the inverse many-to-one mapping from countries to currencies is easier to deal with.)
The biggest challenge was definitely scraping: a lot of these services make it very difficult to programatically get their rates. We tried to use Selenium (it turned out that headless Chrome is hard to deploy) and Casper.js (it turned out that interfacing a Node library with our Flask app was difficult) but neither of them worked in the end. In the end, we got one method working consistently: mocking the GET requests that websites make to their services to show rates to potential customers, and then parsing the returned data. This is easy when the server returns a nice JSON dictionary, and a bit harder when it's HTML -- for the latter case we resorted to the BeautifulSoup HTML parsing library.
Finally, we tried to deploy the Flask app on an Ubuntu server with Apache; after unsuccessfully spending a few hours trying to get that to work (Linux permissions, sigh), we switched to Heroku. That made everything a lot easier!
Accomplishments that we're proud of
We're super proud...
- That we got the services that we were able to scrape to work -- once those started coming online one by one, it was super exciting!
- Of the UI, which we think looks good and is easy to use.
- That the site also looks great on mobile.
- Of our name and domain -- we think RemitRates, at remitrat.es sounds pretty great!
- That we're going to demo!
What we learned
We learned that... deployment shouldn't be underestimated. This is definitely something we'll focus more on earlier in all our future projects, since once you've got a good deployment pipeline set up, it's wonderful -- but rushing to get it working the afternoon before the deadline isn't very fun.
What's next for RemitRates
We'd like to add more services! Also, many of these services have affiliate links -- so we can potentially make money off the website by converting the links to the services in the comparison table to referral links.