Follow our work

Introducing Keyboard Shortcuts

Carom aspires to be the indispensable, one-stop source of everything you need to know about your clients, customers, and prospects. If you use Carom every day—as we’re doing to run our business—little things add up. Small time savings, over and over, are material; minor annoyances become major headaches.

That’s why we’ve just implemented keyboard shortcuts.

If you look around at people who move quickly on their computers—think the airline ticket agent whose fingers never stop moving—they all rely on keyboard shortcuts. Once you’ve trained yourself, a keyboard is much faster than a mouse.

We’ve added about twenty different shortcuts, some available globally (like navigation) and others tied to specific records or views (like navigating search results or viewing individual records). Here’s the list of shortcuts we have in place today, which you can view within Carom at any point by typing a question mark (?) from our interface.

We tried to stick to a few tried-and-true principles in developing our shortcuts:

Adhere to existing standards

We’re trying not to reinvent the wheel. Whenever possible, your fingers should already know what to do. To navigate a list, for example, you can use the same shortcuts used by other popular web apps—j for down, k for up, enter to select.

Likewise, you can close any pop-up dialog box by typing escape, or you can view the full list of shortcuts at any time by typing ?. You probably could have guessed those—and that’s the point.

Develop coherent shortcut logic

Remembering shortcuts is a much easier when they follow a consistent, logical set of rules. For navigation between different parts of Carom—for instance, to go from the dashboard to the list of people or your deal dashboard—all shortcuts include the shift key. Some web apps, like Gmail, use g + another letter, but we think our approach is a bit more straightforward.

We use tabbed interfaces throughout Carom. Tabs are necessarily different from one record to the next, since some records have more associated information than others. So we make navigating between tabs consistent everywhere across Carom by using numerical shortcuts. To view the first tab on a page—whatever it might be—just type the number 1. For the second, enter 2, and so on.

Aim for exhaustive

We’re certainly not done: as we build new features and find important functionality not accessible via shortcuts, we’ll add more. But we’re aiming for a fairly comprehensive set of shortcuts, so that you can do almost anything without touching your mouse. For power users, that’s a necessity—keyboard shortcuts aren’t valuable unless you can use them consistently.

Parsing Email with Mailgun

I wrote a few days ago about why and how Carom will work with email. Today, I want to provide some details about how Mailgun makes that as easy as working with a simple POST request.

Accepting incoming email is hard. If you do it yourself, you need spam filtering so you’re not overrun with garbage, you need to connect your mail server to your application layer, and you need to learn a bunch of email formatting standards so you can properly interpret the messages you receive—even though many mail clients don’t respect those standards.

In short: running a mail server is hard. And since we don’t have to do it, we chose not to.

This post provides some technical details about how we’re working with Mailgun. If you’re not a developer, you might not be interested; if you are, read on!

Routing incoming emails to Mailgun

Routing email to Mailgun—and in turn to our servers—requires two steps, both very easy.

First, create a DNS MX record that points to Mailgun’s servers. We’re forwarding mail send to * to Mailgun, which allows us to handle mail sent to the naked domain (e.g., using our own mail provider.

Next, tell Mailgun where to route the email it receives. For now, we have a simple matching rule:


Emails sent to address matching our rule are forwarded to an address we specify, with the first match group representing the account’s subdomain. Even though we check on the server side to make sure that the email corresponds to an existing dropbox (using the 12-character key included in the dropbox address), we also have Mailgun send an authorization code to our servers so we don’t bother with malicious POSTs to Carom from elsewhere.

We created these routes using the Mailgun control panel, but you can also set routes via API. If we find ourselves receiving a lot of spam sent to invalid email addresses (since our routing rule is fairly simple), we can instead use the API

Parsing the incoming request

After receiving an email that matches one of the routes we’ve specified, Mailgun sends a POST request to the URL we specify with

It’s worth noting that we’re choosing to parse the email on our end, rather than rely on the stripped-text message that Mailgun provides. There are three major reasons we’re making that choice:

  1. Given that email is a big part of what Carom provides, we want a lot of flexibility in how we handle it. Mailgun’s parsing could well be better than ours right now—but we want to be able to improve our parser over time as we receive emails in the wild.
  2. Mailgun provides a stripped message without the previous replies in the email thread. But since we display these replies in our interface, we need to process them further to split replies, identify senders, and so on. Once we’re writing a parser anyway, splitting the most recent message from the rest is fairly simple.
  3. Most importantly, we expect that most of the emails we receive will be forwarded by our users. That means that the stripped-text message Mailgun provides will be the text forwarded by our users, not the text of the email they’re forwarding.

Having said all of that, based on our limited testing the stripped-text parsing seems robust, and certainly Mailgun has plenty of experience to draw upon in developing it. For many uses, it’s probably a better option than parsing on the application side.

Storing emails for processing

Mailgun also provides a convenient option to store emails and retrieve them for processing later. For now, I think we can process email quickly enough (and our volumes will be small enough) that it’s easier to simply receive a POST from Mailgun and process it in the moment than it would be to store an email ID and retrieve and process the email in a background process.

The option is a useful one, though—if we find ourselves inundated with email at some point, it’s nice to know that we can offload some of the work to our background workers, which can scale more or less indefinitely and don’t affect the performance of the main web server.

Startup-friendly pricing

Perhaps best of all, Mailgun’s pricing is great for startups. Mailgun provides 10,000 free incoming or outgoing emails per day—a limit we might not pass for a while. When we do hit that threshold, Mailgun will cost us $1.50 per 1,000 emails, which should be affordable.

At a certain scale (and depending on the depth of Mialgun’s volume discounts), it might make sense to take email parsing in-house. But we’re a long way from that point, and for now Mailgun is making our email processing cheap (actually, free) and easy.

Carom Analytics: Free, Instant Stripe Dashboard

Today we’re very excited to announce a new, free analytics tool: Carom Analytics for Stripe.

We’re in beta now while we make sure Analytics works for every possible Stripe setup. To join the beta or be notified when we launch, just provide your email address and we’ll invite to join Carom Analytics as soon as possible.

In one click, we’ll take your raw Stripe data and turn it into a beautiful dashboard that highlights the metrics your business’s health depends on. Here’s a sample, or you can view a working demo:

Metrics that matter

We built Analytics for Stripe to give ourselves and other Stripe users access to the metrics that drive their businesses.

That means going beyond “vanity metrics” like customer counts and revenue to date and looking at the data that determine whether your company thrives. It’s not about showing you your data, it’s about enabling you to improve your business.

Carom Analytics includes, among other metrics:

  • Monthly revenue per customer, so you can tell when your customers’ purchasing behavior changes.
  • Churn rates that help you improve your customer retention.
  • Customer lifetime values that tell you how much a given customer is likely to be worth over the course of your relationship.
  • New and cancelled accounts so you can quickly identify what’s working and what isn’t.
  • Plan-specific breakdowns that let you drill down and see which products are propping you up and which might be holding you back.

We provide all of these out of the box. You just connect your Stripe account, and we’ll calculate everything you need.

And as long as you choose to use Carom Analytics, we’ll keep your data updated when you add and lose customers and bring in new revenue.

Laying the groundwork for Carom

We’ve extracted Analytics from our upcoming CRM product, which integrates with Stripe and other popular services to help you understand and work with your current and prospective customers.

When we launch Carom CRM, Analytics will be able to access all of their Stripe data through the CRM. That means, in addition to overall metrics, you can create meetings and to-dos tied to specific customers, record email conversations, track leads, and much more.

We don’t ever plan to charge for Analytics for small businesses, but soon you’ll have the option of turning your analytics dashboard into a powerful CRM in one click.

For companies with more than $25,000 in monthly revenue, get in touch and we’ll work with you on pricing that works for us both.

Integrating with Email

For most companies, email is (for better or worse) at the heart of nearly everything you do—scheduling meetings, talking with clients, sharing documents, and so on.

CRM applications needs to walk a fine line—recognizing that email is central to so many things, so nobody will abandon it in favor of another system, but at the same time reducing the reliance on email that means that information is so often lost in the depths of an inbox.

Our goal with Carom’s email integration is to listen without being in the way. You can keep working over email and we won’t interrupt—but when you want to remember a customer interaction or keep track of a task you have to do, Carom will be there to help: just forward an email to your personal Carom dropbox or BCC it during your conversations.

Building a “smart dropbox”

Carom provides every user a unique dropbox email address that looks something like this:

Where widgetco is their Carom account subdomain and the random 12-character string that follows is their mailbox’s unique identifier. We use the unique identifier to map emails we receive to the accounts and users they belong to.

Carom is smart about how it handles the emails it receives.

First of all, we’ve done a lot of work to parse emails intelligently. We’ll automatically split apart past replies and show your whole conversation in an easy-to-read format.

Secondly, if you forward an email into Carom, we’ll separate the message you forward to us from the conversation you were having with a customer. That way you can send Carom a note about why you’re forwarding the email or what you need to do next, without your note getting in the way of reading the conversation you’ve had.

Here’s an example of what that looks like:

Automating follow-up with filters

There’s more to email than receiving, parsing, and storing it. Sometimes you want a record of a conversation for future reference, but often you have a next step in mind: create a task, generate a lead, create a meeting.

Carom’s smart filters allow you to do all of this without leaving your email client. Just append a filter to your dropbox email address to tell us how to handle the email you’re sending. For example, send an email to:

Carom will create a task for you, using the subject of your email or a note you forward along with the email thread.

Some filters also allow you to pass some additional options. For example, to create a task due today, you would email:

As you’d imagine, a task due tomorrow would include the filter task.tomorrow; a task due on May 24 would include task.2014.05.24.

To generate a new lead from a task, just do this:

We’ll write more about this—including a full list of filters and how they work—when we get closer to launch. But this should give you an idea of how Carom plays well with email, and how you can use our system to supplement your existing email workflow without disrupting the way you work.

Why We're Building a New CRM Platform

Today’s businesses have more and better tools than ever before to run all aspects of their companies.

Stripe is great for recurring billing and subscription management—a vast improvement, in every way, over PayPal and traditional merchant accounts.

MailChimp and Campaign Monitor are great, easy-to-use tools for managing mailing list subscribers and sending email blasts.

Help Scout and Desk help support teams triage and track incoming requests much more effectively than the most common alternative, an email inbox.

Mixpanel and KISSmetrics give businesses an incredible amount of insight into customer behavior so you can see what’s working in your applications and what isn’t.

Filling the gap: a customer-centric hub

We use many of these tools to run Camelot, our product for helping political campaigns and non-profits understand their constituents and conduct outreach.

But what’s missing from our setup is a good way to connect disjointed customer data. If a customer cancels her subscription in Stripe, we need to check our support system to see what problems she might have had. If we want to see how our prospective customers are faring, we need to read through a bunch of old emails.

So we investigated a number of CRM (customer relationship management) tools, but none of them did what we need. Many are too enterprise-focused—designed to sell big support contracts over rounds of golf, not for the end user. Others are too sales-oriented, and they stop being useful once we bring a new client on board. Most have integrations that are too superficial to be valuable, so we still find ourselves searching for data across a number of different platforms.

What we really want is a hub for understanding and helping our current and future customers.

And since we didn’t find one, we’ve decided to build it.

Keep following this blog to learn more about Carom as we’re building it. We’ll aim to provide valuable information about business, development, and Carom itself.