Planning meetings, get-togethers, and interviews with AgreeADate

One of the reasons why I love thinking of ways to help people rock even more is that I often end up learning a lot in the process.

For example, last week, I needed to coordinate schedules with Katie Bartlett, Jeff Widman’s assistant, for a chat with Jeff about networking. I thought about how much e-mail was sent back-and-forth figuring out times and timezones, and I multiplied that by the number of appointments Katie probably needed to arrange. That sounded like a lot of work. If I could find a tool to make that easier for our appointment, and she used that tool to organize lots of other appointments, then that would be great!

I checked out a couple of tools such as TimeToMeet, ScheduleOnce, and AgreeADate. Of the tools I tried, I liked AgreeADate the most because it made it easy to create different kinds of schedules and it supported timezones. I sent Katie a few potential timeslots for my chat with Jeff. After she replied, I confirmed the time that was mutually convenient. That wasn’t hard at all.

Then I explored the other features. I found out that I could create a schedule where people could pick a slot. AgreeADate allowed me to specify how many people each timeslot was limited to, and how many slots people could choose. This opened up all sorts of possibilities, and has become my favorite feature!

Things that I’d formerly had been worried about scheduling became so much easier to schedule because I could create all the slots in parallel and then let people choose the slots that hadn’t been taken yet. For example, I’d been meaning to try outsourcing some technical and personal tasks, but scheduling interview times sounded like a hassle. With this system, I just had to set all the slots up and invite people to choose the timeslot most convenient for them. Yay!

AgreeADate isn’t perfect, but it makes scheduling things so much easier for me, and it lowers the barrier enough for me to go and make things happen. In the past week that I’ve been trying it out, I’ve:

  • scheduled a capoeira trial
  • scheduled a conference call
  • set up interviews for a system administrator and a virtual assistant, and
  • set up lunch with a poll on where to eat.

You know, stuff that would’ve taken way too much e-mail if I had to do it by hand. =)

I’d like to see it integrated with my Google Calendar, and one of the AgreeADate folks told me that that’s the next thing on their roadmap. I found myself wondering which slots I’d tentatively offered for other events, and being able to see all the tentative slots overlaid on my calendar would be fantastic.

In the meantime, I read the confirmation e-mails in Emacs Gnus, use Remember and Org to create an appointment hyperlinked to that mail, and then use my own code, the twit.el library, and the Twittercal service to create an appointment on my Google Calendar (on, which is then shared with my Google Calendar on thanks to the joys of Google Apps. It’s quite Rube Goldberg-esque (as many of my bubblegum-and-string tricks are), but so far, it works. Maybe this’ll be something I’ll outsource (except perhaps without the Gnus + Remember + Org part) once I’ve gotten that virtual assistance thing sorted out. =)

For the geeks, some Emacs Lisp to mash together with Org, TwitterCal, Google Calendar, and twit.el (some wizardry required):

(defun sacha/org-as-gcal-quick-add ()
  "Convert the current SCHEDULED: timestamp and header into a GCal quick add item."
    (org-back-to-heading t)
    (setq end (save-excursion (outline-next-heading) (point)))
    (when (re-search-forward org-scheduled-time-regexp
			     end t)
      (let (ts default-time stamp plain s0 srp s1 s2)
	(setq ts (match-string 1)
	      default-time (apply 'encode-time (org-parse-time-string ts)))
	(when (or (setq stamp (string-match org-stamp-time-of-day-regexp ts))
		  (setq plain (string-match org-plain-time-of-day-regexp ts)))
	  (setq s0 (match-string 0 ts)
		srp (and stamp (match-end 3))
		s1 (match-string (if plain 1 2) ts)
		s2 (match-string (if plain 8 (if srp 4 6)) ts)))
	  (concat (org-no-properties (org-get-heading t)) " on "
		  (format-time-string "%x" default-time) " from "
		  (org-get-time-of-day s1 'string t) " to "
		  (org-get-time-of-day s2 'string t)

	  (concat (org-no-properties (org-get-heading t)) " on "
		  (format-time-string "%x" default-time) " from "
		  (org-get-time-of-day s1 'string t)
	  (concat (org-no-properties (org-get-heading t)) " on "
		  (format-time-string "%x" default-time)

(defun sacha/org-to-twittercal (string)
  "Post STRING to TwitterCal. See for details."
  (interactive (list (read-string "Event: " (sacha/org-as-gcal-quick-add))))
  (twit-post-function twit-update-url (concat "d gcal " string)))

I’ll keep you posted on my experiments! =)