What you need to know about Mobile Lite

I’ll admit it, this is my first look at the Salesforce Mobile functionality – welcome to 2009! I know… it’s just that I don’t really have a need for it myself and no one’s ever asked me about it before.   So after and afternoon of pawing through the documentation, I’m documenting a few things that I may want to remember the next time someone asks me about this.
Here’s the full scoop on SF Mobile.

And some important paragraphs from this documentation that I don’t want to search for next time I need to explain this to someone or, more likely, remember how it works:

“Accessing Salesforce from a mobile device is very different than accessing it from your computer. This is because mobile devices generally have less memory and screen size than computers, and they do not maintain a constant network connection. To work with these limitations, each mobile configuration only transfers data sets, which are subsets of the records users access in the Salesforce online user interface. Mobile devices store data sets in on-board databases, allowing users to access their most important records and work offline when no network connection is available. Salesforce automatically synchronizes the on-board databases when the mobile device reestablishes a network connection”

“The space limitations and usability restrictions of wireless devices make it necessary to send a subset of a user’s Salesforce data to the mobile device. The data selected is determined by the mobile configuration assigned to each user in the Mobile Administration Console. Mobile configurations are sets of filter parameters that determine the data Salesforce transmits to users’ mobile devices, and which users receive that data on their mobile devices. You can edit the configurations at any time to change the data your users receive”

“Once every 24 hours, Salesforce Mobile requests a full update of a user’s data set. The filters contained in the mobile configuration are executed to rebuild the data set, and the resulting data records are sent to the device. The mobile client application checks for data changes every 20 minutes. During this incremental update, the server retrieves any newly-created records from Salesforce owned by the user, and then sends that data to the device. Modifications to any records already stored on the device are also sent. This periodic update may retrieve some records which do not match the filter criteria of the user’s mobile configuration. In this case, these records only exist on the user’s device until the next full update.”

If you’re like me, you want to just download the app and get started already – but probably not buy a license yet.  So…. if you want to try out the free version (Mobile Lite), here’s what you need to know about how it works…
Mobile Lite is available for use by Professional, Enterprise, Unlimited, or Developer Edition users without mobile licenses.
Mobile Lite doesn’t include all of the functionality offered in Salesforce Mobile.
Mobile Lite:
  •  Supports fewer standard objects (see below for a full list)
  •  Doesn’t provide support for custom objects*
  •  Doesn’t allow administrators to customize or create mobile configurations**
* If you’re using NPSP, don’t forget that this includes Households andPayments.
** This means you can’t use anything other than the default configuration (which may be just fine for what you need). Salesforce documentation helpfully states, “You can’t view or edit the default mobile configuration”, but notes that it works as follows:
The default configuration can mobilize the following objects:
  • Accounts
  • Assets
  • Cases
  • Contacts
  • Dashboards
  • Events
  • Leads
  • Opportunities
  • Reports
  • Solutions
  • Tasks

The default configuration automatically synchronizes records the user recently accessed in Salesforce. Users can search for records that are not automatically synchronized; once the user downloads a record, the record becomes a permanent part of the data set. In addition to recently accessed records, the default configuration synchronizes activities closed in the past five days and open activities due in the next 30 days.

iPhone specific note: Because only one application can run on the iPhone at a time, Salesforce Mobile cannot request a data update unless the application is open. When you launch the application on the iPhone, it performs an incremental update if a data synchronization has not occurred in the past 20 minutes

Non Profit Discounted Full Mobile licenses are $120/year (as of 1/24/11).  If you feel like Mobile Lite is not going to meet your needs, you may want to discuss with your account rep.

Auto-populate Check Number and Payment Type on Payment Records auto-created by NPSP

The new Payment Object and reporting functionality that comes with the 10/2/11 relase of the Contacts & Orgs NPSP is great – especially for AR reporting
but I have some clients who really only ever (or mostly) have donations that come in a single payment (not multiple installments) and it’s a hassle for them
to have to click into the payment records to enter the check number and payment type, so I came up with this work-around that keeps the Type (and adds check number) to the Opportunity and then formulas/workflows that copies it to the payment records when they are auto-created. I use the formula + workflow approach so that users could edit the Check number and payment type values on the payment recors if they needed to. If we just used formulas, these wouldn’t be editable.

1. Create new field on Donation: Check Number – text(25); Description: Field for recording check number at the donation level; Workflow copies this to the related payment records when the payment records are created

2. Create new fields on Payment:
Donation Check Number – formula(text)= npe01__Opportunity__r.Check_Number__c;Description: Auto-populated based on value of Check Number field from Donation record; not displayed to user; used only for workflow to populate Payment Check Number
Donation Type – formula(text)= TEXT(npe01__Opportunity__r.Type); Description: Auto-populated based on value of Type field from Donation record; not displayed to user; used only for workflow to populate Payment Type
*Payment Type – text(20); Help Text: This is auto-populated based on what was selected in the donation record. If you need to change this, please use one of the following standard values: Cash, Check, Credit, PayPal, Money Order, InKind

*Note: you’ll need this field (rather than Payment Method) b/c workflow field updates can’t change the value of a picklist field; be sure to remove Payment
Method from the page layout and replace with this one; should be used in reports as well

3. Create workflow rule:
Name: Copy Type and Check Number from Donation to Payment on Payment object
Description: Auto-populates payment Method and Check number based on values from Donation record
Evaluation Criteria: Only when a record is created
Rule Criteria: Opportunity: Opportunity NameNOT EQUAL TOnull

4. Create workflow actions:
Field Update – Payment Object
Name: Update Check Number
Description: Updates check number field to the value calculated in the Donation_Check_Number__c field
Field to Update: Check/Refrence Number
Formula: Donation_Check_Number__c

Field Update – Payment Object
Name: Update Payment Type
Description: Updates Payment Type field to the value calculated in the Donation_Type__c field
Field to Update: Payment Type
Formula: Donation_Type__c

Don’t forget to Activate the workflow ;)

Vertical Response/Salesforce Setup, Notes and “Known Issues”

Non Profit Vertical Response Setup How To:
1. Install VR for App Exchange in Salesforce
2. Each Salesforce user that will be sending emails using Vertical Response must:
login to Salesforce
go to the Vertical Response App
click on the VREmail tab
NOTE: this creates a VR Account for each user; you can set these up later as users are added to the system, but if you want to pool email credits, you’ll need to let VR know which user accounts to pool. (see more detail on this below)
3. SF Admistrator fills out the VR Non Profit Application form to recieve your 10,000 free emails/month: http://www.verticalresponse.com/non-profits/application/
NOTE: DO NOT set up a new VR Account; your VerticalResponse User name is the email address associated with your Salesforce.com login
4. Attend a VR for Salesforce web demo: http://help.verticalresponse.com/how-to/tutorial/upcoming_salesforce_demos/

Pooling your 10,000 free Email Credits: Your Vertical Response email credits can be pooled among your Salesforce users. To do so, every one of your users needs to login to Salesforce, go the VerticalResponse app, and click on the VR Email tab. Once your users do so, you need to send an email tosupport@verticalresponse.com asking them to pool email credits among the Salesforce users, listing both their names and email addresses that correspond to those user accounts in Salesforce. One important note, although your Salesforce users can share in the pool of VerticalReponse email credits, your accounts in VerticalResponse are not linked together in any way. You can’t see emails that other users have sent in VR and vice-versa, nor can you Update Statistics for any emails but your own, sent from your user account.
Other Helpful Resources:

http://www.verticalresponse.com/education-support/

Notes/”Known Issues”:
1. While unsubscribes are recorded as part of the Contact record (in the email opt out field) when you Update Statistics on a VR Email, bounces are not recorded as part of the contact record (you would be able to see who’s bounced as part of the VREmail History related list). Best practice for handling bounces varies, but you may want to keep these people on your active mailing lists for 2-3 bounced mailings, but if you continue to mail to them, it not only eats up your VR email credits, but also gives a false picture of your engagment with the contact b/c it looks like you are actively enagaging them through emails, but they aren’t recieveing them.

Workaround = GW Trigger

2. Vertical Response opt-out is Global, meaning that if a contact opts out of ANY list, they will be excluded from ANY and ALL future mailings regardless of whether it’s to a different list.

Workaround = MailChimp, ExactTarget and iContact are all other mass email options that allow contacts to unsubscribe from a specific list.

3. VR basic reporting data (opens, clicks, unsubscribes and bounces) can be accessed through VR Email or VR Statistics tabs. Update Statistics button under both these tabs – this button allows you to push this data back into your Salesforce account, where you can access it under your Reports tab, within each Lead & Contact Record, and through Reports and Dashboards

Reports/Dashboards that come with VR:
VR Email History Contacts/Leads and VR Email History (dashboard)

If you aren’t getting stats after you send emails, check your page layouts and configuration and then check to see that you aren’t creating your emails by uploading a list; you can use either of the other two options but uploading a list of emails won’t connect with your salesforce contacts and update statistics.

Any record that does not include an email address, or that has its opt-out box checked, will be suppressed from the search and not included in the result when you are creating lists.

4. Campaigns – If you used a Salesforce Campaign to build your VR list, then you can see the opens, clicks, bounces, and unsubscribes in the Campaign Member Analysis Report. Just note that you’ll need to go into the Advanced Setup for the Campaign in question, and add Opened, Clicked, Bounced and Unsubscribed as Member Status Values to make this work.

Organization Name on Merge Letters

I really love Conga Composer for creating thank you letters, but hate having to do a different version of each letter for Org and Individual contacts (one with the Organization Name and one w/out), so I use this formula field on the Contact record to display null for Individual contacts – there are two versions of this; one for orgs using one-2-one accounts, one for orgs using the Individual Bucket model

IF(Account.npe01__SYSTEMIsIndividual__c =true,null, Account.Name )
IF( Account.Name ="Individual",null, Account.Name )

Handy Formulas

Range Values in Condition formula:

I struggled with this one a bit last fall; I was trying to use a Case statement for this, but Michael Smith came to my rescue (thanks Mike!):

“Because you’re using ranges in the conditions, you probably have to use a
nested IF block. A Case structure is only for equals type conditions.”

Here’s what I ended up with:

IF( Estimated_Population__c < 2500, "Extra Small",
IF ( Estimated_Population__c  < 13000, "Small",
IF ( Estimated_Population__c  < 70000, "Mid-Sized", "Large")
)
)

Migration Tools

There’s a new baby at my house which partly explains the long time since my last post… and while a lot of my energy has been spent topics like infant eczema, diaper rash and when to stop swaddling, I’m enjoying getting back to my “other” job and updating myself on the latest and greatest in the Salesforce world.   My current work load includes my first org switch – moving an organization from an old really screwed up version of Salesforce to a fresh, clean installation with the Non-Profit starter packages installed.  Apparently org switches are very rare – used only in cases where the older instance is FUBAR, so you get some idea of what I’m dealing with.  In this particular case, I’ve stumbled across two tools that have been so helpful I’m wondering why I haven’t used them before.

Force.com IDE with Eclipse

I’d seen this tool in action at a Dreamforce session over a year ago, but I’d really been dragging my feet about installing/exploring it since I’m not a programmer and was feeling like I wasn’t quite ready to jump into the deep end of the pool – Apex coding, etc. etc.  But when I mentioned what I was working on, my esteemed colleague, Tanner Wells, suggested I take a look at Force.com IDE since it makes the transfer/deployment of metadata (objects, fields, page layouts,workflow,profiles,reports,etc.) from one Salesforce instance to another really simple.  I checked it out and was sold.  This will literally save me HOURS of time on this project.  Since most of my projects are not Salesforce > Salesforce, I’m not sure how much I’ll use it in the future, but it’s certainly a great tool for this migration and who knows – maybe it’ll get me to stick my toe in the Apex water.

Info on the tool and how to install:
http://wiki.developerforce.com/index.php/Force.com_IDE

And look at how easy it is to select metadata elements for deployment from one instance to another:

Microsoft Access

I usually use Excel for manipulating and cleaning up data, but with extract files with > 100K records, I needed a tool that could handle something a little larger and I’m glad I thought to use Access.  Access was my first foray into relational databases way back in, uh, 2000? so I’m a little rusty with the queries etc., (especially since I sprung for a new version of the software).  But I’m soooo glad I did b/c building a query beats the heck out of VLOOKUP and, once I’m ready to load the production data, I can just re-use all the queries I’ve built with the test uploads.

I was going to post a screen shot of an Access query, but c’mon – y’all know what that looks like and this one is so much cuter.

Conga Point Merge Button etc.

AppExtremes/Conga Merge has EXCELLENT customer support and documentation, but just so I don’t have to weed through it in the future, I wanted to document a few things:

Here’s the code for a custom button to generate a Point Merge Thank you:

https://www.appextremes.com/apps/Conga/PointMerge.aspx
?sessionId={!API.Session_ID}
&serverUrl={!API.Partner_Server_URL_80}
&id={!Opportunity.Id}
&TemplateGroup=ThankYou
&lg0=0
&lg3=2
&lg4=1
&OFN={{!Opportunity.Name}}+{Template.Label}

Full Name Field

Middle Name and Suffix aren’t standard fields on the Contacts Object in the NPSF template.  I’ve needed to create these for several clients and then pull them back together for a “Full Name” field used for mailing labels etc.  Here are some examples of formulas I’ve used for this:

TEXT(Salutation) &
IF(TEXT(Salutation) != null, " ", "")
&FirstName &
IF(FirstName != null, " ", "")
& Middle_Name__c &
IF(Middle_Name__c != null && LastName != null, " ", "")
& LastName &
IF(LastName != null || Middle_Name__c != null, " ", "")
& Suffix__c

Moving Data from Production to Sandbox

I just spent the afternoon tearing my hair out over what really should have been a simple process.  Gotta love a learning curve!! 

 

I have a client that’s on the old NPSF template and I’m planning to upgrade them to the new template – but I wanted to try it out in a sandbox first so I didn’t have an “surprises”.  I thought this would be a piece of cake.  Here’s what I learned (oh, and no, I haven’t even gotten to installing the new packages yet!):

 

  1. First, Setup new Sandbox: But wait… with the Non Profit license that Salesforce donates, you don’t get the option of creating a sandbox with data; you can create a developer sandbox, which creates your exact SF configuration, but without data.  That’s helpful, but only sort of.  I need to see what the effects of installing the new packages are on the DATA.  So, I thought, no problem, I’ll just export the objects in use to .csv files and import them back into the sandbox…

 

  1. Next challenge: I got the data out just fine, (I used Apex Data loader v14) but then I needed to figure out how to get the data back into the sandbox.  After a bit of poking around online, I found that to do this you have to make a change to the Data Loader settings.  Change server host to: https://test.salesforce.com, (it’s https://www.salesforce.com for production databases), then log into your sandbox database using your sandbox username and password + sequrity token (note this is not the same sequrity token you use for your production db, you’ll need to re-set it, (Setup | My Personal Information | Reset My Sequrity Token) before you do this.

 

  1. More Hair Pulling: OK, now I can load data into my Sandbox, and I load up the Organizations/Accounts file.  Everything goes in OK except the one record that’s the ‘Individual’ Account record that so many contacts are linked to.  I get the following error – “Record Type: id value not valid for the users profile: 012700000009SZlAAM”.  Hmmm… I’m System Administrator.  I go to Setup | Manage Users | Profiles  - Click on System Administrator.  Scroll down to Record Type Settings; click on Edit in the Accounts section.  Move Individual over from Available Record Types into Selected Record Types; click OK; try import on ‘Individual’ account into Orgs again – it works! 

 

  1. Next Headache: “insufficient access rights on cross-reference id”!!  So.  I guess I thought this process would be easy because I could just import the object data from the production instance and since the id’s were all nicely linked, it would be a simple process, but what I quickly realized is that when you import data for say, Organizations, Salesforce replaces the ID – and if you say, tried to import Contacts with the field ID (from production), you’ll get the “insufficient access rights on cross-reference ID” message.  This all makes perfect sense now that I think about it – of course ID’s are auto-generated fields and would have to be re-created in a new db.  Here’s a sketch of my process:

 

  1.  
    1. Create LegacyID fields (text 35) in Organizations, Contacts, Households, Donations
    2. Prepare Organization import file: rename ID field as LegacyID
    3. Import Organization data
    4. Extract Organization data with ID, Name, LegacyID (I don’t know why I think I need name, I guess it’s just reassuring to have it in the midst of all those weird numbers)
    5. Prepare Household import file: rename ID field as LegacyID
    6. Import Household data
    7. Extract Household data with ID, Name, LegacyID
    8. Prepare Contacts import data file: rename ID field as LegacyID, replace ID’s for Organization(AccountID) and Household (ONW_Household?) with new ID’s from export files using VLookup
    9. Import Contacts data
    10. Extract Contacts data with ID, Last Name, LegacyID
    11. Prepare Donations import file: rename ID field as LegacyID, replace AccountID with new ID’s from export file using VLookup
    12. Import Donations data
    13. Extract Donations; ID, Name, LegacyID
    14. Prepare OpportunityContactRoles import file: delete ID field (no need for LegacyID); replace ContactID and OpportunityID with new values from export files using VLookup
    15. Import OpportunityContactRoles
    16. Prepare Connections import file; delete ID, replace ContactID’s and OrganizationID’s in the following fields with data from export files using VLookup (RELATED_CONTACT__C, CONTACT__C, RELATED_ORGANIZATION__C)

 

That should do it. Whew.  A lot more work than I’d planned on. Time to do this once I’d understood the process?  About 1 hour (small org < 100 contact records).

Phone/Email Fields in new NPSF Template

The Contacts & Organizations package that comes with the New SF NonProfit Starter pack has some new functionality around Preferred Email and Preferred Phone fields.  This is good stuff, you just need to know it’s there and use it correctly.  Here’s what you need to know:

There are three phone fields, (Home Phone, Mobile Phone and Work Phone) and three email fields, (Personal Email, Work Email and Alternate Email) created when you install the package.  Also, you will see Preferred Phone and Preferred Email and finally, there are fields called simply: Phone and Email.  The idea is that you populate the home phone, work phone, personal email, work email etc. fields and then indicate (in the Preferred Phone and Preferred Email fields which phone or email address you want to be the ’preferred’ (OK, that was obvious) or primary phone or email address used for communications. 

Don’t put the Phone or Email fields on your layouts; these shouldn’t be manually updated, they will be populated by what’s selected in the Preferred Phone/Email fields.  Also, if you are importing data, don’t import directly into the Phone/Email fields; import data into the Home Phone, Work Phone, etc. fields and then be sure to also import data into the Preferred Email/Phone (npe01_Preferred_Email__C, nep01_Preferred_Phone__C) fields so SF knows which phone or email to use for the Email/Phone fields.

The Email or Phone number you choose in the Preferred Email/Phone is used when you use the “Log a Call” or “Send an Email” buttons.  I would also assume this would be the email used if you were doing a mass email through Vertical Response or another provider, but I haven’t tested this yet. 

For more on this topic, see this Google Group discussion: http://groups.google.com/group/npsf/browse_thread/thread/81c8399e1c4280b/

Follow

Get every new post delivered to your Inbox.