Today’s the day: Write your first Visualforce email template!

I shied away from Visualforce email templates for much longer than I should have. Mostly because there was never a burning need for me to create anything. Then, two situations arose that called for some snazzier email templates than plain text could provide. Time to write some Visualforce!

Visualforce templates are good for when you want to render information conditionally and/or you want to show a list of related records. You can’t render information conditionally in a plain text email or HTML email. And you certainly can’t show a list of records.

Read on for two examples and code samples that you can copy + paste!

The Conditional Render

I do best with real world examples, so here’s an example of a plain text email that needs a serious refresh:

V.1: Lots of superfluous information.

This email gets the job done but is missing a few things:

  1. Clear formatting that explains what the user should be looking at. There is no bolding or anything so it’s easy for the eyes to glaze over.
  2. Usage of “1” instead of “Yes.” It’s not fair to assume that your users will understand a boolean value (notice how I wrote the little explainer at the bottom to be on the safe side).
  3. There are no notes about the lead’s marketing…yet that label is there. 😕

Okay, so all the important information is there just not presented in the best light. Don’t let the perfect be the enemy of the good. Notifying your users certainly beats the alternative! But, if you’re interested in cleaning up the template slightly — read on.

V.2: Cleaner, strategic bolding, and only rendering information that matters to the user.

Let’s dig into the nuts and bolts of the code that fuels this email.

Lines 1–7: Setting up our email with a series of opening tags (if you scroll down to lines 41–44 you’ll see the closing tags). The body of your email need to be in between these tags.

You can declare who the recipient will be and what object you’re referencing — in this instance a lead.

Lines 10–17: This is the main body of the email that provides all of the lead’s contact information. Something that is frustrating with Visualforce templates is the UI doesn’t provide the merge fields for you. I recommend opening up your field list for the object in question so that you can quickly reference what their API names are.

The <apex:XX> tags are specific standard components to Visualforce and each have individual behaviors. Salesforce lists all the components available in their documentation.

<apex:outputLink> is giving me my record link. Note that my instance is not hardcoded — this is a best practice. You can feel free to copy that exactly, since it’s what I did. 😇

Lines 21–24: I used the Visualforce component <apex:outputPanel> because I wanted to render all the information below depending on whether it was visible or not.

Another way to do this would be to make each line render conditionally, but it was creating a lot of weird whitespace so I went with this solution.

The rendered aspect has me checking 6 boolean fields and 1 text field to see if they are true/populated. If so, then continue to render the information below.

Lines 27–33: This is where I conditionally render the field labels and values of my boolean and text fields. I have the following fields: Restaurants, Food & bev manufacturers, Grocery, Higher-ed Admins, K-12 Admins, Agency, and Media Kit Comment.

If any of these fields are true, I want to render the label I’ve created and bold it. For example: Media Kit Comment: I’d like to purchase $100K of advertising ASAP!

I have to conditionally render this because just because Agency is true doesn’t mean I want to the field label for Media Kit Comment to show!

Lines 35–44: This is the rest of the email, and I’m closing out the tags. Notice I put a little more text after </apex:outputPanel>. If I had put it inside the tags, it would have also rendered conditionally.

The List of Related Items

Another good Visualforce email use case — what if you wanted to show a list of records related to an object, such as opportunity line items? Completely doable with the <apex:repeat> component.

Here’s an example of an email that we send internally to another department. The parent object is called a Project and the child records are Project Tasks:

This Project had 2 related Project Tasks that needed to appear in the email.

Lines 9–15: Some styling that I just left in there because I borrowed this template heavily from another template. You could remove it if you don’t care about the table headers/rows are rendered.

Lines 19–25: I am creating the labels for the columns my table will have.

Lines 27–36: This is where the magic happens. ✨ Using <apex: repeat> I’m able to set a variable name (pt) for my related object Project Tasks and iterate over them. I also utilized <apex:outputPanel> because I only wanted to render specific records. If you want to show everything, you wouldn’t need this part.

Note the pluralization! I initially wrote {!relatedto.AcctSeed_Project_Task__r} when it should have been plural. This absolutely killed me when I first started. Read this for more details on object relationships. I’m still not great with this.

Lines 37–50: This is closing out the email with all the tags, very similar to the first email.

Lines 55–71: This is actually the same email — just in plain text format! Given that this is going to an internal user and I know their email can handle it, I probably don’t need it. But leaving it in case you have a use case for it!

Line 73: Everything needs to stay inside the final </messaging:emailTemplate> component.

If you try to build a template, let me know in the comments!

Further reading:

Creating a Visualforce email template (Salesforce docs)

Not so scary VF templates for admins (Jan Vandevelde’s blog — and what inspired me to write this post)

apex:outputPanel render logic (StackExchange post)

Thanks to Jan Vandevelde and Peter Churchill for their help while I tackled these two email templates. ☁️

Lead Source quirks in Salesforce

The lead conversion process always is a bit stressful. Fields from one object are mapping to another and you want to make sure everything is working correctly and nothing is getting overwritten. Additionally, one of the most valuable fields for sales and marketers starts with the conversion process.

That field? Lead Source.

Understanding where your leads are coming from allows your team to focus their time (and marketing dollars!) on those areas. If you go to a lot of Trade Shows and *think* they’re valuable how would you know without marking the Lead Source as such?

With all that said, here are some brief notes regarding the Lead Source field and the conversion process:

  • Leads, Contacts, and Opportunities all have a field called Lead Source. This field maps automatically upon lead conversion and is default Salesforce behavior.
  • Accounts have a field called Account Source and that populates with the Lead Source during conversion.
  • Opportunities will inherit a Lead Source one of two ways: If a user creates an opportunity during the conversion process OR if a user later creates an opportunity from that contact’s record. The contact will also be added as a Contact Role to that opportunity.
  • Account Source will not map to a new opportunity if a user creates an opportunity from the account record.
  • Upon merge of duplicates, make sure to preserve the Lead Source data from the oldest record. This is the closest thing you to truth.

⚠️ If your Account Source field is blank and you convert a lead to that account, the account will inherit that lead’s source. This is bad for data attribution. I have created a default Account Source field called “Unknown” which will prevent the lead conversion process from overwriting the source.

This goes against what the Salesforce docs say but I tested it and so did Amnon Kruvi and we had the same experience. Check out this thread for more:

Anything I missed or that you wish you knew when you starting managing the lead conversion process in Salesforce? Let me know!

Intro to Java: Classes & Objects☕️

“Why Java?” is the question everyone asks me when I tell them I’m taking Treehouse’s Beginning Java class.

My response is always the same, “Because Salesforce’s programming language (Apex) is very similar to Java, but Intro to Apex courses are few and far between.”

For context, I do not have a background in computer science or engineering. But I love Salesforce and technology and developing solutions on the Salesforce platform. When I got stuck on Salesforce’s Get Started with Apex Trailhead module, I knew that I needed to start with the basics in order to succeed with Apex in the long run.

I was familiar with an object thanks to Salesforce. At its base level, an object represents something in the world. A Pez dispenser, a go-kart, or a book. All of these things have unique attributes about them. In Java, these unique attributes are called a class.

Because I love ice cream I’m going to use that as the example for my post. 🍦

Makes sense, right? But you’re probably asking why you need a class for ice cream. It’s totally common sense that ice cream has a flavor and a color. Sure, but what if you were working with something you weren’t familiar with? An Opportunity for example?

Opportunities don’t have flavors, they have close dates and amounts. As a developer, you would have no way of knowing the potential attributes of an Opportunity without looking at its class. You’d be totally in the dark.

So a class is neat template (or blueprint) for whatever object you want to create.

Here’s my ice cream class in code:

class IceCream{
String flavor;
String texture;
String color;
String brand;

I’m declaring the class at the beginning and giving it a name (IceCream). Then inside the curly braces I’m declaring the attributes (or variables) that my IceCream class has. “String” means that I’m expecting a word as my value, i.e. mint-chocolate chip.

But what about objects? Objects are created from classes. This is called instantiation. You can create many objects from one class.

Note: If you are coming to Java from Salesforce, this concept is a bit confusing. Because in our world there are objects (like the Opportunity object) and then records created inside the object. Java doesn’t use the concept of records. They use classes (which is Salesforce’s version of an object) and then objects (which I knew as records).

Not so bad, right? In my next post, I’ll talk about modifiers (which give you a certain type of access to the variables).

Thanks to Craig Dennis & Doug Ayers for helping me with the concepts in this post.

Adventures in Salesforce formulas & validation rules with WEEKDAY(), IF(), & INCLUDES()

Formulas are one of those tricks up an admin’s sleeve that are extremely powerful and cool (or maybe that’s just how formulas make me feel.) 🤔

It almost feels like coding and you can accomplish a lot with just a few lines of formulas in a field or validation rule.

Until recently, my experience with formulas had been pretty elementary but recent projects at work and Trailhead got my gears turning and I realized the endless possibilities of formulas.

In this post, I’m going to walk through a formula I recently built and list some resources that have really helped me as I’ve expanded my formula skills.

All changes in Salesforce require clear requirements and this one was no different. I work for a company that sells online advertising. We send email blasts, newsletters, and other marketing content that advertisers can sponsor. While it’s not physical, our inventory still has restraints. For example, we only send certain email blasts on Tuesdays and Thursdays.

My Ad Operations team who is responsible for trafficking ads noticed that sometimes sales reps would put the wrong date in for a product on a contract and that would cause confusion. If the product date was Wednesday but email blasts only go out on Tuesday or Thursday some back and forth would be required to determine the correct date.

Wouldn’t it be nice if depending on the product a sales rep entered they’d only be allowed to enter specific days of the week?

Validation rules and a complex formula to the rescue! If you’re new to validation rules, check out the Salesforce docs and this Trailhead module.

I wanted the the solution to be modified by an end user and flexible. Some of our products don’t have a specific send date so I couldn’t make a solution that requires a send date or else that would be a problem.

Example of the picklist on a product record.

I created a new multi-select picklist called “Product Send Days” and put that on the Product object. Multi-selects have their downsides since they can be terrible for reporting but for this use case it was perfect. With just a couple clicks our Ad Ops team could update the days of the week our products send.

Now it’s time to flip to the validation rule and the formula. The Opportunity Product object has a relationship to the Product object, which means I’d be able to reference it in my formula. It’s import to remember that when you’re working on a formula. If there is no relationship between the objects it won’t work.

Accessing my Product Send Days field by drilling down from Opportunity Product.

IF(WEEKDAY(ServiceDate)==1 && INCLUDES(Product2.Send_Days__c,'Sunday'),false, true)

So what does the above say? Let’s break it down.

The biggest problem that I immediately saw was that I needed some way to translate the day of the week on my Product object to the actual day of the week that was being chosen on the Opportunity Product. This is where the WEEKDAY() function comes into play.

WEEKDAY checks the ServiceDate to see if it’s equal to 1, which is Sunday. ServiceDate is a field on the Opportunity Product. The INCLUDES() is a function unique to multi-select which checks to see if the multi-select has the value you want. So it’s taking my field Product2.Send_Days__c and checking to see if Sunday is selected.

We want something to happen when we ask the question “Does the ServiceDate equal Sunday and does Product2.Send_Days__c include Sunday?” So we are gonna wrap it in an IF() statement!

IF(logical_test, value_if_true, value_if_false)

We already know our logical test, that’s the WEEKDAY() and INCLUDES() where we’re checking to see if Sunday = Sunday. But here is where it gets tricky. For value_if_true we’re putting false because we don’t want the validation rule to fire. 😳

If the sales rep is entering the date correctly, we don’t want to stop them! So only if Sunday ≠ Sunday do we want it to fire. Note: If you put null instead of false in the 3rd position, the validation rule would not fire.

So now that we’ve broken down how to create it for Sunday, you just need to copy & paste to make it for the other 6 days of the week, like so:

IF(WEEKDAY(ServiceDate)==1 && INCLUDES(Product2.Send_Days__c,'Sunday'),false,
IF(WEEKDAY(ServiceDate)==2 &&
IF(WEEKDAY(ServiceDate)==3 && INCLUDES(Product2.Send_Days__c,'Tuesday'),false,
IF(WEEKDAY(ServiceDate)==4 && INCLUDES(Product2.Send_Days__c,'Wednesday'),false,
IF(WEEKDAY(ServiceDate)==5 && INCLUDES(Product2.Send_Days__c,'Thursday'),false,
IF(WEEKDAY(ServiceDate)==6 && INCLUDES(Product2.Send_Days__c,'Friday'),false,
IF(WEEKDAY(ServiceDate)==7 && INCLUDES(Product2.Send_Days__c,'Saturday'),false,

I didn’t talk about the double ampersands (&&) but that’s just a logical operator for AND. You could switch out && for AND and it would work just as well.

I thought this formula was looking pretty good…until I went to test it. Which is why you should always test before you release to your users. Remember when I said that some products didn’t have specific send days? Well in the formula above there is no place to allow for that. My validation rule is not going to let a user save an Opportunity Line without a correct send day.

So I added some extra logic at the very top.

NOT((ISBLANK(Product2.Send_Days__c)) || (ISBLANK(ServiceDate)))

Here I’m saying, “If the Send Days field is blank OR the ServiceDate field is blank, you can ignore and not fire.” I had to wrap it in a NOT() because I only want the validation rule to keep working if the fields aren’t blank.

Similar to the double ampersands (&&) the double pipe (||) means OR. You can use either!

So here is the final formula in all its glory. ✨

NOT((ISBLANK(Product2.Send_Days__c)) || (ISBLANK(ServiceDate)))
IF(WEEKDAY(ServiceDate)==1 && INCLUDES(Product2.Send_Days__c,'Sunday'),false,
IF(WEEKDAY(ServiceDate)==2 &&
IF(WEEKDAY(ServiceDate)==3 && INCLUDES(Product2.Send_Days__c,'Tuesday'),false,
IF(WEEKDAY(ServiceDate)==4 && INCLUDES(Product2.Send_Days__c,'Wednesday'),false,
IF(WEEKDAY(ServiceDate)==5 && INCLUDES(Product2.Send_Days__c,'Thursday'),false,
IF(WEEKDAY(ServiceDate)==6 && INCLUDES(Product2.Send_Days__c,'Friday'),false,
IF(WEEKDAY(ServiceDate)==7 && INCLUDES(Product2.Send_Days__c,'Saturday'),false,

As promised, here are some resources that have helped me a ton in my formula journey:

Shout out to Natalya Murphy who sat with me at WIT DC’s #SalesforceSaturday to work on this with me. ☁️

Let me know in the comments if you’ve tried a similar formula or if you would have done it differently!

How to use Salesforce Outbound Messages & Zapier to celebrate a closed won sale in HipChat 💸 🎉

I’ve always found Zapier to be a cool tool, but never thought of an application to use it at Industry Dive. My colleague had set up a few Zaps between Google Sheets & Salesforce and had showed me the gist of Zapier, which got my wheels turning.

Then, this happened in our sales chat:

I mean, #duh.

Spoiler Alert: This post is not about how I managed to get specific songs to play from Spotify to Sonos. We’re still using a human for that part of the equation — but if you have ideas, let me know in the comments! 🎵

We quickly polled the sales team to get everyone’s favorite song. Given that we didn’t want complete chaos on the Sonos we decided to limit playing a rep’s song to closed won deals over $15,000. This happens just infrequently enough that it would be special.

So here is where Zapier comes in: How could we notify the team in our HipChat room the second a deal was closed that met that criteria? A simple Workflow Rule in Salesforce would allow me to email the team, but a HipChat is exponentially more fun. 💬


Before following the below instructions, make sure you have the following or else you’ll just get frustrated.

  1. A paid subscription to Zapier. Salesforce is a “premium” application which means you can’t access it on Zapier’s free plan.
  2. A System Admin profile or Modify All Data permissions in Salesforce. Or, just send this to your friendly Salesforce admin, I’m sure she’d be happy to set this up for you. ☁️
  3. Ability to get the an Admin Auth Token from HipChat. This is what Zapier uses to “call” HipChat and access the HipChat room you want to message. This was the piece of the puzzle I didn’t have access to so I just hunted down one of our HipChat admins, asked them the generate the token and then send to me.

Step 1: Open up Salesforce & Zapier and set up the Outbound Message

If you have dual monitors, this will make it a lot easier so that you can flip between the two apps.

In Zapier create a new Zap and select Salesforce then type in “Outbound” into the Salesforce Trigger search. You’ll then be asked to connect your Salesforce instance to Zapier, so go ahead and do that if you haven’t already.

The next step will be to get this webhook, which is what allows Salesforce and Zapier to “talk.” Keep this page open and switch to a new tab to Salesforce.

In Salesforce, create an Outbound Message. The object you’ll want to create it on is Opportunity, because that where closed won sales happen! But you can see you can create an Outbound Message on almost any object.

Put the URL from the Zapier screen above into the Endpoint URL field in Salesforce.

The “Opportunity fields to send” section is important because that is the information you are sending back to Zapier, which will ultimately become part of the message you send to HipChat.

Side note: You’ll see that Account Name and Owner Name aren’t available options to pull over. This is why I’m bringing the IDs. We’ll convert them over to text in a later step.

Once you do this press Save on the Salesforce screen and save on Zapier. At this point, Zapier will want to pull in examples using the webhook you just added.

You’ll get something like this:

Allll the Salesforce IDs. 🔢

Step 2: Go back to Salesforce and set up a Workflow Rule

The Outbound Message is what sends all the relevant information to Zapier but something needs to kick off the Outbound Message. An Outbound Message on its own does nothing. Enter: Workflow Rule!

Create a new Workflow Rule that has the criteria you want to trigger to the Outbound Message. My criteria is fairly simple: Closed Won & over $15K.

Once you save your Workflow Rule, make sure to add an Immediate Workflow Action (choose: New Outbound Message) which is triggering your Outbound Message. Basically, you’re linking the two actions together. Otherwise, nothing will happen!

💡Admin Best Practice Side Note: I named both my Outbound Message and Workflow Rule “Over $15K for Zapier.” I also utilized the description field to explain what these actions do. When you’re stringing together different components within the system naming consistency is helpful because it shows you (and future admins!) that all these parts are related.

Before we delve into Step 3, let’s briefly cover what we did:

  1. Set up an Outbound Message from Salesforce to Zapier, which sends the relevant data from Salesforce to Zapier (which will eventually be passed to HipChat).
  2. Set up a Workflow Rule to push that information out of Salesforce based on specific criteria (since I don’t want to send a HipChat for every single sale!)

Next Steps: Use the IDs from the Outbound Message to get the text you want to include in your HipChat

This really puzzled me initially. In the screenshot above with all the Salesforce IDs you’ll note that that the only thing that is legible is the amount: 5000.00. Everything else is in Salesforce ID form. But when you go to set up your Outbound Message you don’t see an option to select “Account” just “Account ID.” Hmm. 🤔

So at first I just ignored this and plowed straight ahead into the HipChat portion of the Zap. This is what I got:


Okay, fine. I should probably figure out a more legible solution. At this point I hadn’t thought to read Zapier documentation, so I just turned to Twitter instead.

Initially I thought I’d create formula fields that would be hidden on the page layout in Salesforce so that I could pull the information over to Zapier. My heart secretly ached at the idea of creating extra fields for such a silly purpose. But then! A response!

Brilliant! Instead of creating these fields, I would just create steps in Zapier to search for the information I wanted in Salesforce and then bring it back to Zapier in the format that I wanted. I had to create a lot more steps in Zapier, but this way everything was self-contained in Zapier and I wasn’t spinning up random fields in Salesforce.

It does seem a little circular; you just called all this information from Salesforce to Zapier and now you’re sending it back to Salesforce just for the purpose of reformatting it. But since you only have IDs for these objects and nothing more, you need to query Salesforce so you can get all the fields so your HipChat message isn’t gibberish.

Step 3: Find Account

In Zapier, create a new step after your Outbound Message. Select Action, then Salesforce, and then “Find an Account.”

You’re searching by the Account ID you got in Step 1!

Select Account ID and then Notification S Object Account ID. Then follow the rest of the prompts.

Don’t worry about Account Name and other text yet! That will come later.

Step 4: Find User

This is pretty much the same as above, but instead of “Find an Account” you’ll choose “Find a Custom Object.” The User object is not a Custom Object, but that’s what Zapier calls anything that they don’t have in their system.

This is the User ID for the Opportunity Owner and how you’ll get their name.

This is what your steps in Zapier should look like so far:

Step 5: Format Currency

This is 100% optional but if you’re going to do a job you might as well do it well, right? In your Outbound Message Salesforce gives you the amount of the opportunity in this format: 50000.00. No dollar sign, no comma. Not ideal.💰

Luckily, Zapier has a solution for this called “Formatter” that will transform the number for you. Create a new Action and search for Formatter. Choose Numbers and on the next screen you’ll be presented with this:

The Currency Format part still confuses me a bit.

Your input is the amount that came over in the Outbound Message.

You’ll then get an option to test the results of the formatting. If it doesn’t look how you want it, go back to the previous screen and fiddle with the Currency Format options until you get what you want.

Step 6: String it all together to create your HipChat message! 💃

Okay, you’ve told Salesforce to send information to Zapier, you’ve searched Salesforce for the correct information you want to render in your chat and you reformatted the currency because you’re an overachiever. 💅 Let’s finally put it all together and send a HipChat message!

Back to Zapier: Create a new action, search for HipChat, and select “Send Message.”

You’ll need to connect HipChat and Zapier so this is where that Admin Auth Token will come in handy. Grab that and you’re ready to rock and roll.

Next comes the fun part: Setting up the template!

Room: The HipChat room you want to send the message to (when you are first setting this up and testing it, I recommend making a private room or sending the chats to a less populated room.)

From: This is just a free form text field and you can make it whatever you want. I thought Opportunity Bot was cute so that’s what I went with. 🤖 (Too bad I can’t add emojis in Zapier/HipChat because otherwise I totally would)

Message: Here is the what we all came for and the purpose of all those darn searches. You can now craft your message and pull information from each search step.

Basically an elaborate mail merge. 📩

I just wanted account name and user name but because you pulled in the entirety of the Account and User objects, you could pull in whatever you want — user title or maybe account phone? Really, the possibilities are endless.

Notify, Color, and Format: All pretty straight forward — make the choice that is right for you.

Before going live, I recommend sending a couple tests to a test HipChat room to make sure your chat is exactly how you want it.

Once you’re happy, change the HipChat room to real room you want to send the chats to and don’t forget to turn on your Zap!

Step 7: Wait for the sales to roll in

End of quarter sales has the Opportunity Bot working overtime. 😅

The best part of the Outbound Message is that it’s instantaneous! This is because Salesforce is pushing information to Zapier vs. asking Zapier to search your Salesforce instance. So the second a rep closes a deal, you’ll see it in HipChat.

Did you try this? Or have an idea on how it could be better? Leave a comment below or find me on Twitter. I’m always looking to meet other Salesforce enthusiasts. ☁️

In-Line Editing in List Views in Salesforce

I used to shy away from List Views because I thought of them as a less robust version of reports, so why bother with them? Recently I had a discovery that made List Views worth it: in-line editing.

Every week Industry Dive has a process where we confirm that the advertising placements we sold to a client actually ran. Our Ad Operations team confirms the placements ran and then communicates to our Accounting team that the placements can be invoiced.

In order to designate between a placement that we think ran vs. a placement that has definitely ran we have a checkbox on the record named “Reconciled?” Once this box is checked it means we’ve confirmed it has run and Accounting can invoice.

We usually run 80–100 placements a week, so checking that box for every placement would really suck. Enter: in-line editing! 🎊

Now a user can quickly reconcile placements without going into each individual record.

There are some important limitations and things to know about in-line editing and the permission to do so must be turned on by your Admin on your Profile.

If you have a situation where you are exporting a group of records to make a change on all of them that is the same, give in-line editing a try. It’s easier and less error prone than exporting and updating via Excel.

Why I haven’t blogged

Last night I started reading The Dance of the Possible by Scott Berkun. It’s a thin little primer on creativity — what it is and how to get more of it. I’ve always enjoyed Berkun’s no-nonsense, yet slightly humorous tone and this book is no different.

Berkun’s first chapter is called “The Source.” Where do good ideas come from? Aliens? Magic? No, it comes from action.

1. If there’s something you want to do, you must simply go do it.

2. If you want to be better at something, do it more often.

3. If you want to improve faster, ask someone who knows more than you to watch you and give their advice.

I’ve been in a bit of a rut. A rut where it’s hard to put my finger on exactly what is wrong but it’s nagging me nonetheless. I can’t articulate what I want or need, but the same phrase keeps running through my ahead, “Action defeats despair.”

His three point list was a perfect reminder for me.

Feeling sorry for myself is not going to make me feel better. Doing something, even if that something doesn’t turn out to be the thing that makes me feel better, is certainly better than doing nothing. And if I try something and it doesn’t work at least I’ll have an answer. The more things I try, the more things I’ll be able to cross off my list. Eventually I’ll narrow down the cause of this rut.

This rut will not go away by thinking about it. I need to go out and “simply do it.”

But as I just wrote above, I’m not really sure what I need to do! Cut my hair? Get a hobby? Learn a new software? Read self-help books? Your guess is as good as mine. Something I’ve always wanted to do, but never stuck with is blogging.

I follow so many interesting people online and the common thread across all of them is that they take time to write and share their ideas. And I get so much out of all of their thoughts. Writing is a great way to meet people and I’ve learned so much from their thoughts and experiences. I’d like to share my ideas and maybe meet more people or connect with people with similar interests.

So, what does the title of this post have to do with anything? After reading Berkun’s list I started generating a list in my own head. They “Why I haven’t blogged” list.

  1. No one will read what I write, and that will make me feel sad
  2. Too many people will read what I write, and criticize me and my ideas
  3. I have nothing to write about
  4. I have too many things to write about
  5. My ideas aren’t interesting
  6. I don’t know what platform I should use to publish my posts

As soon as I listed these out in my head, I laughed. Many of my list items conflict each other, which of course has led to paralysis and no action.

But today and with this post, I am putting an end to inaction.

Capitalism vs. Good Design

A couple days ago Scott Berkun tweeted that there is an “inherent tension” between good design and capitalism. As someone who has opinions on both topics (and a pledge to start writing more) I thought I’d offer my initial reaction to his tweets.

Put another way: why would anyone choose to be a designer if they thought the world we live in was good enough as is? #ux #design –@berkun

Why would anyone choose to do anything if they were happy with the status quo? What makes humans unique and incredible is our ability to think about our thinking and challenge those assumptions. Much of the actions we take in life are a direct rebellion against the status quo. We want to learn more, get in better shape, have deeper relationships, make more money, etc. All of these require a change. Design is no different.

There is an inherent tension between the aspiration of good design and capitalism. You profit more from not completely solving problems. — @berkun

There is a remarkable amount of hubris displayed by someone who would say, “Yes, I have designed the the answer to a problem but I am going to withhold it in order to make more money from you with a later release.”

Firstly, I have never met someone who has completely solved any problem. As Thomas Sowell said, “There are no solutions, only trade offs.” Secondly, I have never met a high achiever who purposely sandbagged their work in this way. People want to release what they believe is their best work into the world. After receiving user feedback, they will iterate and create and new and better version. As user interviews and research show there are always more problems to solve.

And the beauty of capitalism is that it rewards those who solve problems through value creation. I don’t see the tension at all.

Originally published at on August 24, 2017.

Writing it down

I am always delighted when I come across something I wrote in the past. Well, maybe not always delighted but definitely interested. I love reading something and thinking, “Ha! That’s not even a big deal anymore” and generally gaining insight from my past thoughts.

I have started (and abandoned) so many blogs. If I had just written a simple paragraph about my day instead of beating myself up for not writing, I would most definitely have a lot more things written down than I do today. But alas, I let the perfect be the enemy of the good. I have deleted lots of content off the internet (or thrown out half filled journals–why?!) simply because I was frustrated with myself.

This year I made a major step forward in my practice of writing. I committed to a “Monthly Summaries” in Dropbox Paper. On the first of each month I have a reminder set up to ping me to write a review of my previous month. I go through my work & personal emails, calendar, Camera Roll on my iPhone, tweets, and Facebook and put together a ~1000 word entry on what happened. Now that we are 8 months into the year I am REALLY appreciating that I committed to this seemingly small act.

Last night I read a blog post by Alice Goldfuss about imposter syndrome. I realized I have imposter syndrome about writing. “I’m not that interesting.” “I’m not a good writer.” “I have nothing to share” are all thoughts that have crossed my mind (and lips). Her post is what nudged me to finally say to myself, “Enough, just get it out there.”

I hope my writing will do the same for someone else. And if not? I’ve improved my writing skills, my coding skills, and documented my life. And that seems like a decent end in and of itself.

Originally published at on August 22, 2017.

How to Effectively Work for a Manager You Never See

Whether you work from home or your boss works remotely, the workplace today is much different from the centralized offices of the past. For many organizations, remote employees spread across the country are now the norm. Here’s how you can effectively work with your boss, even if you aren’t in the same place.

This post originally appeared on Levo League.

Between video conferencing, email, and instant messaging, physical proximity to the office is no longer a requirement. Companies are hiring based on talent and fit, not if someone can be in their chair 24/7. This change has led to entire teams being spread across time zones, states, and even countries. While it can be tricky to report to a remote manager, I’m here to tell you it’s possible.

I work for a non-profit in Washington, D.C., but my manager works from her home in southern California. I’ve been working with her remotely for over a year, and in that time have expanded the responsibilities of my role and received a salary increase. Here are the tips that have helped me succeed:

Establish Regular Communication

If you don’t have a scheduled weekly call or Skype session with your boss, set one up right away. My boss and I talk every Monday morning for about 45 minutes about my priorities for the week. I discuss what I finished from last week, what I have planned for the upcoming week, and also ask her if she has any projects or tasks that she would like me to work on.

While I personally think phone calls are the best if you can’t meet face to face, even a weekly update email could get the job done. The adage “out of sight, out of mind” rings true here: You don’t want to forget about each other just because you don’t see each other in the office every day. Another communication tip–send an email to your boss at the end of each week listing what you’ve completed. This is especially helpful if your relationship with your manager is new and you want to show them that you’re effective. Be sure to ask your manager their preferred methods of communication — you certainly don’t want to annoy them!

Build Trust to Avoid Micromanagement

My relationship with my manager succeeds because she trusts me, having already demonstrated my effectiveness. My boss isn’t a micromanager at all. This isn’t to say that she doesn’t communicate with me during the week,but she doesn’t constantly send emails asking for status updates.

Once a project is assigned she gives me the space to complete it. Building trust can take time, which is why communication is so important. In the beginning you’ll probably want to err on the side of more frequent communication and taper off as you see trust being built. Also, just because you manager isn’t in-office, or you work from home, with you doesn’t mean that you can’t come to them with problems or questions. Picking up the phone every five minutes is probably over the top, but go to your manager when you have issues with project prioritization or need help with a task. Showing your manager that you depend on them and view them as more than a person to take directions from will help build mutual trust. And being proactive when you have a problem or are stuck will show your manager that you tackle problems as they come — and aren’t too proud to ask for help.

Be Respectful of Each Others’ Roles

It’s easy to feel like you don’t have a boss if your boss isn’t in your office every day, but this doesn’t give you free reign to shirk responsibilities. I still ask my manager for permission on days I work from home, or if I plan to go meet a donor for lunch. It’s important to share your schedule and have transparency. Respecting your manager’s authority, even when they aren’t physically there, will help them respect you as an employee and ultimately lead to increased responsibilities and freedom.

Originally published at on September 30, 2014.