Roomr 4.0 is out and on sale!

To celebrate the release of Roomr 4.0 on iOS, I’ve decided to drop the price to $0.99 (£0.79) from now, until the 14th of May.

Roomr 4 includes some improvements and new features.

  • The UI has been updated so it’s cleaner and better organised.
  • It’s now possible to browse the Address Lists (if you’re using Exchange 2013 or Office365).
  • You can now search Global Address List.
  • When creating bookings, you can invite people to the meetings.
  • Browsing is now unlocked in the free version, so it’s easier to evaluate.
  • When you’re looking at a shared calendar, you can view the details of appointments.
  • Fixed lots of bugs around AutoDiscovery for Office365 and Exchange Online

In addition to adding features, I’ve also removed some. MobileIron AppConnect integration is no longer present and MDM configuration is no longer supported either. These two features were added to help make a sale to a large enterprise, which, unfortunately, never came to fruition.

The free version of Roomr now allows booking and browsing, without needing to upgrade. I hope these changes will make it easier for users to evaluate Roomr. The limit of one favourite will remain in place and QR scanning will still require the Pro version. The new Invitees feature in booking will also require the Pro upgrade.

I hope you will download it and try it out. If you’re already a Roomr user, I hope you like these changes!

You can download the free version of Roomr from here  This version offers an In-App purchase

You can download the Pro version from here

Back to basics

Tempus Fugit. As a developer, one of the things that causes me to stress the most, is a simple lack of time.

I have so many ideas (mostly useless) floating around in my head that I would like to turn into reality. I have three apps in the App Store, which I don’t really update. I also have a day job.

Faced with so many things to do, I really struggle to focus. I can lock in on something for a week or two, but a customer email will arrive, or a new idea will pop into my head, and my priorities change, leaving something half done.

This excellent Commit Strip is basically my product range –


My iOS app, Roomr, is a good example of this.

What started out as a simple app for viewing the availablility of meeting rooms morphed into something more complicated, but which wasn’t *more* useful. I kept reacting to user’s feature requests, without keeping an eye on the growing complexity. Complexity, I said to myself, is natural as a product evolves.

Roomr doesn’t make much money. I’ve sold a few thousand units over the years, which I’m very thankful for, but it’s never actually been worth my time. Rather than maintaining that app, I’d have been better building an app for somebody else and getting paid.

It took me a long time to accept this simple truth.

Uncontrolled feature creep is the biggest issue I face.

I recently had a user state, in an email, that if I added feature X, they’d buy ten units of the app. I knew it would take me 20+ hours to implement this and that ten sales hardly covered 1/2 an hour of my time, but I went ahead anyway, knowing full well, that I’d probably never see a return on this investment. I justified it by saying “if I add feature X, more people will buy it”.

The fact of the matter is, it won’t make a blind bit of difference. I’ve had this request from two or three other users in the past three years.

Another justification for adding complexity is that by adding feature X, a large company will buy many, many licenses i.e. £££ for me. Again, reailty has taught me otherwise. I’ve had large multinationals inquire about the app and large scale deployments, but none of them ever made a purchase, despite many changes. An app with just one developer behind it, presents too much risk for companies, which I understand.

I’ve come to realise that, when you’re on your own building apps, simplicity is probably best. My iOS apps, Roomr and Peopler started with a very narrow focus on doing one thing and doing it well. Somewhere along the road, I lost focus on that. Sure, it was fun and interesting working on the complex stuff, but in the end, I think my nerves and customers, suffered.

I had planned on Roomr 4.0 being more complex than the previous versions, but I think it’s time to start ripping stuff out and making the app more focused than before. I’m also going to try ad support. If I can generate more revenue, it will be easier for me to update the apps.

This will, I suspect, upset some existing customers, but I would rather try a new approach, then kill the app off completely.

Roomr 4.0–Inviting people

My work on Roomr 4.0 continues! One of the most requested features when creating meetings is the ability to invite other people.

Starting with Roomr 4.0, this will now be possible. The UI is still evolving, but here is an early look.

Simulator Screen Shot 6 Apr 2016, 10.01.08

You just type the name of person you want to invite to the meeting and Roomr will search Exchange for any matches. You can select multiple people to invite and the UI is similar to the iOS native calendar, so it should be pretty easy to use.

It’s a work in progress, but if you’d like to try Roomr 4.0 whilst it’s in beta, please drop me an email ( or message me on Twitter (@tomasmcguinness)

Roomr 4.0, the first beta

This morning I submitted the first build of Roomr 4.0 to Apple for Beta Testing.

I know it has only been three months since I released 3.0, but I’ve decided that since I’ll adding two or three large new features, that 4.0 seemed more appropriate.

So what is coming in 4.0?

With Roomr, there have been a few consistent feature requests.

  1. Browse all the rooms like I do in Outlook.
  2. Invite people to meetings.
  3. View the details of a meeting.

I’ve resisted implementing some of these (2 & 3) because I felt they were in keeping with the spirit of the app.  Request 1 was due to sheer complexity. Roomr uses Exchange Web Services for availability, but this doesn’t offer any access to the Address Book within Exchange.

Browse all the things!

After pushing back, I decided to roll up my sleeves and try to tackle request 1. Lots of people had written to me asking why they couldn’t browse rooms. When I explained that you could using Exchange Room Lists, I was met with blank stares and comments like “My IT guys won’t do that”. I took the stance of “sorry, but hard cheese”.

On reflection, this wasn’t the best idea I ever had.

You see, Browse required an upgrade to Pro or the purchase of the Pro version.

You can imagine that a lot of people were quite pissed off that, having upgraded, they still couldn’t browse. I’ve seen quite a few refunds issued because of this. I mean, I don’t blame people, in spite of the fact it was clearly stated in the description of the app that Room Lists were required. People see it work in one bit of software and expect it to work like that everywhere.

I rolled up my sleeves.

Exchange implements a protocol named MAPI. This, traditionally, is accessed using RPC. RPC is hard and really low level (we’re talking TCP streams).  I wrote RPC implementations in C back in 2002, so I was no stranger to it.

Thankfully, Microsoft have “upgraded” this over time, offering RPC over HTTP. I read the specification. Twice. And decided that wasn’t going to happen anytime soon. With Exchange 2013, Microsoft added MAPI over HTTP. Not exactly JSON based, but doable. It was still binary, just blobs of bytes sent over HTTP, which, in reality, is no different from a JSON based request. Old School.

I read the docs and set about building an implementation in C# that used lots and lots of Byte[]. After lots of short bursts of work spanning a few weeks, I got it working. I then ported it to Objective-C and, after more trickery, I got it working with Roomr.

Simulator Screen Shot 29 Mar 2016, 09.31.04

This screen shot shows the updated Browse view, where you can see the All Rooms address list and the Room Lists.

Expanding the All Rooms list shows all the meeting rooms within Exchange.

Simulator Screen Shot 29 Mar 2016, 09.31.09

I’m pretty proud of myself right now.

I hope this will make Roomr much more useful to people, since they won’t be replying on their IT guys to create and maintain Room Lists. I also hope it’s more accessible.

I’m planning on making Browse “free”, so it won’t require the upgrade.  I hope this will encourage more use and by making other features premium ones, such as booking and opening appointments, I’ll encourage more conversions.

I will only know if I try.

If you’d like get an early look at Roomr 4.0, please get in touch and I’ll invite you to the Beta. This

This stuff is all quite new, so the more instances of Exchange it is tested against, the better.

Thanks for reading,


PS I’ll be writing up a post on how I got MAPI over HTTP working. I’m sure about four people in the world will find it interesting, but it’s been an experience trawling through 9 different PDFs and reading hex code Smile

Explain FreeAgent bank transactions using email receipts

As part of my ongoing efforts to integrate email and FreeAgent, I’ve created a short screencast that shows how Invoice Porter can automatically explain bank transactions based on email receipts sitting in your inbox.


The product is in beta right now, so if you’re interesting in trying the service, you can hop on over to and signup.

I’d love to get your feedback!

Introducing InvoicePorter for Email

Some of my regular readers (?) will recall a post I made on the first of February, titled “Import SaaS invoices into FreeAgent”. In this post, I outlined a Chrome Browser Extension I built that short circuits some of the effort needed to get invoices from your various online providers into FreeAgent. This little utility has been saving me time and hassle and I figured others might find it useful too.

I don’t use Chrome

After sharing it, I got some feedback from people saying a) they didn’t want to use Chrome, b) they didn’t want to have to visit lots of websites to get their invoices and c) they just use their inbox. On further questioning, I was surprised to discover that these users focus their efforts around email and spend time exporting and importing PDFs. This is an activity I perform once a month, since my accountant emails me an invoice.

I had considered email integration when I first started working on a solution to my invoice woes, but one of my concerns was privacy. I didn’t want to capture or store user’s information. This made a local browser extension an ideal solution since the data only leaves your computer when going to FreeAgent. That said, there seems to be a few people doing this mundane, repetitive task a few times a month.

Automate it!

I decided to see is this was something that could be automated, for everybody knows that computers love mundane, repetitive tasks (until they rise up and enslave us).  The idea was simple. Connect to your Gmail account, import emails that contain invoices and add those invoices to FreeAgent.

After a few hours reading the Gmail API documentation and screwing around with OAuth (!), I figured it was possible, so I got started.

After three weeks of coding for a few hours each evening, I’m proud to say that I got it all working. It’s not fully automatic, but enough to make the chore less annoying! MVP and all that.

Invoice Porter 0.1

This is Invoice Porter 0.1. Forgive the name. All the cool invoice related names are taken.

Setting up Invoice Porter is straight forward. You need to connect to both FreeAgent and Gmail. This is done use OAuth, so no messing around with passwords. Gmail access is Read Only, so Invoice Porter can’t alter your account or send emails. This is the settings screen.


Ignore the fact the Enabled switchs are off. It’s more for decoration.

You can see under the poorly titled “Connections” heading, that I’ve connected my Gmail account and that I’m using a Label called invoices. When you add the Gmail connection, you can choose any of your existing labels. Using a label means that Invoice Porter is only notified of email that’s tagged with that Label. This saves my backend code having to sift through all your email and it gives you more control over what invoices are actually processed.

Once hooked up Gmail, you just apply the “Invoices” label to emails as they arrive. I also think Gmail will let you do this automatically, but I don’t know. I should, but I don’t.


Once you start tagging emails, they will appear under the Invoices tab, automatically!


This screen isn’t great (who needs to see milliseconds?) and you’ve probably spotted the emails are from me (I’m forwarding them for testing purposes), but I hope you get the idea.

Clicking on an invoice opens the import screen.


On the right, you’ll see a preview of any PDF that has been attached. I’m using an evaluation library to render it as an image (hence the red text sprawled across it). The idea is that you’ll see the content of the invoice, giving you an easy to to copy it across into the relevant fields on the left. In the image above I’ve used a random PDF for demonstration purposes.

This should make it easy to import into FreeAgent. At present, this screen will create an explanation for the selected bank transaction, so you can use some of the details (such as date and amount) to prepopulate the fields even further. If you’re like me, lots of invoices come from the US, so they are in dollars, whereas the bank transaction is in pounds. Use the details from the transaction itself means you don’t need to worry about trying to guess the exchange rates.

The Tech

In terms of technology, InvoicePoter is written using ReactJS with a C# WebAPI backend, hosted on Azure. Data is persisted using Azure Table and Blob storage. Unfortunately, Table Storage isn’t really suited for storing a few rows per user, so I need to look at something else, maybe DocumentDB. Authentication is provided by Auth0. Pretty slick.

What’s next?

I’m quite keen to release this application onto the world. I have to clean a few rough edges in the UI and I need to move it from sandbox APIs to production APIs. I also have to sort out refreshing access tokens and renewing Gmail watches, but that should be straight forward enough.

I need your help

I really need to get this product & idea evaluated by real people, to be sure it’s helpful and something that saves you time. I was to eventually automate it, so that PDFs can be parsed automatically and explanations created with your direct input. To this, it needs to be generating revenue and I can only generate revenue by building a product that makes people’s lives easier.

If you’re somebody that’s currently saving their PDFs to disk before adding them to FreeAgent, I’d love for you to get in touch. My email is

If you’re not, but you know somebody who might be, could you please share this post with them?

As always, feedback is welcome. If you’ve any questions or comments, email me or use the comments section on the blog.