<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>gokubi.com</title>
	<atom:link href="http://gokubi.com/feed" rel="self" type="application/rss+xml" />
	<link>http://gokubi.com</link>
	<description></description>
	<lastBuildDate>Fri, 16 Sep 2011 14:54:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Advocacy in the Cloud slides and recording</title>
		<link>http://gokubi.com/archives/advocacy-in-the-cloud</link>
		<comments>http://gokubi.com/archives/advocacy-in-the-cloud#comments</comments>
		<pubDate>Fri, 16 Sep 2011 14:54:38 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Change]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1347</guid>
		<description><![CDATA[I recently had the pleasure of facilitating a Dreamforce session where two amazing people talked about how their organizations have gone all-in with engagement. The DC Project and Idaho Conservation League are each betting their futures on engagement, and in very different ways. Sara Arkle talked about how Idaho Conservation League is turning the organizational [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had the pleasure of facilitating a Dreamforce session where two amazing people talked about how their organizations have gone all-in with engagement. <a href="http://weatherizedc.org">The DC Project</a> and <a href="http://idahoconservation.org">Idaho Conservation League</a> are each betting their futures on engagement, and in very different ways. Sara Arkle talked about how Idaho Conservation League is turning the organizational ship to find a new generation of supporters. Matthew Dunn told the compelling story of how the DC Project was birthed with technology and engagement at it’s heart. Very different stories, well told and I think helpful for folks looking to engage supporters more deeply than they are today. Below is the recorded presentation, as well as the slide deck we presented.</p>
<p><iframe width="600" height="450" src="http://www.youtube.com/embed/N-1m0BVtciY?fs=1&#038;wmode=transparent" frameborder="0" allowfullscreen></iframe></p>
<div style="width:425px" id="__ss_9284445"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/salesforcefoundation/advocacy-in-the-cloud" title="Advocacy in the Cloud">Advocacy in the Cloud</a></strong><object id="__sse9284445" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=df11017andersen-110916092009-phpapp02&#038;stripped_title=advocacy-in-the-cloud&#038;userName=salesforcefoundation" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse9284445" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=df11017andersen-110916092009-phpapp02&#038;stripped_title=advocacy-in-the-cloud&#038;userName=salesforcefoundation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/advocacy-in-the-cloud/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chrome Extension: Salesforce.com Id Clipper</title>
		<link>http://gokubi.com/archives/chrome-extension-salesforce-com-id-clipper</link>
		<comments>http://gokubi.com/archives/chrome-extension-salesforce-com-id-clipper#comments</comments>
		<pubDate>Mon, 06 Jun 2011 13:51:25 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1320</guid>
		<description><![CDATA[I had a great idea for a Chrome Extension that was pretty complicated, so I decided to come up with a simpler project to learn the ropes. This weekend I built the Salesforce.com Id Clipper, a Chrome Extension that helps you get Salesforce.com Ids from records more easily than copying. It&#8217;s a small problem I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>I had a great idea for a Chrome Extension that was pretty complicated, so I decided to come up with a simpler project to learn the ropes. This weekend I built <a href="https://chrome.google.com/webstore/detail/hfiffenhnefppjhloglpebefjlbhoeai">the Salesforce.com Id Clipper</a>, a Chrome Extension that helps you get Salesforce.com Ids from records more easily than copying. It&#8217;s a small problem I&#8217;m attempting to solve, but I think this extension does it pretty well. Here&#8217;s a rundown:</p>
<p><iframe width="600" height="363" src="http://www.youtube.com/embed/gPd_duxHXnA?fs=1&#038;wmode=transparent" frameborder="0" allowfullscreen></iframe></p>
<p><a href="https://chrome.google.com/webstore/detail/hfiffenhnefppjhloglpebefjlbhoeai">Go get it</a> in the Chrome Web Store and please rate it if you try it out! <a href="https://github.com/gokubi/Salesforce-Id-Clipper-Chrome-Extension">The source is also out on Github</a> free to use.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/chrome-extension-salesforce-com-id-clipper/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nonprofit Starter Pack and Money</title>
		<link>http://gokubi.com/archives/nonprofit-starter-pack-and-money</link>
		<comments>http://gokubi.com/archives/nonprofit-starter-pack-and-money#comments</comments>
		<pubDate>Mon, 09 May 2011 16:43:47 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1301</guid>
		<description><![CDATA[At a recent gathering of nonprofit-focused Salesforce developers, we got into a deep discussion about how to best track money in Salesforce. Everyone agreed that the Opportunity object was key, but there were differing opinions about what else needed to be done and how. I realized that this group of people, who had years and [...]]]></description>
			<content:encoded><![CDATA[<p>At a recent gathering of nonprofit-focused Salesforce developers, we got into a deep discussion about how to best track money in Salesforce. Everyone agreed that the Opportunity object was key, but there were differing opinions about what else needed to be done and how. I realized that this group of people, who had years and years of consulting experience with nonprofits, did not have a shared understanding of the best practices of how nonprofits should track money. I include myself in this group&#8211;I’ve had nonprofit accounting explained to me countless times, and it’s been a little different each time.</p>
<p>This article is meant to lay out what I’ve learned about this subject from all the great finance people I’ve worked with over my career. But more importantly it will examine how it all relates to Salesforce.com and some changes <a href="http://twitter.com/#!/kevinbromer">Kevin Bromer</a> is making to the <a href="http://www.salesforcefoundation.org/products/nonprofit_starter_pack">Nonprofit Starter Pack</a>.</p>
<p>First I’ll talk a bit about how the Nonprofit Starter Pack works today. Next I’ll get into the accounting of it all, with the full disclaimer that I am not an accountant. And then I’ll get into the new way we’re going to do things, and talk about why that’s better, all with the goal of us better understanding the business processes we support.</p>
<p>Salesforce.com isn’t an accounting system, but thousands of organizations use it to track money. Many organizations directly integrate with their accounting systems. Modeling money well in Salesforce.com makes that kind of integration easier. And even if you don’t integrate, the changes we’re making provide much better support for key nonprofit work like pledged gifts, and gifts with multiple payments. </p>
<p> I got a lot of help in writing this article from <a href="http://www.linkedin.com/pub/debbi-lewang/27/382/397">Debbi Lewang</a>, <a href="http://www.linkedin.com/in/shalineethakur">Shalinee Thakur</a>, <a href="http://nickhbailey.com/">Nick Bailey</a>, <a href="http://samdorman.com/">Sam Dorman</a> and of course Kevin Bromer&#8211;any insights should be attributed to them, any errors in logic or accounting are most definitely mine. </p>
<h2>How the nonprofit starter pack works today</h2>
<p>The Nonprofit Starter Pack is used by thousands of organizations on Salesforce.com to manage their organizations and their missions. These organizations are incredibly diverse, engaging in everything from class-room education to lobbying congress to providing health care to the homeless. But no matter what they do, they must track their organizational revenue stream, and many do in the form of gifts, grants, ticket sales, etc. </p>
<p><img src="http://gokubi.com/wp-content/uploads/2011/05/opp_payment.png" alt="" title="opp_payment" width="109" height="170" class="alignleft size-full wp-image-1305" />Salesforce.com has a database object called Opportunity that represents revenue and potential future revenue. It was created by the company to handle sales deals when Salesforce.com was limited to Sales and Marketing. Now that the platform is so much more flexible, the Opportunity object serves well as any kind of revenue&#8211;gifts, grants, memberships, ticket sales, etc.</p>
<p>The Nonprofit Starter Pack uses Opportunity to track revenue, and it works pretty well. We also have a Recurring Donations package that can be used to track gifts that are paid with more than one payment. It has a simple object and wizard for creating a schedule of Opportunities spaced out at intervals you select. It is a simple way to create multiple Opportunities that are related.</p>
<p>There are some limitations with the way the Nonprofit Starter Pack supports money today. The main problems have to do with a lack of support for cash in addition to revenue. In the next section I’ll talk about the accounting realities that we are planning to support.</p>
<h2>Revenue and Cash: Nonprofit accounting</h2>
<p>Revenue tracking and forecasting is critical to all nonprofits. Annual revenue must be reported to the IRS, and any business that doesn’t know its revenue picture can’t effectively plan for the future. This is easily done by reporting on Opportunities, and most nonprofits using Salesforce.com have already figured that out.</p>
<p>Nonprofit accounting (and accounting in general) is more complex than simply recording revenue, though. We need to support cash tracking in addition to revenue. This is because nonprofits can report revenue without receiving any money. When that happens from a donor or a grant maker, we often call it a pledge. The donor commits to giving to the organization, and may identify a payment schedule at that time. Let’s look at an example case to get into the specifics.</p>
<p>The nonprofit Friends of Tiny Creek (FOTC) wins a $1 million grant from a foundation. At the time of the award, they are promised a check for $250,000 and are told to expect 3 additional payments of $250,000 over the next 3 years. How should this be recorded on the financial statements?</p>
<p>FOTC records $1 million in revenue from the foundation. This is revenue in the fiscal year in which the grant was received. Because the cash isn’t received at the time the revenue is recorded, it can’t be spent yet. While the funder can put other restrictions on the gift, we will assume that this one hasn’t, and the money will be available when the cash payments are received. </p>
<p>So this $1 million commitment is recorded as a credit (increase) to revenue on the income statement and a debit to assets on the balance sheet.</p>
<p>One week later the $250,000 check comes in as promised. $250,000 is now cash that can be spent. On the balance sheet, cash is debited by $250,000 and assets receivable is credited by the same amount. The effect of this seemingly backwards transaction (there is a reason I’m not an accountant) is that $250,000 of the grant funds are now available for use and $750,000 is still to be received. [<a href="#1">1</a>]</p>
<p>The initial pledge and the resulting cash are related, but come in at very different times. And in this case you can see how the date the revenue is recorded is very different from when FOTC can actually spend the money to support it’s mission efforts. If FOTC isn’t paying attention to it’s cash picture, they’re going to have a hard time planning and delivering.</p>
<p>As the yearly payments come in, they are recorded and revenue is released accordingly. When all payments are made, the receivable goes to zero and the funds are available.</p>
<p>In this case, though, the foundation in question rescinded the last payment of $250,000. In this case, FOTC must record that amount as a write off against the receivable. That balances the sheet, and the change in revenue can be reported in their annual numbers.</p>
<h3>The case of monthly giving</h3>
<p>On the face of it monthly giving looks a lot like a pledge of multiple payments similar to our grant example above. A monthly giver commits to $20/month and then makes payments on a schedule. However, the monthly giver’s commitment isn’t an official pledge unless they tell you the end point of their giving. In many cases the monthly gift is started with no set end date. If you don’t know the end date, you don’t know the total revenue, so you can’t record it as pledged revenue on your income statement.</p>
<p>Because of this, each monthly gift should be considered a separate revenue entry, with it’s own matching cash entry when it is paid.</p>
<h2>Better modeling cash in the Nonprofit Starter Pack</h2>
<p>As stated earlier, the Opportunity object is great for tracking revenue. But what about cash related to that revenue? There isn’t a good way to model cash in the Nonprofit Starter Pack, but lots of Salesforce.com users have already solved this for themselves&#8211;that’s the beauty of a flexible platform. We’ve looked at those solutions can come up with something that we think works pretty well. When we release this functionality, you&#8217;ll be able to turn it on, or continue to use the Nonprofit Starter Pack as you are today.</p>
<p>The Nonprofit Starter Pack will get a new child object to Opportunity called Payments. Payments will be where cash is recorded. The Payment object will represent all the cash received by an organization. It will be helpful in a number of ways:</p>
<ul>
<li>Payments will allow you to record received cash payments against promised revenue</li>
<li>Payments will allow you to record a payment schedule and make sure you don’t forget to collect them when they come due</li>
<li>Payments will allow you to write off rescinded payments</li>
<li>Tracking cash in Salesforce.com allows for much better analytics than most accounting systems</li>
</ul>
<p>The Payment object will have rollup summary fields to the Opportunity that show you the number of payments per Opportunity, the amount of payments that have been made, and the remaining balance. Having this information on Opportunity makes it very easy to see which Opportunities aren’t fully paid yet.</p>
<p>Ok, back to our scenario for some illumination.</p>
<p>FOTC is a very stable organization. If we look at a dashboard of their revenue (Opportunities), we see that it’s uniform. They get about the same amount of revenue each month.</p>
<p><img src="http://gokubi.com/wp-content/uploads/2011/05/revenue_history.png" alt="" title="revenue_history" width="409" height="308" class="aligncenter size-full wp-image-1307" /></p>
<p>Most of those Opportunities were one-time payments&#8211;the cash came in the same time the revenue did. But about a third of them were paid in multiple payments. If we take a look at a chart of the cash, you’ll see that it’s much more irregular than the revenue chart. Note that the scale is different in these charts.</p>
<p><img src="http://gokubi.com/wp-content/uploads/2011/05/cash_history.png" alt="" title="cash_history" width="410" height="308" class="aligncenter size-full wp-image-1308" /></p>
<p>The same is true with forecasting&#8211;revenue in the future is expected to be pretty stable.</p>
<p><img src="http://gokubi.com/wp-content/uploads/2011/05/revenue_forecast.png" alt="" title="revenue_forecast" width="406" height="308" class="aligncenter size-full wp-image-1309" /></p>
<p>If we look at a cash forecast, it’s very lumpy, with peaks and valleys.</p>
<p><img src="http://gokubi.com/wp-content/uploads/2011/05/cash_forecast.png" alt="" title="cash_forecast" width="407" height="309" class="aligncenter size-full wp-image-1310" /></p>
<p>FOTC needs to see its revenue picture and also it’s cash picture, and it’s not clear from one what the other will look like.</p>
<h3>Revenue where the cash is received immediately</h3>
<p>At most nonprofits, most gifts aren’t pledged, they are just given. A typical scenario is a $100 check coming in the mail. Recording that check requires recording the revenue and the cash at the same time. Data entry is a time consuming task as it is. Having to do double entry&#8211;revenue and cash&#8211;for all gifts is an unacceptable burden, so we built automatic cash recording right in.</p>
<p>In the case of a gift where revenue and cash are simultaneous, the new payments functionality creates one payment for every Opportunity. It keeps this payment in sync with the Opportunity, unless you choose to set up a payment schedule. This solves the case of multi-payment gifts without causing extra work for all those gifts that don’t have multiple payments.</p>
<p>By creating automatic cash payments for each opp, the cash picture isn’t limited just to pledges with payment schedules, but includes all cash for all revenue. This allows for better reporting, like the charts shown above.</p>
<h3>The case of monthly giving</h3>
<p><img src="http://gokubi.com/wp-content/uploads/2011/05/recurr_opp_payment.png" alt="" title="recurr_opp_payment" width="113" height="272" class="alignleft size-full wp-image-1312" />For monthly giving, each gift should be considered it’s own revenue event because they aren’t connected to a known pledged amount. Therefore each gift should be an Opportunity, rather than Payments under one Opportunity. Each gift will, of course, have a payment, because all revenue does when you&#8217;re tracking revenue and cash.</p>
<p>The Recurring Donations functionality in the Nonprofit Starter Pack will handle this case better with the next release. You will be able to create a Recurring Donation Profile, detailing the recurring gift. The wizard will then create Opportunities according to your schedule. At present moment we&#8217;re thinking that the Recurring Donation functionality doesn&#8217;t need to know about payments at all&#8211;it will just interact with Opportunities. This may change, but it&#8217;s what we&#8217;re thinking now.</p>
<p>Currently Recurring Donations has the word &#8220;Pledges&#8221; in the object name. If you&#8217;ve read this far, you understand now that this is incorrect. Kevin is planning major upgrades to Recurring donations, and we will likely be renaming things to make more sense. He&#8217;s also planning on supporting the automatic creation of Opportunities for open-ended giving, and keeping the Recurring Donation Profile in sync with the Opportunities. We’ll likely give you the ability to keep a rolling year of potential gifts in the system. If you don’t want all those open gifts out there, we’ll likely give you a way to keep just one open gift for each recurring donation.</p>
<h2>Conclusion</h2>
<p>While Salesforce.com isn’t an accounting system, better modeling of nonprofit accounting practices is great functionality and we expect it to be popular. The coming upgrades to the Nonprofit Starter Pack will allow for cash reporting, write-offs of revenue, and facilitate collections of promised payments. Upcoming improvements to Recurring Donations will make it easier to handle recurring donations that are open ended.</p>
<p>If you have questions or comments on our implementation, or have feature requests, please comment on this post.</p>
<p>&#8212;&#8212;&#8212;&#8212;-</p>
<p><a name="1">1</a>. Technically, multi-year grants are received as restricted assets. Each year the revenue is released from restricted net assets to operating net assets as it is needed (credit on the restricted side, debit on the unrestricted side). Another interesting point – multi-year pledges are worth less than cash received today.You have to discount to present value and adjust based on the outstanding amount of the pledge each year.  Again, this is something you’ll likely want to handle in your accounting system.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/nonprofit-starter-pack-and-money/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Join our team</title>
		<link>http://gokubi.com/archives/join-our-team</link>
		<comments>http://gokubi.com/archives/join-our-team#comments</comments>
		<pubDate>Thu, 14 Apr 2011 15:11:06 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Change]]></category>
		<category><![CDATA[CRM]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1298</guid>
		<description><![CDATA[The Salesforce.com Foundation technology team received a compliment the other day when a co-worker said, &#8220;Wow, your technology team is atypical.&#8221; I&#8217;ve been on great teams before in my career, and our team right now is up there as one of the best. I&#8217;m looking for a Force.com Developer to join us in our work [...]]]></description>
			<content:encoded><![CDATA[<p>The Salesforce.com Foundation technology team received a compliment the other day when a co-worker said, &#8220;Wow, your technology team is atypical.&#8221; I&#8217;ve been on great teams before in my career, and our team right now is up there as one of the best. <a href="http://www.salesforce.com/company/careers/locations/a0800000000AbXKAA0/a017000000PLVSI.jsp">I&#8217;m looking for a Force.com Developer</a> to join us in our work driving the vision of the Salesforce.com Foundation and helping thousands of nonprofits do the same for their visions. We are small, <a href="http://www.ted.com/talks/dan_pink_on_motivation.html">motivated</a>, we do great work, and we value each other.</p>
<p>If you want to make a difference working with the best tools and the best customers, on a great team, this may be the job for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/join-our-team/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JP Rangaswami on social objects</title>
		<link>http://gokubi.com/archives/jp-rangaswami-on-social-objects</link>
		<comments>http://gokubi.com/archives/jp-rangaswami-on-social-objects#comments</comments>
		<pubDate>Sun, 27 Feb 2011 16:57:20 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Change]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1294</guid>
		<description><![CDATA[I&#8217;ve been really enjoying JP Ranagaswami&#8217;s latest series on social objects in the enterprise. His series so far is here, here, and here. I&#8217;m finding his tale of the merging of internal systems of record with external systems of engagement, and the socialization and consumerization of these objects to be really compelling. The corporation is [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been really enjoying JP Ranagaswami&#8217;s latest series on social objects in the enterprise. His series so far is <a href="http://confusedofcalcutta.com/2011/02/23/social-objects-in-the-enterprise-some-early-thoughts/">here</a>, <a href="http://confusedofcalcutta.com/2011/02/24/thinking-more-about-social-objects-in-the-enterprise/">here</a>, and <a href="http://confusedofcalcutta.com/2011/02/27/social-objects-in-the-enterprise-part-3/">here</a>.</p>
<p>I&#8217;m finding his tale of the merging of internal systems of record with external systems of engagement, and the socialization and consumerization of these objects to be really compelling. The corporation is changing, and his take resonates with me. It&#8217;s worth a read.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/jp-rangaswami-on-social-objects/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Divine Right of Capital</title>
		<link>http://gokubi.com/archives/the-divine-right-of-capital</link>
		<comments>http://gokubi.com/archives/the-divine-right-of-capital#comments</comments>
		<pubDate>Fri, 18 Feb 2011 16:14:52 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Change]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1290</guid>
		<description><![CDATA[A number of years ago I read The Divine Right of Capital by Marjorie Kelly and it blew my mind. It&#8217;s a book that has changed the way I look at the world of business, and reinforced the concept that in systems there are rarely unintended consequences&#8211;the rules are there to bring about outcomes desired [...]]]></description>
			<content:encoded><![CDATA[<p>A number of years ago I read <a href="http://www.bkconnection.com/ProdDetails.asp?ID=1576752372">The Divine Right of Capital</a> by Marjorie Kelly and it blew my mind. It&#8217;s a book that has changed the way I look at the world of business, and reinforced the concept that in systems there are rarely unintended consequences&#8211;the rules are there to bring about outcomes desired by the people making the rules. I find I recommend this book almost as often as <a href="http://books.google.com/books?id=7MABzbrknvwC&#038;dq=master&#038;source=gbs_navlinks_s">Master and Margarita</a> and <a href="http://books.google.com/books?id=zUYOEp5uXYYC&#038;dq=crying+of+lot&#038;source=gbs_navlinks_s">Crying of Lot 49</a> but for very different reasons. If you read The Divine Right of Capital, you won&#8217;t see the economy and our financial system the same ever again.</p>
<p>Gideon Rosenblatt is currently <a href="http://www.alchemyofchange.net/divine_right_of_capital/">breaking it down chapter-by-chapter</a>. I recommend reading his digests and then getting your hands on this fascinating book.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/the-divine-right-of-capital/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coherence by Richard H. Bailey</title>
		<link>http://gokubi.com/archives/coherence-by-richard-h-bailey</link>
		<comments>http://gokubi.com/archives/coherence-by-richard-h-bailey#comments</comments>
		<pubDate>Fri, 12 Nov 2010 22:53:09 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Change]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1285</guid>
		<description><![CDATA[I just read Rick Bailey&#8217;s book on nonprofit marketing, Coherence. Rick&#8217;s son Nick is a friend of mine and another Salesforce.com coder-for-good We&#8217;ve had a number of conversations about nonprofits and leadership, and when we met up at Web Of Change this year, Nick passed on his dad&#8217;s book. Coherence is Rick&#8217;s name for telling [...]]]></description>
			<content:encoded><![CDATA[<p>I just read Rick Bailey&#8217;s book on nonprofit marketing, <a href="http://www.rhb.com/">Coherence</a>. Rick&#8217;s son Nick is a friend of mine and another Salesforce.com coder-for-good We&#8217;ve had a number of conversations about nonprofits and leadership, and when we met up at <a href="http://webofchange.com">Web Of Change</a> this year, Nick passed on his dad&#8217;s book.</p>
<p>Coherence is Rick&#8217;s name for telling the truth. For aligning &#8220;what we deliver with what we say we deliver.&#8221; It&#8217;s hard to argue with telling the truth, but it&#8217;s amazing how many people and organizations spend energy hiding their true selves. Coherence is about looking at who you are, and then projecting that to the world so that people who see a match can find you. It&#8217;s about creating an experience that is authentic and unique to you and your strengths and weaknesses.</p>
<p>This resonates deeply for me. The best leadership experiences I have ever had were when I was most honest about the reality of the situation. Where I stopped trying to control things and land them in a specific place, but was open to them going where they would go. I yearn for control, and it takes effort to release that yearning.</p>
<p>Organizations will better serve their constituents if they are honest about what they&#8217;ve got. So many groups try to be something they are not, only because they think that&#8217;s the way it has to be. Rick tells a great story about <a href="http://www.goshen.edu/">Goshen College</a> and how he helped them change how they told their own story. Goshen is a Mennonite college with a tradition of service&#8211;they turn out amazing people who really take service seriously. I have been lucky enough to know two Goshen College graduates and they are both brilliant, dedicated change-makers.</p>
<p>Rick&#8217;s story of Goshen really struck me because the way he recommended they talk about themselves was directly in line with my experience. He called out Goshen&#8217;s quirky, joyful dedication to service&#8211;exactly how I would describe my Goshen alum friends. And that&#8217;s the point&#8211;people know what they see, and if you&#8217;re telling an untrue story it just doesn&#8217;t work. If Goshen tried to tell a story that they were like a midwestern Yale University, I&#8217;d see right through it. My friends are as smart as the most brilliant Yale students, but they aren&#8217;t the kind of people Yale attracts. It all either hangs together, or it doesn&#8217;t. Coherence is critical to it all hanging together.</p>
<p>Social change organizations, and for that matter individuals, could stand to be more authentic with themselves and what they tell others. Amazing organizations are doing this and delivering experiences to their supporters that are really powerful. Rick lays out how he consults with groups to get there&#8211;be honest in looking at who you are, look at how you are currently talking about yourself, and find out what people really think about you. By doing this you can best connect with your authentic value proposition, and share that unique story with the world. Once you do that, the people with whom that story resonates will be drawn to you, and it will be a good fit.</p>
<p>Rick works a lot with colleges, and so his deepest case studies are in that arena. But the message is much broader and great for any social change organization to hear. I recommend the book and the approach. We could all stand to be a little more coherent!</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/coherence-by-richard-h-bailey/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Segmenting Campaigns</title>
		<link>http://gokubi.com/archives/segmenting-campaigns</link>
		<comments>http://gokubi.com/archives/segmenting-campaigns#comments</comments>
		<pubDate>Fri, 15 Oct 2010 13:32:36 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1270</guid>
		<description><![CDATA[In the run up to the amazing Web of Change conference this year, I was asked to write a think-piece. I ended up writing about being scientific in the design, implementation, and analysis of our work. I called it We Must Be Scientists for Change, and it seemed to resonate with a number of the [...]]]></description>
			<content:encoded><![CDATA[<p>In the run up to the amazing Web of Change conference this year, I was asked to write a think-piece. I ended up writing about being scientific in the design, implementation, and analysis of our work. I called it <a href="http://webofchange.com/We-Must-Be-Scientists-for-Change">We Must Be Scientists for Change</a>, and it seemed to resonate with a number of the attendees.</p>
<p>In that article I talked about doing some simple <a href="http://en.wikipedia.org/wiki/A/B_testing">A/B</a> testing. A/B testing is best described as doing some effort while changing one variable in the hopes of learning something about how to affect the outcome of effort. It&#8217;s been perfected by the direct mail industry&#8211;mailings are run as experiments and each mailing adds to the base of knowledge of how to increase response rats.</p>
<p>As I was writing the article I became dismayed that what I was proposing wasn&#8217;t actually very easy to do in Salesforce.com, the system I champion on a daily basis. We use Campaigns for outreach efforts, and while Campaigns are incredibly powerful and easy to work with, randomly breaking them into segments for A/B testing wasn&#8217;t easy.</p>
<p>I say &#8220;wasn&#8217;t&#8221; because I have released a tool for A/B testing that is free to users of Salesforce.com, which is listed on the Appexchange under the name <a href="https://sites.secure.force.com/appexchange/listingDetail?listingId=a0N30000003IQEIEA4">Campaign Segmentation Wizard</a>.</p>
<p>Build your list of people to whom you want to reach out, then use the wizard to randomly break them into segments of the exact size you desire. Those segments are Campaigns of their own, and can be used in any way you see fit&#8211;mass email, phone banking, etc.</p>
<p>Here&#8217;s a short video showing how it works.</p>
<p align="center"><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/vItvvB56pFw?fs=1&#038;ap=%2526fmt%3D22"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/vItvvB56pFw?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p>If you install it and use it, please rate the app on the Appexchange so others will get a sense if it&#8217;s helpful or not.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/segmenting-campaigns/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>We must be scientists for change</title>
		<link>http://gokubi.com/archives/we-must-be-scientists-for-change</link>
		<comments>http://gokubi.com/archives/we-must-be-scientists-for-change#comments</comments>
		<pubDate>Tue, 07 Sep 2010 17:28:53 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Change]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1266</guid>
		<description><![CDATA[I just posted an article for the Web of Change conference, which takes place in a few weeks. I make the call for our sector to become more scientific in our approach&#8211;posing testable questions, using technology to get results, analyzing meticulously and sharing systematically, and jumping quickly to posing the next hypothesis. Please check out [...]]]></description>
			<content:encoded><![CDATA[<p>I just posted an article for the <a href="http://webofchange.com">Web of Change conference</a>, which takes place in a few weeks. <a href="http://webofchange.com/We-Must-Be-Scientists-for-Change">I make the call for our sector to become more scientific in our approach</a>&#8211;posing testable questions, using technology to get results, analyzing meticulously and sharing systematically, and jumping quickly to posing the next hypothesis. Please check out the full article and join the discussion on the Web of Change site!</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/we-must-be-scientists-for-change/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Textexpander snippets for Apex</title>
		<link>http://gokubi.com/archives/textexpander-snippets-for-apex</link>
		<comments>http://gokubi.com/archives/textexpander-snippets-for-apex#comments</comments>
		<pubDate>Sat, 14 Aug 2010 14:19:35 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1261</guid>
		<description><![CDATA[I just upgraded my work computer to Snow Leopard and one of the benefits I was most excited about was being able to update Textexpander, the incredibly handy snippet tool. You create short codes and when you type them they are replaced with pre-recorded text. They&#8217;re much better at describing what it does. It&#8217;s really [...]]]></description>
			<content:encoded><![CDATA[<p>I just upgraded my work computer to Snow Leopard and one of the benefits I was most excited about was being able to update <a href="http://www.smileonmymac.com/TextExpander/">Textexpander</a>, the incredibly handy snippet tool. You create short codes and when you type them they are replaced with pre-recorded text. They&#8217;re much better at <a href="http://www.smileonmymac.com/TextExpander/screencast/index.html">describing what it does</a>. It&#8217;s really handy for email signatures, canned content for technical support&#8211;really anything you ever type more than once.</p>
<p>With the new features Textexpander got really interesting for use in coding on the Force.com platform. The Force.com IDE doesn&#8217;t have code completion like the in-line code editor does, and it&#8217;s something I look forward to Salesforce.com providing. But in the meantime Textexpander is a great solution for helping you with code you write over and over again.</p>
<p>Textexpander now allows you to put variables in your snippets and allows you to fill those variables as you are expanding the snippet. So, for example, when you&#8217;re declaring a List of Accounts, you don&#8217;t have to type List twice, and Account twice. It&#8217;s really slick.</p>
<p>I&#8217;ve created a <a href="http://gokubi.com/files/Apex%20Snippets.textexpander">Snippet Group for common Apex syntax</a>. To use the file, install Textexpander. Right click on the link to the Snippet Group and save to your computer. It&#8217;s an XML file, but you need to maintain the .textexpander extension on it. Then open up Textexpander and &#8216;Add Group from File.&#8217; The group will show up in Textexpander.</p>
<p>Right now this Snippet Group includes:</p>
<ul>
<li>declaration of lists, sets, and maps</li>
<li>declaration of an sObject</li>
<li>for loops, both kinds</li>
<li>if statements</li>
<li>select statements</li>
<li>test methods</li>
<li>try catch block</li>
<li>system.assert statements</li>
<li>describe result for an sObject</li>
<li>describe result for a field</li>
</ul>
<p>It&#8217;s just a start, but if you take it and like it, add to it. Let me know and we&#8217;ll expand this Snippet Group to be comprehensive. Clearly there should be a VisualForce Sinppet Group as well. If you create one, please let me know!</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/textexpander-snippets-for-apex/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Transition is when you really appreciate keeping track of things</title>
		<link>http://gokubi.com/archives/transition-is-when-you-really-appreciate-keeping-track-of-things</link>
		<comments>http://gokubi.com/archives/transition-is-when-you-really-appreciate-keeping-track-of-things#comments</comments>
		<pubDate>Fri, 06 Aug 2010 16:14:47 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Change]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1255</guid>
		<description><![CDATA[I recently started a new job here at the Foundation and it&#8217;s a bit like other internal transitions I&#8217;ve made in my career. There are innumerable transition tasks&#8211;meetings for getting up to speed, relationship hand-offs, getting dropped into new projects and processes, new team-members, etc. It can be overwhelming, mostly because the old duties don&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>I recently started <a href="http://www.salesforcefoundation.org/about/leadership">a new job here at the Foundation</a> and it&#8217;s a bit like other internal transitions I&#8217;ve made in my career. There are innumerable transition tasks&#8211;meetings for getting up to speed, relationship hand-offs, getting dropped into new projects and processes, new team-members, etc. It can be overwhelming, mostly because the old duties don&#8217;t go away with the start of the new job. So there&#8217;s everything you were struggling to stay on top of before, plus all this new stuff to stay on top of, plus there is a large brain burden for trying to make sense of all the new stuff, not just keep track of the tasks. Oh, and you have to hire your replacement.</p>
<p>I&#8217;ve always thought that the biggest benefit of a good getting things done (GTD) system is the mental relaxation that comes from knowing you&#8217;re not forgetting things. My brain is one that cycles on things even when I don&#8217;t want it to, so I&#8217;ve really loved not having to spin on &#8216;am I forgetting something I&#8217;m supposed to do?&#8217; In this transition there are a ton of new timelines and tasks I can&#8217;t lose track of. Budgets need to be done, priorities set, meetings to attend. But the best part is there is a new level of organizational strategic thinking&#8211;I get to design the strategy for my department and lead the process for our Theory of Change. And my GTD system is really helping me save the brain space for that processing. Now whether I come up with any good ideas is a different story, but it&#8217;s great to feel like I&#8217;m not spending all my cycles on a mental to do list and starving the part that could be cycling on the really fun, intellectually challenging work.</p>
<p>My GTD list is in <a href="http://omnigroup.com/omnifocus">Omnifocus</a>. I haven&#8217;t fundamentally changed my GTD process, but I find I have tweaked it a bit in the transition:</p>
<ol>
<li>I&#8217;ve upped the frequency of my reviews. I look at everything more often because so much of it is new. I&#8217;ve gone from one weekly review to multiple-times-a-day mini-reviews.</li>
<li>I created a new perspective called &#8220;Blocked&#8221;. This shows me things I&#8217;m waiting on other people for where the due date has passed. On short deadlines I need a place to look and see quickly who hasn&#8217;t gotten me what I need to move forward. This helps me with gentle nudging&#8230;</li>
<li>I have created waiting contexts for new people I&#8217;m relying on. I mostly relied on a general &#8216;Waiting for someone&#8217; context, but I now find it helpful to call out key people who are supplying me with things I need.</li>
<li>I&#8217;m using due dates more than I have in the past. I&#8217;m finding that with all the new stuff it helps to put a hard date on it even if it&#8217;s not actually due that day. Perhaps I&#8217;ll stop doing this once the short-term stuff settles down, but for now it helps.</li>
</ol>
<p>But I think the most important thing is that I entered this transition period with an established and working GTD system. I worked hard over the past year to get things to where they are. I was able to tweak my processes, rather than trying to learn a new system at the same time I was dealing with all the other new things. So my advice is this&#8211;the best time to get your GTD system working for you is now, not when you really need it most. You never know when transition will happen, so be ready for it!</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/transition-is-when-you-really-appreciate-keeping-track-of-things/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Move messages to Archive in Entourage</title>
		<link>http://gokubi.com/archives/move-messages-to-archive-in-entourage</link>
		<comments>http://gokubi.com/archives/move-messages-to-archive-in-entourage#comments</comments>
		<pubDate>Thu, 01 Jul 2010 15:00:56 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1249</guid>
		<description><![CDATA[I have to use Entourage at work with our Exchange server. Because I subscribe to the concept of Inbox Zero, and because we have very low mailbox size limits, I move all my messages out of my inbox as soon as I can. I found that I was dragging messages over to a local archive [...]]]></description>
			<content:encoded><![CDATA[<p>I have to use Entourage at work with our Exchange server. Because I subscribe to the concept of Inbox Zero, and because we have very low mailbox size limits, I move all my messages out of my inbox as soon as I can. I found that I was dragging messages over to a local archive all the time, so I wrote a simple applescript to move the selected messages.</p>
<pre class="brush: php">
tell application &quot;Microsoft Entourage&quot;
	try
		set theMessages to current messages
	on error
		display dialog &quot;select some messages before running this script.&quot;
		return
	end try
	move theMessages to folder &quot;Archive&quot;
end tell
</pre>
<p>I then set up a Quicksilver trigger to assign a key combination to invoke this script. Highlight all messages to move, hit command+ctrl+. and they all go to my Archive folder instantly.</p>
<p>In all my years on a PC I never wrote a macro that did this kind of thing in Outlook&#8211;Applescript is so much more accessible.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/move-messages-to-archive-in-entourage/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Salesforce.com as free, bolt-on analytics engine for any database app</title>
		<link>http://gokubi.com/archives/salesforce-com-as-free-bolt-on-analytics-engine-for-any-database-app</link>
		<comments>http://gokubi.com/archives/salesforce-com-as-free-bolt-on-analytics-engine-for-any-database-app#comments</comments>
		<pubDate>Wed, 02 Jun 2010 21:47:26 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1219</guid>
		<description><![CDATA[Over my career I&#8217;ve noticed that most applications have very limited reporting and charting features. I&#8217;ve tried to write some of my own and realized quickly why this is&#8211;analytics is hard! Visual query builders, dynamic charting, aggregation of data, it&#8217;s all really tough to do right. I also think most application teams start out with [...]]]></description>
			<content:encoded><![CDATA[<p>Over my career I&#8217;ve noticed that most applications have very limited reporting and charting features. I&#8217;ve tried to write some of my own and realized quickly why this is&#8211;analytics is hard! Visual query builders, dynamic charting, aggregation of data, it&#8217;s all really tough to do right. I also think most application teams start out with the feature list of business processes that need supporting&#8211;recording transactions, editing information, etc. I think they often punt on the analytics engine for these reasons&#8211;it&#8217;s hard and the value is limited if the app doesn&#8217;t even do what it needs to do yet. Because of this, most apps come later, if at all to the analytics game.</p>
<p>And because most of the apps we use have lousy analytics, we often don&#8217;t know what we&#8217;re missing. In my CRM consulting it was very common for people to under-value the analytics compared to the process streamlining aspects. Getting things done more quickly is important, but analytics can help tell you if you&#8217;re doing the right things.</p>
<p>Salesforce.com has a great analytics engine. It&#8217;s an amazing blend of efficiency and power. Easy things are in the reach of most users, and hard things are possible without coding.  Why are the analytics so good? Salesforce.com is a billion dollar company. They&#8217;ve spent amazing amounts of money building their platform, and as part of that, the killer analytics engine. They&#8217;ve made it a strategic priority, invested in it, and iterated over 10 years. It really shows.</p>
<p>Great, so Salesforce.com has good analytics. You might think that if you want to use those analytics tools, you need to ditch your app and rewrite the whole thing on Salesforce.com, right? Porting a functioning application is a big project, and while sometimes it might makes sense to do that, a lot of times it doesn&#8217;t. You may not have the money to do it. You may be on an open source platform and not want to go to a proprietary one.</p>
<p>But it turns out you don&#8217;t need to ditch your app to get Salesforce.com analytics for your data. Using free and open source tools you can bolt the Force.com Free Edition onto your application and very quickly get the power of Salesforce.com analytics for 100 users. For free. I did it myself last weekend. Here&#8217;s how it works:</p>
<ol>
<li>Get your app up and running</li>
<li>Get <a href="https://www.salesforce.com/form/signup/freeforce-platform.jsp">Force.com Free Edition</a>, or use your existing Salesforce.com organization</li>
<li>Create tables in Salesforce matching the key tables in your app</li>
<li>Create some simple triggers to get all your data relationships right</li>
<li>Set up an extract-transform-load (ETL) server like <a href="http://jitterbit.com">Jitterbit</a> to pull data from your app and push it to Salesforce.com.</li>
<li>Set up reports and dashboards on that data</li>
<li>Let your data inform the strategic direction of your organization</li>
</ol>
<p>If you do all this, you can pull data from your application directly into Salesforce.com, automatically updating it as changes are made in your app. Then your end users can get the analytics they can&#8217;t get in the app. And your key decision makers, who probably don&#8217;t use the app in the first place, can get the top level numbers and trends that help them manage the impact of your organization.</p>
<p><img class="aligncenter size-full wp-image-1226" title="jitterbit_architecture" src="http://gokubi.com/wp-content/uploads/2010/06/jitterbit_architecture2.png" alt="" width="481" height="232" /></p>
<p>I&#8217;ll now go into detail on each of the steps above to show you how it can be done.</p>
<p><strong>Step 1: Get your app up and running</strong></p>
<p>I chose to work with <a href="http://mifos.org">Mifos</a>, an open source application that helps microfinance institutions track their loans and borrowers. Microfinance is a global effort to get working capital in the hands of the poorest people. It&#8217;s amazing work being done by organizations all over the world. Mifos happens to be built on Tomcat with a MySQL database.  But which app I use really isn&#8217;t important. All that matters is that is has extensive functionality for specific business cases, and it has a database we can directly access. If it does these things, it&#8217;s a candidate for Salesforce analytics.</p>
<p>I installed Mifos on an Amazon.com EC2 server, which saved me the trouble of trying to get it to run on my Mac. I love EC2!</p>
<p><strong>Step 2: Get Salesforce</strong></p>
<p>I got <a href="http://developer.force.com/">a free Developer account</a> for this test case, but you could get <a href="http://www.salesforcefoundation.org/products/donation">Salesforce.com donated to your nonprofit</a>, go with the Force.com Free Edition, or purchase Salesforce.com.</p>
<p><strong>Step 3: Create your schema</strong></p>
<p>Creating analogous tables to all the tables in your app is one of the more time-consuming parts of this process. I sped things up by using Model Metrics&#8217;s great <a href="http://sites.force.com/appexchange/listingDetail?listingId=a0N300000016cVIEAY">Cloud Converter tool</a>. I got the field names and one row of values for each table I cared about&#8211;you don&#8217;t need to get every table, just the ones that figure into your analytics. I created an Excel tab for each table, and pasted the header names and values into each. I then let the Cloud Converter loose on it, and the tables were created in just a few minutes! There might be some cleanup necessary with field types&#8211;Cloud Converter guesses what type the field should be, but sometimes it guesses incorrectly. You can do this by hand, or use the metadata API with Eclipse for the fastest action.</p>
<p>All the tables in your app probably have primary keys&#8211;some unique Id field that marks each row. In your Salesforce schema, you want to mark the analagous fields are External Ids. This will allow you to use Salesofrce&#8217;s Upsert web service method. Without External Ids, you need to know the Salesforce.com record Id in order to Update it. Upsert is incredibly amazing for this use case&#8211;it makes it all so easy. Just pass it the primary key from the app and it will find the right record in Salesforce.</p>
<p>The app you&#8217;re coming from has relationships between tables (using the primary key fields I just talked about), so you need to recreate those relationships in Salesforce. Cloud Converter might be able to do this for you, but I didn&#8217;t try that out. Create your lookup relationships between the objects and you&#8217;re good to go.</p>
<p><strong>Step 4: Create your triggers</strong></p>
<p>The ETL server will create your Salesforce records just fine, but it won&#8217;t make sure they&#8217;re related to the correct parent records for you. To do this you need simple triggers on each object to look at the foreign key from your app find the right Salesforce object, and relate the two. Here&#8217;s an example where the Account Payment object looks for the parent Account when it&#8217;s inserted or updated. If it finds it, the relationship gets recorded and the Account Payments show up under the Account:</p>
<pre class="brush: java">
trigger accountPaymentParentfinder on account_payment__c (before insert, before update) {

	Set&lt;Integer&gt; accountIds = new Set&lt;Integer&gt;();

	Map&lt;Integer,Id&gt; accountIdMap = new Map&lt;Integer,Id&gt;();

	//loop through the trigger set and build a set of all the Account Ids
	for(account_payment__c myAccountPayment : Trigger.new){
		if(myAccountPayment.account_ID__c!=null){
			accountIds.add(myAccountPayment.account_ID__c.intValue());
		}

	}

	//go query for those Account Ids and create a map connecting them with the Salesforce Ids
	for(account__c thisaccount : [select id,account_Id__c from account__c where account_Id__c IN :accountIds]){
		accountIdMap.put(thisaccount.account_Id__c.intValue(),thisaccount.id);
	}

	//put the right Salesforce Id in the lookup relationship
	for(account_payment__c myAccountPayment : Trigger.new){
		if(myAccountPayment.account_ID__c!=null){
			myAccountPayment.account__c = accountIdMap.get(myAccountPayment.account_ID__c.intValue());
		}
	}
}
</pre>
<p>You need to do this for each object. If an object has more than one lookup relationship, you&#8217;ll need to create the Set and Map structure for each. They all follow the same pattern. Easy peasy.</p>
<p><strong>Step 5: Set up your ETL server and transformations</strong></p>
<p>I chose <a href="http://jitterbit.com">Jitterbit</a> for my ETL server. They have a free Community edition but I used a 30 day trial of their Enterprise edition, only because there was a machine image on Amazon.com EC2 for the enterprise version. Installation was a 10 minute affair.</p>
<p>The Jitterbit client is where you create the operations that pull data from the source and get it where you want it to go. I created an operation to log in to Salesforce.com and store my session Id. Then you pretty much create one operation for each table in your app, grabbing the data and passing it to Salesforce.com&#8217;s Upsert web service method. This will try to update a record that exists with that External Id. If it can&#8217;t find the record, it will create one. Brilliant.</p>
<p>It&#8217;s a ton of drag-and-drop mapping&#8211;this app field maps to this field on the Salesforce object. But once you get the hang of it, you&#8217;ll crank through all your tables.</p>
<p>When your operations are set up you run them, starting with the login, until all your data comes over. These operations can be scheduled to run as often as makes sense to you. You can pull over only data modified since you last pulled. I created a very simple data flow&#8211;one way from my app to Salesforce.com. But you can really do just about anything. You can send data back to your app. You could pull from 25 different apps all to Salesforce. It&#8217;s up to you.</p>
<p><strong>Step 6: Set up your reports and dashboards</strong></p>
<p>Once your data is in Salesforce.com and related correctly, start creating your reports and dashboards. What I find is that when I create a dashboard the next one immediately comes to mind. Loan default rate over time. But does marital status have an impact on that? What about number of children the borrow has? And what are the patterns for defaults? Do loans tend to default more frequently during the dry season? In the months before harvest? Do non-agriculture loans behave differently? People who work at microfinance institutions ask themselves these questions. They see patterns and want the data to confirm or challenge their assumptions. Because Salesforce.com makes analytics easy, users can ask these questions and get immediate answers. Dashboards can even be sent to them via email every week.</p>
<p>Then step back and take a look at your analytics. Here are some I created with a sample data set in my app:</p>
<ul>
<li><a href="https://www.salesforce.com/secur/frontdoor.jsp?un=readonly@mfi.demo&amp;pw=grameen1&amp;startURL=/01Z30000000r9UQ">Customer Info</a></li>
<li><a href="https://www.salesforce.com/secur/frontdoor.jsp?un=readonly@mfi.demo&amp;pw=grameen1&amp;startURL=/01Z30000000r9jb">Default Info</a></li>
<li><a href="https://www.salesforce.com/secur/frontdoor.jsp?un=readonly@mfi.demo&amp;pw=grameen1&amp;startURL=/01Z30000000r9UG">Delinquency Info</a></li>
<li><a href="https://www.salesforce.com/secur/frontdoor.jsp?un=readonly@mfi.demo&amp;pw=grameen1&amp;startURL=/01Z30000000r9UV">Historic Delinquency Rates</a></li>
<li><a href="https://www.salesforce.com/secur/frontdoor.jsp?un=readonly@mfi.demo&amp;pw=grameen1&amp;startURL=/01Z30000000r9ui">Loan Demographics</a></li>
<li><a href="https://www.salesforce.com/secur/frontdoor.jsp?un=readonly@mfi.demo&amp;pw=grameen1&amp;startURL=/01Z30000000r9ns">Loan Info</a></li>
<li><a href="https://www.salesforce.com/secur/frontdoor.jsp?un=readonly@mfi.demo&amp;pw=grameen1&amp;startURL=/01Z30000000r9oQ">Loan Products</a></li>
</ul>
<p>I was very pleased with the story I am just starting to tell about the loan programs at this pretend microfinance institution. I think the take away is this: Salesforce.com can add value by helping you be creative in telling the story of your data. It&#8217;s a story that might be hard for you to tell right now. But with very little cost other than time and technical ability, you can add flexible, user-driven analytics to any database application by following this recipe.</p>
<p>You can add this power to your app. But the really amazing part is how easy it is to share this kind of setup. Once you create a schema that matches Mifos or OpenMRS or CiviCRM you can package that up in Salesforce and share it with anyone. Just a couple clicks and they can install all the objects, triggers, and dashboards for that app. Jitterbit operations can be shared as well. You export them as a &#8220;jitterpak&#8221; and anyone can use them with their setup. Just change the login information, point to your Salesforce.com web services and it should work without changes.</p>
<p>And perhaps the most important thing is that you&#8217;re not embedding Salesforce.com into your app. You&#8217;re not requiring that everyone using the app use Salesforce.com. I hop this example shows that Salesforce.com can be &#8220;bolted-on&#8221;, adding value along side your mission-critical application. The cost can be very low, the impact can be high, and you can do it without making big decisions about app architecture direction.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/salesforce-com-as-free-bolt-on-analytics-engine-for-any-database-app/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Salesforce sending SMS through FrontlineSMS</title>
		<link>http://gokubi.com/archives/salesforce-sending-sms-through-frontlinesms</link>
		<comments>http://gokubi.com/archives/salesforce-sending-sms-through-frontlinesms#comments</comments>
		<pubDate>Thu, 27 May 2010 14:13:07 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1208</guid>
		<description><![CDATA[FrontlineSMS is an open source application used primarily in the developing world for communicating with large numbers of cell phone users. It&#8217;s a locally installed application that pushes SMS messages out through your tethered cell phone. It&#8217;s a really cool app with all sorts of great real-world usage. My friend Dale Zak just built an [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://frontlinesms.com">FrontlineSMS</a> is an open source application used primarily in the developing world for communicating with large numbers of cell phone users. It&#8217;s a locally installed application that pushes SMS messages out through your tethered cell phone. It&#8217;s a really cool app with all sorts of great real-world usage. My friend Dale Zak just built an awesome <a href="http://www.frontlinesms.com/tag/frontlinesms-reminders/">reminders module</a> for it, and that got me looking at it again.</p>
<p>The newest version of FrontlineSMS (1.6) has a very simple API for sending SMS messages. I have been successful in getting Salesforce.com to use this API to send SMS messages to single Contacts and to Leads and Contacts who are members of a Campaign. Here&#8217;s a short video of it in action:</p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/au-iS2yD97w&amp;hl=en_US&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/au-iS2yD97w&amp;hl=en_US&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p style="text-align: left;">Here&#8217;s what&#8217;s going on in the one-off send:</p>
<ol>
<li>I&#8217;m using Visualforce to create UI that is called by the Send SMS buttons</li>
<li>The Visualforce page accepts the SMS text input</li>
<li>Clicking send shows an iFrame that calls the FrontlineSMS API correctly: http://localhost:&lt;port&gt;/sms_number/sms_message</li>
<li>A Task is related to the Contact with the data and content of the SMS message</li>
</ol>
<p>Why use the iFrame? Since FrontlineSMS is locally installed, we have to communicate with it from the browser. A more robust option would be to create Javascript that makes the localhost calls and listens for the success or failure and proceeds accordingly.</p>
<p>To all the members of a Campaign, we do the following:</p>
<ol>
<li>The Visualforce page accepts the SMS text input</li>
<li>Clicking Send exposes an Action Poller, which calls code every 5 seconds</li>
<li>When the Action Poller calls code, 10 Campaign Members of the correct Status are queried</li>
<li>10 iFrames are populated with the FrontlineSMS API URLs for the messages</li>
<li>The Campaign Member records have their Status changed so they won&#8217;t be queried again</li>
<li>Tasks are related to the Campaign and the Contact or Lead</li>
</ol>
<p>Here are the Salesforce code bits.</p>
<p>Visualforce page for one-off sends:</p>
<pre>
<pre class="brush: html">
&lt;apex:page standardController=&quot;Contact&quot; extensions=&quot;extSendSMS&quot; &gt;
	&lt;apex:form &gt;
		&lt;apex:sectionHeader title=&quot;FrontlineSMS&quot; subtitle=&quot;Send SMS via FrontlineSMS&quot;&gt;
			&lt;description&gt;
				Send an SMS using FrontlineSMS:
				&lt;ul&gt;
					&lt;li&gt;Install FrontlineSMS on your computer&lt;/li&gt;
					&lt;li&gt;Make sure FrontlineSMS is running&lt;/li&gt;
					&lt;li&gt;Make sure your phone is connected to FrontlineSMS&lt;/li&gt;
				&lt;/ul&gt;

			&lt;/description&gt;

		&lt;/apex:sectionHeader&gt;
		&lt;apex:pageMessages id=&quot;pageMessages&quot;/&gt;
		&lt;apex:pageBlock id=&quot;smsblock&quot; title=&quot;&quot;&gt;
			&lt;apex:pageBlockSection id=&quot;smssection&quot;&gt;
				&lt;apex:outputField value=&quot;{!contact.MobilePhone}&quot;/&gt;
				&lt;apex:inputField value=&quot;{!task.Description}&quot;/&gt;
			&lt;/apex:pageBlockSection&gt;
			&lt;apex:pageBlockButtons id=&quot;smsbuttons&quot;&gt;
				&lt;apex:commandButton value=&quot;Send SMS&quot; action=&quot;{!sendSMS}&quot; rerender=&quot;smsiframe&quot;/&gt; 

			&lt;/apex:pageBlockButtons&gt;
		&lt;/apex:pageBlock&gt;
		&lt;apex:pageBlock id=&quot;smsiframe&quot; title=&quot;&quot;&gt;
		&lt;apex:iframe id=&quot;frontlinesmsIframe&quot; src=&quot;{!endpoint}&quot; scrolling=&quot;no&quot;  rendered=&quot;{!showFrontlineSMSiframe}&quot;/&gt;
		&lt;/apex:pageBlock&gt;
	&lt;/apex:form&gt;
&lt;/apex:page&gt;
</pre>
<p>Apex controller for one-off sends:</p>
<pre>
<pre class="brush: java">
public with sharing class extSendSMS {
	public Task task {get;set;}
	public String endpoint {get;set;}
	public Boolean showFrontlineSMSiframe {get;set;}
	private Contact contact;
	private Lead lead;
	public extSendSMS(ApexPages.StandardController stdController) {
		this.contact = (Contact)stdController.getRecord();
		this.contact = [select id, MobilePhone from Contact where Id=:contact.id];
		this.task = new Task();
		this.task.WhoId = contact.Id;
		this.task.type = &#039;SMS&#039;;
		this.task.ActivityDate = Date.Today();

		this.task.status = &#039;Completed&#039;;
		showFrontlineSMSiframe = false;
    }
    public PageReference sendSMS(){
    	this.task.subject = &#039;SMS: &#039; + this.task.Description;
    	insert task;
    	String strippedMobilePhone = &#039;&#039;;
    	strippedMobilePhone = this.contact.mobilePhone;
    	strippedMobilePhone = strippedMobilePhone.replaceAll(&#039;[^0-9]&#039;, &#039;&#039;);

    	endpoint = &#039;http://localhost:8565/&#039;+ strippedMobilePhone +&#039;/&#039;+ this.task.Description;
    	showFrontlineSMSiframe = true;
    	return null;
    }
}
</pre>
<p>Visualforce page for Campaign sends:</p>
<pre>
<pre class="brush: html">
&lt;apex:page standardController=&quot;Campaign&quot; extensions=&quot;extSendSMSCampaign&quot; &gt;
&lt;apex:form &gt;
		&lt;apex:sectionHeader title=&quot;FrontlineSMS&quot; subtitle=&quot;Send SMS via FrontlineSMS&quot;&gt;
			&lt;description&gt;
				Send an SMS using FrontlineSMS:
				&lt;ul&gt;
					&lt;li&gt;Install FrontlineSMS on your computer&lt;/li&gt;
					&lt;li&gt;Make sure FrontlineSMS is running&lt;/li&gt;
					&lt;li&gt;Make sure your phone is connected to FrontlineSMS&lt;/li&gt;
				&lt;/ul&gt;

			&lt;/description&gt;

		&lt;/apex:sectionHeader&gt;
		&lt;apex:pageMessages id=&quot;pageMessages&quot;/&gt;
		&lt;apex:pageBlock id=&quot;smsblock&quot; title=&quot;&quot;&gt;
			&lt;apex:pageBlockSection id=&quot;headersection&quot; &gt;
				&lt;apex:outputLabel for=&quot;membercount&quot;&gt;Member Count&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;membercount&quot; value=&quot;{!memberCount}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;numbersent&quot;&gt;Number Sent&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;numbersent&quot; value=&quot;{!numberSent}&quot;/&gt;
				&lt;apex:inputField value=&quot;{!dummyTask.Description}&quot;/&gt;

			&lt;/apex:pageBlockSection&gt;
			&lt;apex:pageBlockSection id=&quot;smssection&quot; rendered=&quot;{!showFrontlineSMSiframe}&quot;&gt;
				&lt;apex:outputLabel for=&quot;endpoint1&quot;&gt;SMS 1 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint1&quot; value=&quot;{!endpoint1}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint2&quot;&gt;SMS 2 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint2&quot; value=&quot;{!endpoint2}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint3&quot;&gt;SMS 3 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint3&quot; value=&quot;{!endpoint3}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint4&quot;&gt;SMS 4 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint4&quot; value=&quot;{!endpoint4}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint5&quot;&gt;SMS 5 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint5&quot; value=&quot;{!endpoint5}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint6&quot;&gt;SMS 6 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint6&quot; value=&quot;{!endpoint6}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint7&quot;&gt;SMS 7 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint7&quot; value=&quot;{!endpoint7}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint8&quot;&gt;SMS 8 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint8&quot; value=&quot;{!endpoint8}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint9&quot;&gt;SMS 9 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint9&quot; value=&quot;{!endpoint9}&quot;/&gt;
				&lt;apex:outputLabel for=&quot;endpoint10&quot;&gt;SMS 10 (debug)&lt;/apex:outputLabel&gt;&lt;apex:outputText id=&quot;endpoint10&quot; value=&quot;{!endpoint10}&quot;/&gt;
			&lt;/apex:pageBlockSection&gt;
			&lt;apex:pageBlockButtons id=&quot;smsbuttons&quot;&gt;
				&lt;apex:commandButton value=&quot;Send SMS&quot; action=&quot;{!sendSMS}&quot; rerender=&quot;smsblock,smsiframe,actionblock&quot;/&gt;
			&lt;/apex:pageBlockButtons&gt;
		&lt;/apex:pageBlock&gt;
		&lt;apex:pageBlock id=&quot;actionblock&quot; title=&quot;&quot;&gt;
			&lt;apex:actionPoller action=&quot;{!sendSMSToMembers}&quot; rerender=&quot;smsblock,smsiframe,actionblock&quot; interval=&quot;5&quot; rendered=&quot;{!showActionBlock}&quot;/&gt;
		&lt;/apex:pageBlock&gt;
		&lt;apex:pageBlock id=&quot;smsiframe&quot; title=&quot;&quot; &gt;
			&lt;apex:pageBlockSection id=&quot;smsisection&quot; rendered=&quot;{!showFrontlineSMSiframe}&quot;&gt;
				SMS 1 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe1&quot; height=&quot;30&quot; src=&quot;{!endpoint1}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 2 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe2&quot; height=&quot;30&quot; src=&quot;{!endpoint2}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 3 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe3&quot; height=&quot;30&quot; src=&quot;{!endpoint3}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 4 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe4&quot; height=&quot;30&quot; src=&quot;{!endpoint4}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 5 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe5&quot; height=&quot;30&quot; src=&quot;{!endpoint5}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 6 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe6&quot; height=&quot;30&quot; src=&quot;{!endpoint6}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 7 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe7&quot; height=&quot;30&quot; src=&quot;{!endpoint7}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 8 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe8&quot; height=&quot;30&quot; src=&quot;{!endpoint8}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 9 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe9&quot; height=&quot;30&quot; src=&quot;{!endpoint9}&quot; scrolling=&quot;no&quot;  /&gt;
				SMS 10 (debug)
				&lt;apex:iframe id=&quot;frontlinesmsIframe10&quot; height=&quot;30&quot; src=&quot;{!endpoint10}&quot; scrolling=&quot;no&quot;  /&gt;
			&lt;/apex:pageBlockSection&gt;
		&lt;/apex:pageBlock&gt;
	&lt;/apex:form&gt;
&lt;/apex:page&gt;
</pre>
<p>Apex controller for campaign sends:</p>
<pre>
<pre class="brush: java">
public with sharing class extSendSMSCampaign {
	public Campaign campaign {get;set;}
	public Task dummyTask {get;set;}
	public String SMSmessage {get;set;}
	public String endpoint1 {get;set;}
	public String endpoint2 {get;set;}
	public String endpoint3 {get;set;}
	public String endpoint4 {get;set;}
	public String endpoint5 {get;set;}
	public String endpoint6 {get;set;}
	public String endpoint7 {get;set;}
	public String endpoint8 {get;set;}
	public String endpoint9 {get;set;}
	public String endpoint10 {get;set;}
	public Integer memberCount {get;set;}
	public Integer numberSent {get;set;}
	private List&lt;String&gt; endpoints = new List&lt;String&gt;();
	private List&lt;Task&gt; SMSTasks = new List&lt;Task&gt;();
	private Id whoId;
	public Boolean showActionBlock {get;set;}
	public Boolean showFrontlineSMSiframe {get;set;}
	private Contact contact;
	private Lead lead;
	private CampaignMember campaignMember;

	public extSendSMSCampaign(ApexPages.StandardController stdController) {
		this.campaign = (campaign)stdController.getRecord();
		memberCount = [select count() from CampaignMember where CampaignId=:this.campaign.id AND status=&#039;sent&#039; and (Contact.MobilePhone &lt;&gt; null OR Lead.MobilePhone &lt;&gt; null)];
		showFrontlineSMSiframe = false;
		showActionBlock=false;
		SMSmessage = &#039;test message&#039;;
		numberSent =0;
		dummyTask = new Task();
    }

    public PageReference sendSMS(){
    	showActionBlock = true;
    	showFrontlineSMSiframe = true;
    	return null;
    }

     public PageReference sendSMSToMembers(){
     	endpoints = new List&lt;String&gt;();
     	endpoint1 = &#039;&#039;;
		endpoint2 = &#039;&#039;;
		endpoint3 = &#039;&#039;;
		endpoint4 = &#039;&#039;;
		endpoint5 = &#039;&#039;;
		endpoint6 = &#039;&#039;;
		endpoint7 = &#039;&#039;;
		endpoint8 = &#039;&#039;;
		endpoint9 = &#039;&#039;;
		endpoint10 = &#039;&#039;;
		SMSTasks = new List&lt;Task&gt;();
    	List&lt;CampaignMember&gt; myCampaignMembers = new List&lt;CampaignMember&gt;();
    	myCampaignMembers = [select id, Contact.MobilePhone,Contact.Id,Lead.Id, Lead.MobilePhone, status from CampaignMember where CampaignId=:this.campaign.id AND status=&#039;sent&#039; and (Contact.MobilePhone &lt;&gt; null OR Lead.MobilePhone &lt;&gt; null) limit 10];
		if(myCampaignMembers.size()&gt;0){
	    	for(Integer i=0;i&lt;myCampaignMembers.size();i++){
	    		CampaignMember thisMember = myCampaignMembers[i];
		    	String strippedMobilePhone = &#039;&#039;;
		    	if(thisMember.Contact.MobilePhone!=null){
		    		strippedMobilePhone = thisMember.contact.mobilePhone;
		    		whoId = thisMember.Contact.Id;
		    	} else if(thisMember.Lead.MobilePhone!=null){
		    		strippedMobilePhone = thisMember.contact.mobilePhone;
		    		whoId = thisMember.Lead.Id;
		    	}
		    	strippedMobilePhone = strippedMobilePhone.replaceAll(&#039;[^0-9]&#039;, &#039;&#039;);

		    	endpoints.add(&#039;http://localhost:8565/&#039;+ strippedMobilePhone +&#039;/&#039;+ dummyTask.Description);
		    	SMSTasks.add(new Task(WhoId = whoId,WhatId=this.campaign.id,type = &#039;SMS&#039;,ActivityDate = Date.Today(),Description=dummyTask.Description,Status=&#039;Completed&#039;,Subject=&#039;SMS: &#039;+dummyTask.Description));
	    	}
	    	numberSent += myCampaignMembers.size();
	    	if(endpoints.size()&gt;0){
	    		While(endpoints.size()&lt;10){
	    			endpoints.add(&#039;&#039;);
	    		}

		    	endpoint1 = endpoints[0];
				endpoint2 = endpoints[1];
				endpoint3 = endpoints[2];
				endpoint4 = endpoints[3];
				endpoint5 = endpoints[4];
				endpoint6 = endpoints[5];
				endpoint7 = endpoints[6];
				endpoint8 = endpoints[7];
				endpoint9 = endpoints[8];
				endpoint10 = endpoints[9];
	    	}
	    	for(CampaignMember myMember : myCampaignMembers){
	    		myMember.status=&#039;Responded&#039;;
	    	}
	    	update myCampaignMembers;
	    	insert SMSTasks;
		} else {
			showActionBlock = false;
		}
		return null;
    }

}
</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/salesforce-sending-sms-through-frontlinesms/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Send To Omnifocus from Google Reader</title>
		<link>http://gokubi.com/archives/send-to-omnifocus-from-google-reader</link>
		<comments>http://gokubi.com/archives/send-to-omnifocus-from-google-reader#comments</comments>
		<pubDate>Tue, 25 May 2010 18:45:37 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=1195</guid>
		<description><![CDATA[When I&#8217;m surfing the web or reading email, I often run across things that I don&#8217;t have time to complete now, but want to do later. It&#8217;s at times like these I &#8220;send&#8221; things to Omnifocus. I do this in many ways. Omnifocus has great built in scripting, so I have keyboard shortcuts to send [...]]]></description>
			<content:encoded><![CDATA[<p>When I&#8217;m surfing the web or reading email, I often run across things that I don&#8217;t have time to complete now, but want to do later. It&#8217;s at times like these I &#8220;send&#8221; things to Omnifocus. I do this in many ways. Omnifocus has great built in scripting, so I have keyboard shortcuts to send things to the Omnifocus Quick Entry form from Entourage, Safari, Mailplane, etc.</p>
<p>When I&#8217;m on a web page, I use <a href="http://nik.me/omnifocus-uri-handler">Nik&#8217;s URIHandler</a> to send things directly to my reading list via a bookmarklet. It&#8217;s incredibly handy for all sorts of things&#8211;check out my <a href="http://gokubi.com/archives/getting-groceries-done">example for creating a grocery list</a>.</p>
<p>But most of the stuff I read comes in via Google Reader and there hasn&#8217;t been a good way for me to send a story from Google Reader to Omnifocus. A while back Google Reader added a <a href="http://googlesystem.blogspot.com/2009/08/google-readers-send-to-feature.html">Send To</a> function allowing you to send information from the current story to any URL. The problem is, Omnifocus is a locally installed app&#8211;it doesn&#8217;t have URLs.</p>
<p>To solve this problem, I have built a very simple PHP page that Google Reader can use to Send To Omnifocus. Here&#8217;s a quick video of how it works:</p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/lKfX4e-9jmE&amp;hl=en_US&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/lKfX4e-9jmE&amp;hl=en_US&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>First you need to install <a href="http://nik.me/omnifocus-uri-handler">Nik&#8217;s URIHandler</a>. It&#8217;s really easy to install and once you&#8217;ve done that, your computer will have a way to create items in Omnifocus via Javascript.</p>
<p>Then you need to set up Google Reader to Send To the URIHandler.</p>
<p>Go to Settings &gt; Send To and create a new link</p>
<p><img class="aligncenter" title="Google Reader Send to link" src="http://gokubi.com/images/2010-05-25_0852.png" alt="" width="504" height="168" /></p>
<p>The URL looks like this (substitute your real project and context names): http://gokubi.com/ofocus.php?title=Read: ${title}&amp;url=${url}&amp;context=yourContextHere&amp;project=yourProjectHere</p>
<p>And the image URL looks like this: http://gokubi.com/images/omnifocus-128-75&#215;75.png</p>
<p>Save that and you can Send To Omnifocus right from Google Reader!</p>
<p>If you want to do this on your own, and not use my send to URL, the PHP script is really simple:</p>
<pre class="brush: php">
&lt;?php
echo &quot;&lt;script language=\&quot;JavaScript\&quot;&gt;\n&quot;;
echo &quot;window.location = \&quot;x-omnifocus://parsetasks?text=&quot; .  htmlentities($_GET[&#039;title&#039;]) . &quot; :: &quot; . htmlentities($_GET[&#039;project&#039;]) . &quot; @ &quot; . htmlentities($_GET[&#039;context&#039;]) . &quot; // &quot; . htmlentities($_GET[&#039;url&#039;]) . &quot;\&quot;;\n&quot;;
echo &quot;&lt;/script&gt;\n&quot;;
?&gt;
</pre>
<p>You can create as many Send To buttons as you want&#8211;put whatever you want in the title, and use different projects and contexts. It&#8217;s very flexible and easy to use.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/send-to-omnifocus-from-google-reader/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.455 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-09 05:09:41 -->

