Psst... we're hiring! Check out our open positions →

One of the coolest parts of working at GroupMe is hearing stories from our users. We love to hear about how groups of people (like classmates, coworkers, family members, and fantasy footballers) are using the app to stay close to one another.

We figured that a lot of these kinds of groups probably spend at least some time hanging out in real life. It’s for these groups that we developed a new feature in version 4.3.3 of our iOS app, that makes it easier for users to add friends to a group while they are physically close to one another. It’s a new part of the ‘Add Friends’ screen, and it looks like this:

This screen uses a new iOS 7 -only API called iBeacon to let users locate other users around them via Bluetooth so that they can add new members to a group with one tap. This bypasses the normal procedure of adding a user by manually typing out their name and phone number or email address. Our hope is that groups of people can use this feature while gathered in the same room to quickly form GroupMe groups, keeping everybody in touch after everyone goes their separate ways.

Everyone’s an iBeacon

Much of the discussion around iBeacon tends to describe beacons as fixed points in space, and a user’s iPhone as a listener, receiving signals from the beacon as it gets closer or nearer to the beacon. An iBeacon could live underneath a cash register at a retail store and help customers check out faster when they approach it with their device, or could be stuck on a wall next to a painting in a museum and buzz a vistor’s phone to tell them about its history. A part of the API that’s slightly overlooked, however, is the fact that iOS devices can not only listen to beacon signals, but transmit beacon signals themselves. It’s this slightly different way of thinking about iBeacon that powers our Add Friends Nearby feature. When a user opens GroupMe, they essentially become a walking iBeacon and broadcast their presence to all other GroupMe users. When they tap the ‘Add member’ button, they become a listener of iBeacon-s, and are able to find the beacon signals of users around them.

Why not regular-ol’ Core Bluetooth?

All of this, of course, is entirely possible to implement using Core Bluetooth, an iOS API that has been around since iOS 5. Moreover, using Core Bluetooth could potentially give this feature more functionality, for example the ability to broadcast while the app is in the background. We wanted to try both approaches to see which worked better for us. To this end, we defined a simple interface for all the Bluetooth functionality this feature would need, and coded the feature both ways. We then could test the two versions to see which one we liked.

So why did we choose to use iBeacon, over the more established, compatible, and featureful Core Bluetooth API?

One feature we really wanted to get out of our Core Bluetooth implementation was the backgrounding that CB provides. We thought it’d be neat for users to be able to add people to their groups without those people necessarily having their phones unlocked, with GroupMe open. We were able to achieve this, though with mixed results. Core Bluetooth makes it fairly trivial to implement these kinds of background broadcasts, but they’re flaky. In particular, our tests showed that polling happened far less frequently while running in the background (a discovered device would reply to pings somewhere about 1/10 less frequently in the background than in the foreground). We think that this impacted our ability to quickly and reliably discover nearby devices, which kind of broke the feature entirely.

Our flaky initial Core Bluetooth implementation could almost certainly be improved in a few iterations, but here’s something else we didn’t like about Core Bluetooth:

That’s the permissions alert first-time users would get, had we implemented this feature with Core Bluetooth. Kind of an unsettling warning, but more importantly, one that doesn’t really communicate what it is the app is doing. The prompt for iBeacon permissions is a little nicer:

…and as a bonus for us, iBeacon requires a privacy permission that our users might have already opted into, if they’ve ever shared their location to a group on GroupMe.

Bluetooth Disabled

Most users out there don’t have Bluetooth enabled on their phones because every “How to make the most of your iPhone’s battery” listicle has a tip advising users to turn Bluetooth off to save battery. It’s true! Turning Bluetooth off will save battery power, but that doesn’t mean power-conscious users should be left behind. One of the reasons why we chose iBeacon was for power considerations, or rather power constraints. Since iBeacon broadcasts only work when the app is running (and the app only listens for iBeacon broadcasts on the ‘Add Friends screen’), we can be reasonably certain that we can keep our users’ phones’ battery from ticking away rapidly in their pockets.

Keep in mind, this is a feature for users who are already in the same room, hanging out. A little user guidance that encourages IRL interactions (“Hey, you should download GroupMe, and make sure you turn Bluetooth on so I can add you”) goes a long way. Hopefully, users will be encouraged to flip that Bluetooth switch on, use our iBeacon feature, and turn it back off when they’re done.

Wait ‘Til They Get a Load of Meme

By camh · November 11, 2013 · 8 notes

Phone Brandon

This is Phone Brandon. He’s been a GroupMe meme since 2011. That’s right. We’ve had meme technology since 2011, when employees Brandon Keene and Pat Nakajima wrote a command-line utility to place top and bottom text on any image and upload it to our team chat.

Guru Spillman

We’ve seen our memes develop personalities. This is Guru Spillman. He tastes the sun in the moonlight. And spends whole days thinking about happiness. Meanwhile, Phone Brandon collects evidence against us and orders Fernet and sodas.

Sometimes memes interact and build off each other. Here, Canadian Geoff (Disclaimer: Geoff no longer works for us but he is definitely very Canadian even if he tells you otherwise) is explaining a Canadian-ism:

Canadian Geoff

Jared Explains responds:

Jared Explains

But mostly they’re just one-off goofs:

Excited Novak

Terrified Cara

Jeremy is Too Cool

Mike Miller Lite

Joey Looks Dead

Sarcastic Neil

I’m not writing this to brag about how hilarious we are. We know we are. But since this has been a big part of the GroupMe culture, we decided to bring it to the GroupMe product.

So now we are making our meme technology available in our iPhone and web app, so you and your friends can have the same fun we’ve had for two years.


This a meme of me. I honestly never understood why my co-workers thought this meme was funny.

All memes are of current or former GroupMe employees.

At GroupMe we’re big fans of Amazon’s DynamoDB and use it extensively. I’d like to share some of the problems we experienced while migrating data into DynamoDB.

There are basically two methods for importing data: Elastic Map Reduce and the DynamoDB REST API. I won’t go into detail about using EMR since it’s well covered elsewhere. It’s quite good at basic import tasks (albeit kind of a pain to set up a cluster) but sometimes you need more flexibility than Hive (or similar) can provide.

Writing a script and using `BatchWriteItem` gives you much more flexibility. `BatchWriteItem` allows you to put or delete 25 items at a time. Most databases will export to something easy to work with like CSV. With a good import script and some UNIX tools like `split` and `parallel` you can easily saturate almost any provisioned WriteCapacity from a laptop.

All of our tasks completed successfully, but somehow we were missing data! We thought the script covered all problems we might encounter during many many hours of writing data continuously. We were careful to retry on common network errors (since the write is idempotent), `InvalidSignatureExceptions` (very occasional failures that go away on retry), and other sorts of recoverable errors.

What could be wrong? At times like this, it’s always good to go back and RTFM *carefully*! Common sense dictates that if a request returns 200 OK, you’re good to go. With `BatchWriteItem` a 200 OK comes with a giant asterisk! Everything is NOT in fact OK. Along with your “success” response, you get this super cool `UnprocessedItems` object. We were totally ignoring it! 

Luckily it’s a very easy problem to deal with. The `UnprocessedItems` object can be fed back, untransformed, into another `BatchWriteItem` request. Once we fixed that, everything was totally fine.

In verifying that we imported the data correctly, we quickly found another problem: the DynamoDB table count is wholly unreliable. The only authoritative count is the one you query for which is 1) expensive since you pay for reads and/or the EMR cluster and 2) time consuming for non-trivial datasets. I wish Amazon provided a reliable count (or at least a close one - we saw advertised counts that were more than double the actual count)

Even with these minor speed bumps, DynamoDB has lived up to its performance promises and is a fantastic solution to certain problems. Try it out!

In our latest release, we’ve added two brand new sets of emoji to our iPhone app (coming soon to Android and Windows phone) thanks to the wonderful artwork of Julia Heffernan!

We wanted our first pack to reflect our company culture; so in this post, we’re giving you a behind-the-scenes look on the rationale behind some of our favorite (yet random) emoji.


  • Neil’s Glowy Glasses - Cam took this picture of Neil at a Kreayshawn concert and shared it with our group. It has since then become one of our earliest memes. (We tend to photoshop our coworkers incessantly – the fruits of that labor are then shared at our weekly meme roundup at Friday’s Townhall.)image
  • Ping Pong Paddle - We have some pretty fierce competition at our ping pong table. Quick story: we once had an intern accidentally spill an entire 5 gallon jug of lemonade on it. Strange yellow liquid started to steep through the floor, into the office below us. Awkward.
  • Lighter - These lighters we handed out at SXSW came in super clutch for late night after parties.


  • The Pivotal Squirrel - The Pivotal Squirrel used to be the mascot of Pivotal Labs / TechStars office until we “liberated” him from unsafe work conditions. He’s now safe and sound in our office lounge/chill zone. Don’t believe anything he tweets.
  • Iced Coffee - GroupMe consumes approximately 12,000 gallons of delicious Grady’s Cold Brew per week. We enjoy its bold taste and smooth finish without the caffeine jitterrssssjklf..
  • Grilled Cheese - At SXSW every year we dish out free grilled cheese, beer and other goodies at the GroupMe Grill.


  • Pinball - We have our very own authentic Medieval Madness pinball machine in the office. Our co-founder Steve reigned for a while, until our developer Neil walloped him one afternoon with a whopping 334,092,960 points. Neil is now ruler of the realm.
  • T-Rex - Our day-to-day GroupMe chat is complete with a T-Rex champagne glass group avatar. The dino is also near and dear to our heart because we used the Jurassic Park theme song as the holding music for our (now defunct) conference calling feature.
  • 100 Badge Count GroupMe tends to get pretty active in big groups, so we created a testament to that in emoji form.

These are just a handful of inside jokes and stories that have made it into our emoji pack. We hope they help create your own story! Download the emoji update here.

What do you want to see in the next emoji pack? Let us know!