Hello Jivers,

Recently we have been working on migrating from Jive 7.0.1 hosted instance to jive cloud.

Happy to say we are very very close to finally achieve this with all our customisations.


Before I talk about the particular solution here, I must say I had a fun ride working on Jive platform since more than 2 years now.

Working with this platform since jive 5.x, 6.x, 7.x and now cloud, things have changed a lot and improved.

Appreciate the effort jive folks have put in improving the platform which has personally helped me design and implement better solutions.


In 2013, we had a complex but successful integration between jive and google group with help of streamonce.

Well, not the default one, but a custom streamonce made for Thoughtworks.


In Jiveworld 2013, we had showcased this concept in customer showcase.




I will mention more about this in a separate post.

To work properly, streamonce service required some setup to be done for every group.

Some of them being, admin owning a google group and then manually map it to jive using streamonce app.

We wanted to avoid all the extra steps to achieve this integration and instead keep it simple for end user - just create a jive group.


So I designed a solution for this called google connector and we created a plugin for this.


This plugin use to create  / disable google groups and add/remove members from google group on some triggers from Jive.

And as this was a plugin, we could control the jive events triggering these actions on google and also block jive from performing some things if there was error from google.

We wanted to move to cloud to take advantage of the latest features and improvements announced.

The blocker was the plugins we had which are not supported in cloud.

We managed to convert most of the plugins into apps, all thanks to jive-sdk.

My move content app  was one of the first attempts where I could develop an app with simple jquery and jive-sdk. (Developer: Jive add-on to move content in bulk ... | Jive Community)


Here I would like to tell about one of these apps.


Why we wanted to control Jive's create group flow?


On our jive instance, we have connected every jive group with a google group.

We still have some old google groups with no connection to jive.

But new groups are all mapped.


Our plugin on hosted instance right now always creates a google group when a user is trying to create a jive group.

And streamonce auto mapper maps these groups so that it can handle the sync between the two worlds.

So for a end user, there's just a step of creating jive group. Beyond that everything is setup automatically.


Now this was very easy in hosted due to plugin.

It helped us handle some cases like - if google throws an error, user should not be able to create jive group.

Or if there is some conflict in google, user should know it.

And user should still be able to manage everything from one jive group instead of going to google groups console or streamonce app.

We have developed apps in jive which helps map jive membership with google. More on that soon


In cloud, there are no plugins and hence no way to customise the create group flow.

We had an option though to use Create Group event from jive webhooks service.

Basically when we receive an event that a jive group is created, our service creates a google group.

But what if there is a conflict in google group (due to some very old groups or some aliases our users have in their email accounts?)

What if the service goes down which is responsible for creating the google group?


For end user, he will see a success on jive side, and so he assumes everything is setup.

Only later they realise its not working as expected (sad user experience).


We wanted more control in create group flow.

The only option was to create a new app for this.


But then user will have two ways to create group.

So, I decided to hide the default option on cloud.


Disabling the default create group flow in jive cloud


Actually we cannot do this type of customization of hiding this feature.

But there is one easy way in this case. I changed the permissions for create group as shown in the image below.

Screen Shot 2015-02-19 at 7.00.40 PM.png


Wow, that was easy. So no create group option any more, anywhere on the site.

But I still want to ensure an end user has an ability to create a group

and he should be the owner

and google group created

and streamonce mapping should all be set....


Given the above permissions, what a user might go through now?


  1. Send a request to admin to create group with name, url name, description, group type, etc.
  2. The super admin receives the request,
  3. The super admin tries creating a google group first.
  4. If that goes well, he creates the jive group.
  5. All well? then he makes the requestor the owner of the new jive group, and removes himself (super admin) from the list of owners .
  6. Admin notifies user that groups are created and he can start using it.

And he can start adding people, start sharing stuff, etc..



Obviously this is not cool, user wants self service


Thats too much manual work and worst user experience in today's world.

But what if we automate the above process?

For end user it still the same experience, but all the above steps are taken care by a new app

First, thanks a lot to jive-sdk,  Jive #REST-api and Jive #connects-api

Now the solution.


The new Create group app

So going back to the above steps and how they look in our new app.


1. User sends a request, well thats in technical terms.

For end user, there is still a view like the default one where a group details can be entered and submitted.

The app auto-generates the group url the same way as it happens on default flow.


Here's now the difference in what a super admin and other users see in create menu.

Screen Shot 2015-03-07 at 4.31.37 PM.png



Here's the new app. its almost similar to default create group popup, but with minimal options.


 2 Actions   myThoughtWorks.png



2. Now we have configured our service endpoint in jive add-ons services console and used connects api to send request.

So through this the service received the request (the service is in the same node server where the app is deployed and has super admin privileges as it was registered with jive oauth)


3. This service now attempts to create a google group using google apis.

The group url of the jive group is used to create the email address.


var groupEmail = groupUrlName+emaildomain;
  auth: jwt,
  resource: { email: groupEmail }
  }, function(err, data){



4 On success, this service calls jive apis through jive-sdk and creates a group there too.


      var jive = require('jive-sdk')
      var data = {
            "type": "group",
            "displayName": displayName,
            "description": description
            "name": name,
            "groupType": groupType
        var placeServiceUrl = "https://jive_url/api/core/v3/places"

                url: placeServiceUrl,
                "method": "POST",
                "postBody": data
        ).then(function (response) {



Streamonce auto mapper in a while maps these new detected groups in google and jive.

If any thing goes wrong in google or jive, service reverts the state and responds back with an appropriate message.


5. Now the service adds the requesting user as an owner to the group and removes the super admin account which created the group.


    jive.community.doRequest(community, {url: groupMembersResourceUrl,
            "method": "POST",
            "postBody": {"person": userResourceUrl, "state": "owner"}
    ).then(function (resp) {




6. The user gets a success message, a tip on how to add users, etc and is then navigated to the new group.


 1  Actions   myThoughtWorks.png


Life moves on.


So what are the awesome jive features used for this app?

  • Jive-sdk, REST apis and jive connects api



What about other settings on group? External Storage? Default page?

Group admins can still do this after the group is created.

In the last image above, the link "Go to new group" can be changed to go to the settings page instead where user can do these settings first.


In our case most of our users end up doing this at a later stage.

The main objective for most of our users is fulfilled here which is - they need to create a group and start sharing / collaborating through jive and emails.


Due to the permission changes, there is one thing a group admin cannot do - changing the group type (private to open, open to .... etc)

We anyway have a plan to create an app for that too as these settings control some permissions on google group too.

Basically our apps have been ensuring the changes made by user has right impact on jive and google.


Why not use Create Group webhook event?

That obviously was my first option. But i wanted a control when the create group event is in progress, not after it has happened.

Consider a case where something goes wrong on google side, if a specific email id is not available, or if google group not created due to node server shutting down?

The jive group is already created and user obviously starts using it, only to realize later something is wrong.

Many other cases.

Like what we had in the plugin where I had control when event is in progress, I needed the same control in app.


What advantage does jive connects give here?

I think I have overused this in most of my apps.

We can develop any service with our own authentication strategy.

Jive gives facility for all these auth types in admin console app services.

My app does not really have to care about service auth or url.

So tomorrow if I decide to change the service end point, i can do it independent of the app.


Also, by moving most logic to service, I could have build pipelines, easily auto deploy stuff to prod, run tests, etc for the service. A well tested and automated setup.

What exactly is the custom streamonce? and why we need all this customization?


Thats a long answer, worth a separate blog (already in process).

I will soon post the entire customization we did with jive-sdk and REST apis for this jive-email integration.


But in short about #streamonce, the default streamonce makes jive a hub and gets outside information into jive.

Jive still generates it own emails for discussions, which are more like notifications.

Both jive and gmail are equally important for our users.

We wanted emails to be emails and not notifications. And also a complete 2 way sync betweeb jive and streamonce.

The default streamonce does a 2 way sync for comments, but conversation has to be initiated from google groups.

In our case, it does not matter where it was initiated. Its real 2-way sync. content created in both the systems gets synced.


How can this solution be improved?


It would have been great if Jive has given the option to hide default create group option without the permission changes I had to do.

In this case I could have used REST apis "run-as" feature to create group from my service.

I had to do this permission change just to hide the link, which resulted into using a service account to do all stuff and then add user as owner.


Other one is not directly impacting the app.

But it would be great if Streamonce itegrations can be managed through apis.

Apis can give us or anyone else better control on these integrations.


Not sure if Jive can allow the hiding link option without permission changes in cloud.

But for streamonce, we have already given a feature request with a list of apis.


Source Code for app and service ???


Will be uploading it to github in a few days time.