<< December 2016 | Home | February 2017 >>

Salesforce week 11

First week on "the job" brought me to the customer I'll most likely be assigned to in Stockholm. I spent Tuesday to Thursday there and have already delivered something that will go into production in a couple of weeks. Both exciting and scary... The week was basically spent learning about the project, the phases, deliverables and a whole slew of new terminology. All good stuff. Nothing much else to report for now besides Stockholm being a nice city.

What did I learn

  • Some customers actually use Salesforce Lightning
  • What's it's like being thrown in mid-project
  • That I will stay at 3 different hotels in Stockholm over the next weeks

Status after this week

Trailhead points: 70400
Trailhead badges: 70
Certifications: 4 (Salesforce Certified Administrator, Salesforce Certified Platform App Builder, Salesforce Certified Advanced Administrator, Salesforce Certified Sales Cloud Consultant)

Tags :

Salesforce username/password OAuth flow against a sandbox

We had issues today because our OAuth password flow wouldn't work against one of our sandboxes although the code worked against production. Instead we got this error:

{"error":"invalid_grant","error_description":"authentication failure"}
After Googling and finding this thread it turned out that when using the username/password flow against a sandbox you have to either relax IP restrictions for login or authenticate against test.salesforce.com instead of login.salesforce.com (which of course makes sense).

Below is curl commands for using the username/password flow against a sandbox:

$ curl -d "grant_type=password \
   &client_id=3MVG9X0_oZyBSzHrnzENlR...JSDz0_MiwxyieREuBhtgZJrF7Lzx8542TFpU_ \
   &client_secret=6235860963257688256 \
   &username=mikkel.heisterberg%40example.com.sandboxname \
   &password=Passw0rd.SecurityToken" https://test.salesforce.com/services/oauth2/token
{"access_token":"00D6E000000Cpmu!AQ0AQIj4...cGCRqmNnYc6dmgLT09VNoIFXJtHvsPGLqrBs0VlK",
   "instance_url":"https://someaddress.my.salesforce.com",
   "id":"https://test.salesforce.com/id/00D6E000000CpmuUAC/0056E000000OCcCQAW",
   "token_type":"Bearer","issued_at":"1485850119972","signature":"malODIaSULh1siHzdw...pHKjBpWoQcm66UQ="}

$curl -H 'Authorization: Bearer 00D6E000000Cpmu!AQ0AQIj4...cGCRqmNnYc6dmgLT09VNoIFXJtHvsPGLqrBs0VlK' \
   https://test.salesforce.com/id/00D6E000000CpmuUAC/0056E000000OCcCQAW
{"id":"https://test.salesforce.com/id/00D6E000000CpmuUAC/0056E000000OCcCQAW",
   "asserted_user":true,"user_id":"0056E000000OCcCQAW","organization_id":"00D6E000000CpmuUAC",
   "username":"mikkel.heisterberg@example.com.sandboxname","nick_name":"mheis",
   "display_name":"Mikkel Heisterberg","email":"mheisterberg@foo.com","email_verified":true,"first_name":"Mikkel",
   "last_name":"Heisterberg","timezone":"Europe/Paris","photos":{"picture":"https://someaddress.content.force.com/profilephoto/005/F",
   "thumbnail":"https://someaddress.content.force.com/profilephoto/005/T"},"addr_street":null,"addr_city":null,"addr_state":null,
   "addr_country":null,"addr_zip":null,"mobile_phone":"+45 12345678","mobile_phone_verified":true,"status":{"created_date":null,
   "body":null},"urls":{"enterprise":"https://someaddress.my.salesforce.com/services/Soap/c/{version}/00D6E000000Cpmu",
   "metadata":"https://someaddress.my.salesforce.com/services/Soap/m/{version}/00D6E000000Cpmu",
   "partner":"https://someaddress.my.salesforce.com/services/Soap/u/{version}/00D6E000000Cpmu",
   "rest":"https://someaddress.my.salesforce.com/services/data/v{version}/",
   "sobjects":"https://someaddress.my.salesforce.com/services/data/v{version}/sobjects/",
   "search":"https://someaddress.my.salesforce.com/services/data/v{version}/search/",
   "query":"https://someaddress.my.salesforce.com/services/data/v{version}/query/",
   "recent":"https://someaddress.my.salesforce.com/services/data/v{version}/recent/",
   "profile":"https://someaddress.my.salesforce.com/0056E000000OCcCQAW",
   "feeds":"https://someaddress.my.salesforce.com/services/data/v{version}/chatter/feeds",
   "groups":"https://someaddress.my.salesforce.com/services/data/v{version}/chatter/groups",
   "users":"https://someaddress.my.salesforce.com/services/data/v{version}/chatter/users",
   "feed_items":"https://someaddress.my.salesforce.com/services/data/v{version}/chatter/feed-items",
   "feed_elements":"https://someaddress.my.salesforce.com/services/data/v{version}/chatter/feed-elements",
   "custom_domain":"https://someaddress.my.salesforce.com"},"active":true,"user_type":"STANDARD","language":"en_US","locale":"en_US",
   "utcOffset":3600000,"last_modified_date":"2017-01-26T13:49:33.000+0000","is_app_installed":true}

Arlanda Express app

These weeks - and probably through the end of the year - I'm going quite a lot to Stockholm so like any respectable geek I'm trying my best to make my travels more productive and easier to manage. Flying is easy - booking is all online and trips, boarding cards and receipts are managed entirely mobile. Easy. Next was hotels - also easy using existing apps except for the actual check in process.

This Monday I found the Arlanda Express app. Excellent!! Tickets are bought and paid in the app using saved credentials unlocked using a pin code. Once bought a receipt is emailed to you and it can be easily added to Concur for expensing. The ticket and the return ticket is saved in the app so no more stubs to keep track of. Nice.

Arlanda Express by A-Train AB

Quick CLI aliases for Salesforce instance info

Today when at a customer we were trying to figure out the release versions the various sandboxes and development environments and compare this info with the version of the production instance. Of course all this is available from status.salesforce.com but clicking around got a bit tedious so I whipped up a quick set of bash aliases for the Terminal. Since the output is also available as JSON it was pretty easy. First I grabbed the jq JSON parser for bash and then I wrote 4 aliases for bash:

  • sf_instance - returns the instance ID (e.g. "na44") from the hostname. This is useful if you are using a custom domain to access the instance e.g. lekkim-trailhead-dev-ed.my.salesforce.com
  • sf_release - shows only the release the instance is on e.g. "Spring '17 Patch 5.5"
  • sf_status - shows release version, whether active or not and type of instance (production, sandbox etc)
  • sf_status_raw - returns the raw JSON
Below are examples of usage and the ailases are at github.com/lekkimworld/sf_aliases.
$ sf_help
Salesforce CLI actions:
-----------------------
- sf_status
  Shows status for instance ID
  Syntax : sf_status 
  Example: sf_status na44

- sf_release
  Shows release version of supplied instance ID
  Syntax: sf_release 
  Example: sf_release na44

- sf_instance
  Get instance ID from hostname
  Syntax: sf_instance 
  Example: sf_instance org62.lightning.force.com

- sf_status_raw
  Shows raw JSON
  Syntax: sf_status_raw

------------------------
$ sf_instance na44.salesforce.com
na44
$ sf_instance lekkim-trailhead-dev-ed.my.salesforce.com
eu11
$ sf_release eu11
Winter '17 Patch 18.10
$ sf_release na44
Spring '17 Patch 5.5
$ sf_status eu11
Release Version : Winter '17 Patch 18.10
Active          : true
Status          : OK
Environment     : production
$ sf_status cs85
Release Version : Spring '17 Patch 6
Active          : true
Status          : OK
Environment     : sandbox

Salesforce week 10

Week 10 it all started to get real... All in all my last quiet week. I actually met my manager in person (she's based in Amsterdam) and I spent more time playing with the Salesforce platform with a specific focus on Service Cloud, Lightning and Salesforce Lightning Design System (SLDS). I also got my first customer project in Stockholm which will be fun. With the planning on my first customer visits came fun experiments planning flights, hotels etc. All good fun.

What did I learn

  • Service Cloud is easy to set up and one can actually do a very nice, full featured, call center implementation in about 1 hour
  • The Service Cloud Console is actually not Lightning although it looks pretty similar
  • Page Layouts needs to be feed based to look Lightning-like for the Service Console

Status after this week

Trailhead points: 70400
Trailhead badges: 70
Certifications: 4 (Salesforce Certified Administrator, Salesforce Certified Platform App Builder, Salesforce Certified Advanced Administrator, Salesforce Certified Sales Cloud Consultant)

Tags :

Salesforce week 7-9

Wow! Time is starting to fly by. Week 7 I took vacation and relaxed by taking time off between Christmas and New Years. I got back into the office on Tuesday following New Years Eve and promptly started studying for my Salesforce bootcamp. The bootcamp is in San Francisco and I spent all of week 7 preparing and studying for that. We are very much into gamification as is obvious if you've ever visited Trailhead. I flew off to San Francisco on Friday and spent all of Saturday and Sunday settling in and watching a lot of NFL. It was Wildcard Weekend so we had 2 games on Saturday and 2 games on Sunday. Excellent!! It also gave me a good excuse to sit in the bar with my laptop, a beer and NFL. What's not to like?!

Week 9 was spent in San Francisco for the bootcamp. Monday was Becoming Salesforce which is basically culture emersion and learning about the Salesforce Way including volunteering. Tuesday to Friday was bootcamp with sessions, group assignments and presentations. We also went to go on a tour to the various Salesforce buildings in San Francisco - pretty cool!! In the evenings when we got back to the hotel around 7pm it was hanging out in the bar with the other participants from all over the World (India, Australia, Germany, Netherlands, US, Denmark and the UK to name a few). Then off to have dinner and more beer before bed. All good fun and a great experience. It did rain all week however but we didn't have time to be outside really so it didn't matter much.

What did I learn

  • When it rains it pours in San Francisco
  • Cmd-Enter submits a Chatter post in Salesforce Lightning - so happy as it is sorely missing in Salesforce Classic
  • Uber is really cool
  • Apparent Embagadero is a pretty long walk from Fishermans Wharf

Status after this week

Trailhead points: 65550
Trailhead badges: 67
Certifications: 4 (Salesforce Certified Administrator, Salesforce Certified Platform App Builder, Salesforce Certified Advanced Administrator, Salesforce Certified Sales Cloud Consultant)

Tags :

.gitignore for MavensMate

Note to self... Exclude the workspace and project files as well as /config from Git so a .gitignore file should be something iike this:

*-project
*-workspace
config
So in bash something like:
$ echo \*-workspace > .gitignore
$ echo \*-project >> .gitignore
$ echo config >> .gitignore