Introducing payments via QR code 🎉

Two phones, the left hand side phone is in dark mode and has the user entering a £ amount and a QR code updating in realtime. The right hand side phone is in light mode and shows a shimmer moving across a QR code.

John Yorke here, I am an iOS engineer on the newly-formed core experience squad. We’re rolling out a couple of new features and wanted to give you a heads up.


  1. We’re replacing “Payments with friends” with a more granular “Profile Privacy” system
  2. We’re replacing the link builder screen with a QR-focused experience

Profile Privacy

I won’t spend too long on this one (as it’s arguably less exciting than #2!) but we ran some user-testing sessions late last year and one of the main bits of feedback we received was that people wanted (and have come to expect) more granular privacy settings than we offered at the time.

To use our social features (Bill Splits, Shared Tabs, we required the user to have opted into ‘Payment with friends’ and have given Monzo access to their contact database on their device. Right off the bat, this was with good intentions. We thought it was simpler to have just one toggle and we went out of our way to never extract full phone numbers from the device (this is still true by the way). For all the simplicity - it was a bit of an all-or-nothing approach.

Introducing Profile Privacy. This new system allows you to control how people can find you - via username/QR/ or via the privacy-focused phone number matching service. It doesn’t control who you can find - ergo, it does not require access to your contact database.

This means you can take part in Bill Splits, Shared Tabs or share links with other friends that are happy to do so. If you allow yourself to be discovered by phone number, then you will appear in the results for the partial phone number your friend sends up. Change your mind and want to stop appearing in those results? Head to Profile Privacy and flip it off.

All-or-nothing approach is gone, privacy is now in your hands. QR codes allows you to receive money easily via a dedicated web address for your account (in fact it’s even easier now we’ve enabled Apple/Google Pay on there :tada:). You can request specific amounts and add a reference too so the recipient of the link knows what you’re requesting it for (and yes it supports emojis :stuck_out_tongue_winking_eye:).

Thanks in large part to COVID, QR codes has now become ubiquitous in this country and help seamlessly bridge the gap between physical and digital. So in an effort to offer yet another way to get paid ~early~ on time, we’re keeping the same great link builder but adding a beautiful Monzo specific QR code alongside it too.

You can still set a custom amount and add a reference, and when you do so you will see the QR update ready for your friend to pay-up. If they’re on Monzo, they can scan it and go straight to the Monzo-to-Monzo payment flow, if they’re not on Monzo they will go to the web address where they can pay via bank details or Apple/Google Pay.

Don’t worry, sharing a link is still a thing too. You can always share your amount and note-less link by tapping your profile icon at the top, or if you want to share a customised link then you can tap “Share a link instead” button at the bottom.

‘Nearby’ is also still there for when you’re part of an exclusive all-Monzo collective, but QR helps bring some of that magic to non-Monzo friends too. We’ve been testing it for a while and we love it! We think it’s the fastest way to get paid back.

iOS and Android nuance

Early on in this project, we faced a bit of a crossroads when speccing out the QR code generation. iOS has a nifty CoreImage “filter” to generate QR codes quickly and natively, where Android sadly does not.

We investigated some 3rd party libraries on Android that could help us do it all ‘on-device’, but nothing met our criteria when selecting 3rd party dependencies. It needs to be well-supported, secure and do its one thing well (ie. not introduce 100s of classes we won’t use). We weren’t fully convinced by any of the libraries we saw.

So we took a decision that we don’t take often at Monzo, and opted to deviate in terms of implementation. The iOS client will render the QR fast and do all the computation on-device, the Android client will hit an endpoint and request the QR graphic over-the-air.

As with everything, there are pros and cons to both approaches. On iOS, if we discover a bug in the QR code (perhaps we miss the “.” in the URL) or that the code doesn’t scan well in certain environments - we’ll need to submit a new version of the app and wait for weeks for it to propagate down to our customer’s devices. That same situation on Android can be fixed on the backend and a fix deployed within hours.

What do you gain from doing it on the device however? Speed. The iOS code generation is so fast it can pretty-much keep up with your typing and it means your code is always available, even in rough network situations.

Doing it on device on iOS also freed up the engineering effort to add some nifty real-time effects to the code - move your device to see a shimmer move across the code as if it were printed and shiny. The Monzo logo in the centre too reacts to the movement of your device. Whimsical touches perhaps - but fun!

A recording of a phone being tilted from left to right and the Monzo logo in the centre of the QR code appears 3D by bevelling in sync with the device movement.

Android on the other hand, has a super robust and much more flexible and readily upgradeable solution. We put great effort into updating our existing backend QR image generation services (used in Business Banking) to produce fancier graphics with subtle gradients and light/dark mode support. We also made it faster, so when you’re generating a code you should see the response come back and the screen update super fast!

Everyone is a winner! And we’re not overly committed to either approach. If we get feedback that people love how fast iOS feels, we might re-consider 3rd parties (or write our own) on Android. If Apple break or drop support for the QR code filter, we might want to avoid being exposed like that again and switch to backend generated codes.


Thanks for lending me your eyes. I set off to write something “quick” for the community post and have instead given you a rather large peek behind the curtain of our product and engineering mentality.

I hope you enjoy this write-up as much as I enjoyed writing it. Can’t wait to hear your thoughts and ideas.


So that explains why we get the fancy super duper cool parallax one on iOS and poor little @ordog does not.

Please don’t ever change it for android parity and faster over the air fixes! It’s a truly breathtaking implementation and it would be a shame to lose it.

Honestly, if building your own 3rd party option would allow you to replicate what you’ve done on iOS for android users, do it.

It’s probably my favourite little thing Monzo have made in a very long time.


I can finally sleep at night now :smiley:

Jokes aside, love the detail and although sad it seems to be the right thing to do :slight_smile:


This is amazing. It’s not as shiny as the QR code (great as that is!) but the privacy enhancements are particularly useful.

Thanks so much for both the work and the excellent post. 11/10 foruming, would read again!


I think this is great, I barely use, but when I do, this’ll be handy


Great improvements to see!

Not the end of the world but is there anything that could stop the QR Code having the effect on iOS, it’s static for me.

iPhone 14 Pro, don’t have low power mode enabled or reduce motion. (The only things I thought might cause this)

Apple / google pay are SO good!!!

Also shout out to the new updated QR code on the website – Pay Autumn instantly with if you want to check it out )


This is what it looks like in the app

That’s great to hear :raised_hands:

You could argue it’s whimsical and unnecessary, but personally I like a little whimsy in my software if it’s subtle and used sparingly.


Thanks for the support :handshake:

Like I mention, we’re not fully committed to either path - it just made sense at this time. If things change, we can address.


Looks great this, you know what works well with QR codes? Open Banking account to account payments…

1 Like

:100: the new privacy changes are great.

I actually really liked the old model for its simplicity, but I am someone who very rarely gives apps contact access so this kind of change would really appeal to me.

I think there’s potential for a separate community/blog post about how we do contact matching at Monzo. When you (the user) give Monzo access to your phone book, we (being the Monzo backend) don’t ever get full phone numbers and engineers of old (4/5 years ago) built a brilliant privacy-preserving system that meant you didn’t sell-out your contacts out by giving Monzo access. It’s really great and we didn’t go a very good job of selling it. But in the (rather confusing) words of Maz Kanata, that’s a story “for another time”.

Important: The above model is still being used, so that hasn’t changed.


Will the new Monzo me be available for joint accounts?


low power mode enabled or reduce motion

We have support for “reduce motion” so that would have been the first think I suggested :thinking:

What iOS version are you on?

Great shout, forgot to mention that!

This is another benefit of updating our backend QR service; we have consistency and the neat gradient, logo, etc, wherever we use it.


Has nearby moved?
I no longer see a nearby button.

If you go to Payments tab > Pay it should still be there. It will also appear when you go to select participants for a Bill Split and a Shared Tab.

We have some big Nearby fans in the company who still like the Nearby icon at the top of the Payments tab, so that is something we could consider, but there isn’t a tonne of space up there.




Unfortunately this choice is highly disabling for those who need to avoid bright light in order to stay well. Unless Monzo reconsiders the serious accessibility issues this feature creates for people with sensory processing disabilities, I will need to move my money back to Starling

1 Like