Hire developers Community Blog Find a dev job Log in
Close menu
Tech insights: Tracking Team Card Spend Using Investec Programmable Banking at OfferZen
Less noise, more data. Get the biggest data report on software developer careers in South Africa.

Tracking Team Card Spend Using Investec Programmable Banking at OfferZen

04 September 2020, by Ben Blaine

Investec’s Programmable Banking API allows Investec business banking customers to integrate their bank accounts with their own systems, so they can sense transactions and respond to them automatically.

This demo shows how OfferZen is using the API to identify when team members make company card transactions and then prompt teams on Slack to claim and categorise them. It streamlines the card spend reconciliation process, saving hours of work for the Finance team every month.

See how Jethro Flanagan and Markus Kuhn built this tool here.

Click here to download the presentation slide deck.

If you want to see the code repos, here’s the OfferZen finance app, and the RubyGems.

Transcript of the demo

Jethro [14:03]

Markus and I are going to take you through the OfferZen finance app, which we’ve named Roz for recon OfferZen. It’s also a reference to Roz from Monsters Inc – don’t know if you remember the movie but she’s always watching.

Jethro [14:19]

The main goal for what we were setting out to do was empowering people inside OfferZen to spend money, and then to allow the Finance Team to manage that spend easily and confidently. You’ll see why that was our goal when you have a look at our process.

Jethro [14:37]

What happens currently is we have a whole lot of cards that sit in OfferZen that anyone can use. We all have access to those details. We can spend some money but then forget to tell the Finance Team that “hey, we’ve actually spent some money on something”. What happens is, the Finance Team then has to go around kind of guessing what that expenditure actually is. They’ll often go and try to ask various teams what their best guesses are as to who spent that money. But the downside is, they’re generally going to be asking that when they recon all the finances at the end of the month and that transaction could have happened right at the beginning of the month.

Jethro [15:14]

And they’ll come back and ask you about what happened, 20/30 days ago. It’s really hard to remember that, so a lot of people don’t respond, in terms of saying, “Hey, that was actually me.”

Jethro [15:27]

The other problem with doing all the financial stuff, as well as people saying, “Hey, this was my expenditure”, is it’s quite a long process to go through. There’s a lot of documents and things to read through and go, “Okay, cool. This is how I report this transaction, and so on.”

Jethro [15:41]

There’s a lot of processes tied up in that. Once the Finance Team has made their best guesses as to what the transactions are when they are re-coning, they export all their transactions from Investec, and then they take those and import them in Sage. So, that’s all CSV exports, and then they categorise them inside Sage. There’s quite a lot of steps to that process and also a lot of room for error. And that’s the main thing we wanted to fix, is get rid of all these pain points.

Jethro [16:15]

Our new process is somebody spending something on the Investec card and again, same deal, you have a few different Investec cards that anyone can use that will then send out a Slack message. And somebody can go, “Hey, I was the one who made that expenditure”, and they can categorise it directly from the Slack message.

Jethro [16:36]

And then all of those categorised transactions can get exported to Sage, and you don’t have to do this clumsy jump back into Sage afterwards and categorise stuff. We wanted to really just streamline everything and reduce the margin for error and simplify the Finance Team’s life.

Jethro [16:52]

Some of the ways these works are, we have our Investec cards attached to teams. They can also be attached to specific members, so you can have a person owning a card. But it’ll always be attached to at least one or two teams.

Jethro [17:09]

Each card can be attached to teams. And the reason behind that is we can then message just that team directly associated with the card. If we have a look at what could happen in that process – if somebody spent some money on the People Ops card (People Ops is maybe HR in other companies – it’s a little bit different, but that’s vaguely what it is) somebody spends money on the People Ops card, and then that is processed by Roz. We’re pulling all the transactions from Investec through the Open API, that’s kind of the big transaction done.

Jethro [17:49]

We’ll grab the latest set of stuff – we just poll every 30 minutes for that. Then it processes and goes okay, cool, some of these transactions are new, and sends out a message to the spend-people-ops channel. Each team has its own dedicated Slack channel.

Jethro [18:07]

It’ll just give some basic transaction information around that, some amount, description, and stuff. We have a button over there. And all you need to do is click “hey it was me”, and then you can start the categorisation process. That’s what happens if you spend on a team card. But if you spend on somebody’s specific card, so in our case, somebody called Zsa, who works at OfferZen, and her cards are quite popular to be spent on and if somebody uses her card to buy something, then it also sends out to the spend-people-ops channel.

Jethro [18:43]

But it’s just going to say, “Hey, somebody spent money on Zsa’s card”. It’s just a minor change to add a little bit of extra clarification where we can surface it but that’s the only real key difference from the user’s perspective as to what actually happens over there.

Jethro [19:01]

Then sometimes we have – if you imagine a lot of transactions are very similar, and they are just recurring over the months, it’s going to get really irritating if we just @ channelling to everyone all the time. And then eventually they’ll just stop looking at those channels.

Jethro [19:15]

So, we obviously don’t want that to happen either. So, whenever we have a payment or an expense that comes in that we’ve seen before, and we’ve specifically marked as a subscription payment – so you can categorise things as subscriptions – if we get the same transaction, essentially with the same card and the same description, if we get that thing coming through, then we can go, okay, cool – we can categorise this as whatever the last one was categorised as, assign it to the same people, and then just mark it as a subscription and don’t send a notification. So, that’s the main thing that we do over there to limit spamming everyone.

Jethro [19:59]

Markus is going to take you through a demo of what the app actually does in action, so you don’t just look at random pictures of things and actually see something real.

Markus [20:11]

Cool thanks, Jethro. I’m going to just share my side quickly.

Markus [20:15]

Right. Can everybody see my screen?

Markus [20:19]

Awesome. All right. What do we have going on over here now is an example of one of the Slack notifications that would have been sent through as soon as a transaction came through. Basically, just gives you details about the transaction, the amount, the description, the date, and then we’ve got the ability to go and categorise that transaction accordingly.

Markus [20:42]

I’m just going to do that live. Now at the moment, I’m just going to click on the link. Once you’ve clicked to categorise a transaction, you’re presented with this view, which again gives you details about the transaction, specifically. And then, because they come through, and they’ve got the part of the card that was used, but the rest has been masked out, we can effectively match that to the card of a team accordingly because we’ve got the cards saved. So this just helps us to autofill the first drop down, which is the team for which the transaction was.

Markus [21:21]

Otherwise, what one would do is, for example, you’ll just select who made the purchase and what the purchase was for. In this case, I made the purchase myself, and this was for marketing event costs. Once that’s done, you can just proceed to categorise that accordingly, submit and then you’re greeted with this absolutely lovely screen, which is great.

Markus [21:43]

However, there are probably cases where, for example, you made a mistake when it comes to categorising a transaction. But it’s not a problem because admin users on the app can easily rectify that. I’m going to open up the admin view and just show how that looks in a sense. Here we are presented with the admin view with all the transactions accordingly.

Markus [22:08]

The first one over here is the one that I had recently just categorised, which was for marketing event costs. And it was for me. However, I made the mistake of selecting the wrong category when it was supposed to be a subscription. So, I’m just going to go and select subscriptions instead. And it wasn’t me that actually made the purchase, it was Jethro so, let’s just update that accordingly. And cool, simple, that transaction is updated. And it’s effortless for the admin and Finance Team to sort that out.

Markus [22:39]

There are cases where for example, transactions will be missed accordingly in Slack notifications and such, and what we’ve done to address this is we’ve split the transactions where everything’s listed, as well as uncategorised transactions where those specific transactions that haven’t been categorised will be listed. What the team can effectively do is they can just go over here, select the category, so electricity, let’s just say that’s office services, and then we can just select a team member for that being Jethro, for example, right. And there we go, the transaction has been categorised accordingly. Refresh that. And it’s gone from the view.

Markus [23:29]

What we also did is we made it possible so that we could export all transactions into CSV format for cash reports, or for Sage to be used at the end of the day – both of which have the ability to export the last 30 days or the last all-time transactions. For example, I’m going to select the last 30 days. That’s just going to give me a lovely CSV. And as you can see here, everything is looking good. It’s probably a bit small but I’ll just zoom in a little bit. It’s been exported into a CSV format to be used in Sage. One thing to note on this, is that we are going to be updating our export functionality to be working with the Python Sage integration that Imraan did. That’ll definitely be changing up in future.

Markus [24:22]

And otherwise, what we did to give the Finance Team and admin users the ability to just manage things a little bit better, we just included the basic crud functionality, such as adding managing team members, teams, and cards. And that’s it in a nutshell., I’m just going to go back to the presentation.

Markus [24:49]

Just, to give more information on the source code: It was last week that Jethro and myself made a Ruby wrapper, effectively for the open API, which has been published, and that is sitting on RubyGems at the moment.

Markus [24:59]

The repo is public as well. Anybody can just grab the Gems and make use of it, and also Roz itself. And what we did this week was we decided to make Roz open source so that anybody who wants to use it, or anything of that sort is more than welcome to do so.

Markus [25:21]

It’s completely open source. It’s pretty much out there. It’s available to use. I hope you guys like it. Does anybody have any questions? And yes, Roz, is always watching.


Jethro [25:37]

I see, Adam, you were asking about the undo, and Dan mentioned that we can rollback. We do have versioning. And it is any change to anything that we’ve attached that versioning to, specifically transactions, in this case. We can undo, but we would have to do that manually. We’d have to SSH in or hit the Rails console or something like that, to actually do it. If it became a problem, we could probably add that feature for admins. But at the moment, it’s going to be from a developer side to do it. But we do have the history.

Audience member [26:14]

I have a question.

Dan [26:16]

Anything on the Investec API that you’d add to make this easier to use or, add an extra feature or something like that?

Jethro [26:25]

The one, main thing I would add is an ID that comes back from the Open API. The problem that we had at the moment, and it’s not a massive problem, but it is something that is useful to know about – we’re creating our own ID from the amount, description and date, but the date is to the day, rather than to timestamps. So, it means that there can be a little bit of an overlap. If you have duplicate transactions with the same amount, going to the same merchant – you end up with IDs that clash.

Jethro [27:11]

And our app assumes that it’s already seen that transaction, and so it doesn’t save an extra one. There are ways around it. But there’s a lot of hacks to get that working. And we didn’t feel it was worth doing the hacks to deal with that. We’ve been chatting to Investec to hopefully get an ID back, and that’ll rectify the issue.

Markus [27:42]

I see there is a question from Imraan – what does the architecture of the application look like and the language and storage? In terms of the architecture of the app, it’s just a straightforward Ruby on Rails application that we’ve built in a sense.

Markus [28:00]

It’s using Sidekick, as well as Sidekick Scheduler to effectively spawn off jobs every 30 minutes to go and fetch new transactions and sync those create records on the outside and send Slack notifications. And in terms of, where it’s kept at the moment, it’s being hosted straight on Heroku, at this point in time.

Audience member [28:28]

And the DB?

Markus [28:30]

DB is a Postgres database.

Ben [28:38]

Everyone I know is working on Sage integration. Can you guys imagine using that integration?

Markus [28:48]

Yeah, that’s one thing that we’re going to be doing for sure, we’re going to be bringing that into our side. Because at the moment, with regards to Sage, it’s just a bit of a manual CSV creation process, in a sense, and it’s still a bit of a manual process for the Finance Team to go and specifically take the CSV and upload them. We’ll be definitely switching that out.

Ben [29:15]

Okay, cool. Then with a button that says, import to Sage, just import the transactions directly into Sage?

Jethro [29:23]

Yeah, we could even remove the button if we got that neat and tidy enough. But it’s probably nice to have an explicit “Hey, I’m ready to send these off to Sage now”.

Ben [24:59]

Would it automatically sync?

Jethro [29:31]

Yeah, I think we probably could. I’m not super familiar with Sage. It’d be interesting to see how that integration works. But it would be really nice if it could be completely silent and just do it in the background for any changes.

Dan [29:51]

If I understand correctly, the way, Imraan’s, building it will run every day and just sync new transactions.

Imraan [30:02]

Yeah, that’s exactly how it will work, guys. You can either run it once a day, once every hour, once every minute. And it just syncs new transactions automatically over.

Jethro [30:13]

Good. Looking forward to that. Yeah that would be great.

Ben [30:19]

I noticed on the CSV export, you didn’t export categories. Does that not get imported to Sage?

Dan [30:30]

Categories are just for our cash report, we don’t use them for Sage, they have a different category structure.

Ben [30:38]


Ben [30:45]

Do you have questions? Anybody?

Dan [30:47]

I want to just share something about the project. One of the cool things. I didn’t work on building it, but I did a little bit of design work. One of the things that are quite cool about this is obviously, team members can categorise their own transactions. And the Finance admin can categorise transactions on behalf of them if they forget. And we actually record who categorises the transaction, whether it was the team member or the admin. And we’re thinking a cool thing to add would be a leader board that shows which teams are really good at proactively categorising their spend versus which teams the Finance Team has to chase up. We can make it a bit competitive and gamified, which will be quite fun.

Ben [31:30]

And then a drone delivers ice cream to the best team. Question for anyone in the audience. Can anyone imagine their company using this? We definitely want to see if there developers can get companies interested in using Investec.

Ben [31:57]

That will help drive business motivation for this project to get more resources and to get more interest.

Ben [32:08]

We’re not trying to force that down anyone’s throat, but we’re trying to do things that will incentivise that behaviour to emerge. Does anyone in the audience have any idea if this would be useful to companies, or any stories, at least of how team spend is done in your company? If it’s a mess, or there’s another way that you do it, or what tools you use?

Imraan [32:33]

I can comment, I love this idea. And we definitely can use it where I am at the moment. The only problem is we don’t bank with Investec. That’s the big barrier to entry at this point in time. And also, we don’t use Slack internally we use Microsoft Teams, maybe we can extend it to instead of sending it to a Slack channel, send it to an (I don’t know what Teams call it) Team Group or something, like that?

Imraan [33:01]

That’s the only thing. If I showed this to our finance manager, he would probably have wanted it, like yesterday. But he’d go, can it talk to Standard Bank? That’s kind of the thing he’d want to ask.

Ben [33:17]

Okay, cool. That’s interesting.

Ben [33:20]

Anyone else has spent tracking stories from within the businesses that are interesting or problems?

Audience member [33:39]

I think from my side, it’s a similar situation to what Imraan mentioned, with our company, we bank with Absa. In fact, for the most part of it, the discussions have been around that so far, but most certainly, it’s something that the team would benefit from, taking into consideration how much spending we do especially with travel.

Ben [34:04]

Okay, and how much? Or how do you guys currently track spend? Or how do you manage it?

Audience member [34:10]

We use Absa. Absa’s provided the company with a set of tools that our teams have access to. Pretty much something very similar to a dashboard view where you can monitor your tracking spending, but with very limited functionality.

Ben [34:29]

Okay, and how would you want to extend that function? Or is there some functionality that you’ve seen here that you would want to use there?

Audience member [34:39 ]

Most of the functionality that we saw today is actually stuff we would want to use. If I could just briefly outline some of the stuff we do with the current systems, it’s mostly a manual process.

Audience member [34:51]

On our return from a trip to Germany, we had to manually export our spend patterns and then submit that to HR as well as the Finance department. So obviously something that would be much more constructive or beneficial to us if it were digital to begin with.

Ben [35:13]

Okay. What’s actually quite interesting, having done this project on the OfferZen side is, from what I can tell, the dev team, or our tech team don’t spend that much time worrying about FinTech apps for our business. And you guys had to do quite a lot of discovery to get this done if I’m not mistaken.

Dan [35:38]

Yea, we had many sessions with the Finance Team. It was very interesting to get some insight into their world. They’re definitely not programmers.

Ben [35:47]

And what do you think is the reason for there not being much activity previously, between the two teams?

Dan [35:56]

Between the Tech team and the Finance Team?

Ben [35:58]


Dan [36:00]

I would guess that people aren’t used to innovating in, in finance. And there’s just maybe a lack of imagination. Now that there are interesting things you can do probably people would be more likely to do it. But no one really thinks, “Oh, cool. I’m going to build a cool finance app” because they don’t have examples of cool finance apps. It’s generally quite hard to integrate with bank systems.

Ben [36:25]

Right. I’m just reading Tiaan’s comments here as well in terms of counter-insurgency integration, you need to export the account categorisations that are going back from your team. That’s the account… okay cool.

Audience member [36:44]

I have a question. Is there an idea to maybe give the teams, or at least people who are going to use the cards, an app or something so that they can categorise and allocate immediately, rather than waiting for a Slack message and then ID-ing it.

Audience member [37:06]

So, wherever you are, as you make the spend, it pops up, a notification on your phone or whatever the case is. And I don’t know if those cards have NFC so you could potentially use NFC to register that you’ve taken that card. And then that’s how we could link sending you the message when you do the spend.

Audience member [37:28]

I don’t know if Investec cards have taps. But, are you guys thinking of that?

Dan [37:40]

What you could do is, use the after transaction in the card to send you a text message straight away or some rich email. And then you could have a button in your email that you press. You could definitely do more real-time stuff. Use the API, which means calling for transactions, so the turnaround times a little bit slower. You could definitely do it iImmediately as well, if you’ve had the use case where people are out, and they just want the thing to pop up on their phone.

Jethro [38:07]

I think Dan looked at this in particular – matching the after-transaction stuff with the Open API.

Jethro [38:17]

Because obviously, theOopen API actually gives all the transactions where the after transactions are only linked specifically to card expenses, it misses out a few things. And the descriptions right now don’t quite match. But if we think Investec is currently looking at getting IDs, that allow you to refer to both sides you can actually match those up. In which case, yes, we could do something like that, which is a bit more actionable at that moment. That’d be really cool.

Dan [38:45]

We wanted to get the EFTs and all the other stuff as well that doesn’t happen on card swipe.

Dan [38:50]

Tiaan’s saying that there are already in-app notifications. So, you could add a button or a web view or something.

Ben [39:11]

It’s time to call it, unless anyone wants to quickly turn on the mic and start shouting out questions. Thanks, Markus. Thanks, Jethro. This is really awesome. And super beautiful design as well. It’s nice to see.


Find out how programmable banking can work for your business!

If you’re interested to find out more about how you can use programmable banking at your business, please pop me an email.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Subscribe to our blog

Don’t miss out on cool content. Every week we add new content to our blog, subscribe now.

By subscribing you consent to receive OfferZen’s newsletter and agree to our Privacy Policy and use of cookies.