WorryFree Computers   »   [go: up one dir, main page]

Editor's Note: Brent Frei is founder and chairman at SmartSheet. Smartsheet makes an online project management solution that employs a spreadsheet-like interface on top of a powerful work automation engine. We invited SmartSheet to share their experience with the Google Apps Marketplace.

The Challenge

Last summer, the Smartsheet team had what I expect is a fairly typical Software as a Service (SaaS) company priorities discussion: should we integrate with one of the big application marketplaces? Here are some of the questions we considered:
  1. Are our customers asking for it?
  2. Will it give us access to a significantly larger lead flow?
  3. Do the people that use these apps typically pay for them?
  4. Would our target customer expect to find our type of tool there?
  5. What does the competition look like on each platform?
  6. What is the scope of the development effort?
Then, do the answers to any of these choices outweigh the benefits of the alternatives on our broader list of priorities?

Decision Time

Google Apps seemed to rank highly across all 6 criteria. Of the dozen major application marketplaces competing for ISV mindshare, Google Apps seemed to be the most natural 'upstream app' from Smartsheet. Google Apps customers were most likely to 'look next' toward solutions that are addressed by our application.



Weaving SmartSheet collaboration and workflow features in amongst the Google Apps was a very natural fit for our users. As you can see in the video, the familiar spreadsheet-like interface and direct access from the Google menu bar makes Smartsheet an effective companion app. The integration of Smartsheet with Google Apps turns the combination into the company's operating software.

It was therefore fortunate that the Google Apps APIs proved to be just as natural a fit. Well done, well documented, easy to implement and, as we later discovered, solid developer support.

The Details

Once the decision was made, we dedicated one senior architect and one product manager to designing and delivering the integration. It required about 4 days of technical investigation to validate the design concepts. The Google Apps API documentation and developer support were first rate, which made the delivery nearly as easy as the design.

Virtually every part of Google's application stack had a natural fit within our customer's common workflow.

  1. Universal Navigation and Single Sign-on
  2. Move Data to and from Google Spreadsheets
  3. Attach Google Docs to Any Row
  4. Open any attached file as a Google Doc
  5. Synchronize Contacts
  6. Display & Manage dates between Sheets & Calendars
  7. Share individual parts of the sheet via Gmail
We divided the development into two phases based largely on the availability of the specific Google Apps APIs. Mail and Calendar were phase 2, everything else was phase 1. We had a single, mostly dedicated developer for the effort.

Stage 1

We first implemented single-sign-on via OpenID and Google Docs API integration using OAuth for standard Google Accounts. This included data import/export, attaching Google Docs to rows, uploading office documents to Google Docs, and importing Contacts. We then extended this integration to support Google Apps users. These features were rolled out in Q3 of 2009, well in advance of the Google Apps Marketplace launch. It took a senior developer roughly 6 weeks to implement this first stage. With the core integration features completed, we were able to quickly implement new Apps Marketplace functionality, including Universal Navigation and the Licensing API, as they were made available in the sandbox.

Stage 2

We are developing full-featured Google Calendar integration, utilizing both the Google Calendar Data API and Calendar Event Gadgets, to be delivered in May 2010. Gmail integration will follow quickly, utilizing both the OAuth access to IMAP and SMTP and Gmail Contextual Gadgets. With the experience we have integrating other APIs, the development of these features is greatly simplified, as the infrastructure – implementation of OpenID, OAuth, and the GData Java Client Library – is already in place.

The Mechanics

We chose to enter three variations of Smartsheet into the Google Apps Marketplace: two mainstream solutions and one emerging technology solution.

Mainstream:
  1. Smartsheet Sales Pipeline for Google Apps
  2. Smartsheet Project Management for Google Apps
Emerging Technology:
  1. Smartsheet Crowdsourcing for Google Apps
The decision to start with the Project Management and Sales Pipeline applications was based on the belief that they would have the broadest appeal to two Google Apps customer types: Small Businesses and Large Scale Education customers.

We included Smartsheet Crowdsourcing as a test of an entirely unique product that pushes an emerging trend.

The Results

Google Apps Marketplace has performed very well across several of Smartsheet's key performance indicators.

Strong Leads - the percentage of signups that accrue a statistically significant quantity of behavioral actions within the application. A strong lead is highly correlated with an eventual paying customer.
Convert to Paid - the percentage of total leads that eventually become paying customers.
Average MRR - Monthly Recurring Revenue is the average monthly spend of the leads that become paying customers.


The statistics are fantastic, and have improved the profitability of our customer acquisition programs significantly. Today, we get "free" leads generated by SEO, PR and buzz (Non-Paid). These are the Holy Grail source of profitable customers. We add $2,160 a month in recurring revenue for every 1,000 leads that come in via non-paid channels. At $1,740 a month per 1,000 leads, Google Apps Marketplace is also a very profitable channel that brings up the overall averages (subtract the 20% Google is planning to charge for Apps customers).

None of the statistics above matter without lead volume to power them. That's where the Google Apps Marketplace really makes these numbers sing. We've seen a very meaningful increase in high quality, non-paid lead flow directly attributable to Google Apps customers.


Our customers cite Smartsheet's tight integration with Google's Data APIs as a key factor in their decision to purchase. A common theme emerging in the feedback is reflected in this comment from a manufacturing company president: "Smartsheet is making the Docs component of Google Apps more useful to our team."

Moving Forward

Customer requests for features and enhancements to our Apps integration have already started pouring in. They are great guideposts toward attracting a larger percentage of these great Apps users.

The Google Apps Marketplace is a rich source of customers, so staying above the noise as it attracts more ISVs will be a priority. We're confident we can continue refining our product and services to deliver a superior solution. And, we'll count on the Google team to value customer success and application utility as primary criteria for rating and ranking the vendor directories.

The Google Apps Marketplace team will be hosting a series of upcoming events to help you learn how to sell your cloud application on the Marketplace and reach the 25 million Google Apps users at 2 million businesses.

Webinars

Overview of the Google Apps Marketplace

This webinar will provide an overview of the Google Apps Marketplace, the value of integrating applications with Google Apps apps and the process of integrating, testing and selling your application. We’ll show some example integrations and leave plenty of time for Q&A.

Wednesday 4/28 @ 9am PDT (12pm EDT, 4pm GMT)
Register here.

Wednesday 5/5 @ 4pm PDT (7pm EDT, 11pm GMT)
Register here.

Marketing Best Practices for Launching your Marketplace App

Since we launched the Google Apps Marketplace last month, we’ve been pleased to see a growing number of developers launching products and finding phenomenal success selling integrated apps to Google Apps customers. In this webinar, we’ll cover the most critical tactics for generating installs of your app based on our learnings from apps that have already launched as well as some ongoing marketing tactics for you to pursue.

Thursday 4/29 @ 10am PDT (1pm PDT, 5pm GMT)
Register here.

Office Hours

Office Hours with Engineering and Marketing teams

Are you already building your application on the Google Apps Marketplace and have questions about your integration or launch for the Google Engineering or Marketing teams? Stop by our virtual office hours and chat with us via Wave.

Wednesday 4/28 @ 2pm PDT (5pm EDT, 9pm GMT)
No registration necessary, but you must have a Wave account to join the discussion on Wednesday!

Tuesday 5/4 @ 9am PDT (12pm EDT, 4pm GMT)
No registration necessary, but you must have a Wave account to join the discussion on Tuesday!

If you don’t yet have a Wave account, sign up here at least a day advance to make sure your account is ready.

We hope you can join us for one of the webinars or office hours!

Updates: Fixed the date of the first office hours to be Wednesday 4/28.

Since we launched the Google Apps Marketplace last month, we’ve been pleased to see a growing number of developers launching products and finding phenomenal success selling integrated apps to Google Apps customers. As more ISVs enter the Marketplace, we want to make sure we see this success continue and accelerate.

Next week, we’ll be hosting a webinar detailing best practices for a successful launch in the Marketplace. We’ll cover the most critical tactics for generating installs of your app based on our learnings from apps that have already launched. We’ll also cover some of the extras you may want to consider to get added mileage out of your launch, as well as ongoing marketing tactics for you to pursue.

Whether you’re totally unfamiliar with the Marketplace, currently developing an app, or have already launched an app in the Marketplace, this webinar should help you maximize your chances of successfully launching an app in the Marketplace. Please join us!

Best practices for a successful launch in the Google Apps Marketplace
Thursday, April 29, 2010 - 10:00 a.m. PDT / 1:00 p.m. EDT / 6:00 p.m. London
Register here for the Webinar.

Editor's note:Navin Kumar is CTO and co-founder of Socialwok, a feed-based group collaboration application for enterprises that integrates with Google Apps. With Socialwok, Google Apps users can create their own private social network to share Google Docs, Calendars and Spreadsheets with their coworkers. Navin and his team built Socialwok on Google App Engine for Java, Google Web Toolkit and Google GData APIs. Socialwok will be at the Google IO sandbox May 19 - 20, 2010.

At Socialwok (http://www.socialwok.com/tour), we work extensively with a wide variety of Google technologies (Google App Engine, Google Web Toolkit), OpenID, OAuth, and Google Data APIs (Google Docs, Google Calendar, Google Spreadsheets, etc...) while building our product.

Sharing and Previewing Google Docs in feeds

Most enterprise microblogging or collaboration solutions exist in their separate walled garden. Users have to use separate logins and post status updates independently of their existing workflow. From the start, we designed Socialwok to be integrated with the workflow of businesses who use Google Apps. Users can use their existing Google Apps or Gmail accounts to login into Socialwok. They can access all features of Socialwok from right inside Gmail. They can also create and share their existing Google Docs (Documents, Presentations, Spreadsheets) and Google Calendars with other coworkers who are following them in a feed.

In the below example, I upload a Microsoft Powerpoint (ppt) to Google Docs for sharing in a feed.

Uploading a Microsoft Powerpoint file for sharing using Google Docs
Google Docs automatically converts the Microsoft Powerpoint to a Google Presentation that can be previewed from right inside Socialwok. By clicking the preview option, we preview the Google Presentation in a new tab.

Successful posting of the Google Presentation shared in a feed
Previewing the Google Presentation from the Socialwok web using the Google Data API

Using Google Docs viewer to preview Google Docs, PDF, PPT, XLS in Socialwok Desktop and Mobile Web

Another really cool feature introduced in our recent release is the ability to preview Google Docs, PDF, PPT, or XLS files directly in the Socialwok web interface with no download required. Using the Google Documents Viewer, our users can preview any Google Document, pdf, ppt or XLS directly from their desktop web browser or their HTML5-capable WebKit mobile browser (iPhone and Android).

Preview of a shared pdf document from Socialwok's desktop web application using the Google Docs Viewer
The same applies to other common file formats like Adode Portable File (pdf), Microsoft Excel (xls) and other Google Docs supported formats. Socialwok provides businesses with cloud based access to their office documents from both the web and the mobile (HTML 5).

Preview of a shared pdf document using Google Docs viewer from Socialwok's HTML 5 mobile web page

Sharing Google Docs using the Google Data APIs

We use the Google GData APIs to upload the document, and then proceed to attach it to a new Socialwok status update. The latest version of the Google GData Java APIs work great on Google App Engine Java, with almost no configuration. Now, before accessing and manipulating Google Docs or Calendar from the GData APIs, we must make sure that we have authentication credentials for the current user. Our application stores the existing user in the session. Here's how we do that using the low-level Java datastore APIs.
Entity currentUser = (Entity) httpRequest.getSession()
.getAttribute("userObject");
Each Google Apps or Google Accounts user actually logs in to Socialwok using their own Google authentication credentials. We accomplish this using the Hybrid Step2 OpenID/OAuth authentication flow. You can learn more about this flow here. From this flow, we gain the users credentials via OAuth, and store the OAuth token and token secret in another child object of our user:
Query query = new Query("GoogleAccount", currentUser.getKey());
Entity googleAccount = dataService.prepare(query).asSingleEntity();
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(
oauthProps.getProperty("google.consumerKey"));
oauthParameters.setOAuthConsumerSecret(
oauthProps.getProperty("google.consumerSecret"));
oauthParameters.setOAuthToken(
(String) googleAccount.getProperty("oauthToken"));
oauthParameters.setOAuthTokenSecret(
(String) googleAccount.getProperty("oauthSecret"));
We now use the Google Docs GData APIs to upload the document. Google GData APIs use Atom Feeds to retrieve and upload new information into existing Google Services like Google Docs. For Google Docs, this involves using the MediaStreamSource API.
DocsService service = new DocsService("Socialwok-v1");
service.setOAuthCredentials(oauthParameters,signer);

MediaStreamSource streamSource = new MediaStreamSource(fileInputStream,
contentType);
streamSource.setName(filename);
DocumentListEntry inserted = service.insert( new URL(
"http://docs.google.com/feeds/default/private/full/?convert="+
doConvert), DocumentListEntry.class, streamSource);
Notice the URL used for uploading the Google Doc. This is a universal URL for uploading new files to Google Docs. The convert parameter is actually very important; it determines whether the file will be converted to a new Google Doc (Document, Presentation, Spreadsheet), or will be uploaded as an arbitrary file without any conversion.

Previewing Google Docs using the Google Data APIs

After uploading the presentation to Google Docs, sometimes another user who is following you would like to preview that presentation quickly without having to fully open Google Docs in order to see the file. To do this, we examine how the actual Google Docs interface previews documents. Each of the 3 different types of Google Docs has its own specific viewer or previewing mode url to simply view the files.

For documents, when you are in the editor, if you click "View," and then click "Webpage preview." You will then get your Google Doc displayed as a webpage. The URL of this "viewer" is:
https://docs.google.com/a/socialwok.com/View?docid=0Adnk...dkZmNoOTIyNQ
For reference, the editor link for this document is:
https://docs.google.com/a/socialwok.com/Doc?docid=0Adnk...dkZmNoOTIyNQ
As you can see the transformation between these 2 URLs is quite simple. Therefore we can perform the following to actually bring up a viewable Google Doc in Socialwok.
  1. Get the Google Docs entry from the datastore.
    Entity fileAttachment = datastoreService.get(attachmentKey);
    String entryId = fileAttachment.getProperty("fileId");
  2. Get the Google Docs entry from the Google Docs GData Service.
    URL entryUrl = new URL(entryId);
    DocumentListEntry docEntry = service.getEntry(entryUrl,
    DocumentListEntry.class);
  3. Get the document link from the Google Docs Entry
    String docLink = docEntry.getDocumentLink().getHref();
  4. Convert the link to the viewer.
    if (docEntry instanceof DocumentEntry) {
    docLink = docLink.replace("/Doc","/View");
    }
It's important to note that since Socialwok uses your Google Apps or Gmail account to login through OpenID, you are already logged into Google services. In Socialwok, you can click the Mail, Calendar, or Docs links to access each of those Google products. Because of this authentication, it's very easy for us to place this link into an <iframe> tag and embed this in our Socialwok interface. Here's the GWT code to do just that:
import com.google.gwt.user.client.ui.Frame;
...
Frame viewerFrame = new Frame();
viewerFrame.setUrl(docLink);
viewerFrame.setHeight("500px");
viewerFrame.setWidth("600px");
containerWidget.add(viewerFrame);
Here's are the different Google Docs editor to viewer mappings, with the changes highlighted:



Document TypeActionURL
DocumentEdithttps://docs.google.com/a/<domain>/Doc?docid=...
DcumentViewhttps://docs.google.com/a/<domain>/View?docid=...
PresentationEdithttps://docs.google.com/a/<domain>/present/edit?id=...
PresentationViewhttps://docs.google.com/a/<domain>/present/view?id=...
SpreadsheetEdithttps://spreadsheets.google.com/a/<domain>/ccc?key=...
SpreadsheetViewhttps://spreadsheets.google.com/a/<domain>/lv?key=...

Previewing PDF, PPT, and XLS files using the Google Document Viewer

Google Docs has a fantastic feature that lets users preview any PDF,PPT, XLS, or TIFF file via a HTTP link. You can try the viewer out at http://docs.google.com/viewer. If you look at the bottom of this page, there is information on how to construct your own URLs so that you can either link or embed the viewer in your own web sites. Here's the rundown on the parameters:

Technical Documentation - Instructions for building your own URLs
All viewer URLs should use the path http://docs.google.com/viewer . This path accepts two parameters:
url : The URL of the document to view. This should be URL-encoded.
embedded : If set to true , the viewer will use an embedded mode interface.

For example, if you wanted to view the PDF at
http://labs.google.com/papers/bigtable-osdi06.pdf,
you would use the URL:
http://docs.google.com/viewer?url=http%3A%2F%2Flabs.google.com%2Fpapers%2Fbigtable-osdi06.pdf

We will use the embedded parameter to display the viewer in our own interface. To construct the URL to the embedded viewer with the example given by Google, we get the following:
http://docs.google.com/viewer?url=http%3A%2F%2Flabs.google.com%2Fpapers%2Fbigtable-osdi06.pdf&embedded=true
We can then place this URL in an <IFRAME> element to embed the viewer in our application.
<iframe src="">http://docs.google.com/viewer?url=http%3A%2F%2Flabs.google.com%2Fpapers%2Fbigtable-osdi06.pdf&embedded=true" style="width:600px; height:500px;" frameborder="0"></iframe>
Here's how to create the same using the GWT Frame widget in Java.
import com.google.gwt.user.client.ui.Frame;
...
Frame viewerFrame = new Frame();
viewerFrame.setUrl("http://docs.google.com/viewer?url=http%3A%2F%2Flabs.google.com%2Fpapers%2Fbigtable-osdi06.pdf&embedded=true");
viewerFrame.setHeight("500px");
viewerFrame.setWidth("600px");
containerWidget.add(viewerFrame);
As you can see, it's really quite easy to use the embedded Google Document Viewer. You can check out more information on the Google Document Viewer on the Google Docs blog.

Extending Socialwok using our APIs. Meet Socialwok at Google IO

The above example of sharing and previewing Google Docs using the Google Docs viewer is the result of developers pushing the envelope using Google App Engine with the ever expanding suite of Google APIs. Here at Socialwok, we continue to challenge ourselves in creating innovative web services that leverage on all that cloud computing has to offer. We will continue to have more features and integrations in the future, and we will be opening up Socialwok's APIs for developers in the next few months. You can follow all these developments at our official blog http://blog.socialwok.com.

We would love to hear from fellow developers who would like to create applications to extend Socialwok; please email us at info@socialwok.com.

Socialwok will be at Google I/O in the Developer Sandbox in May where we will be giving demos of a new major add-on service to Socialwok. If you would like a demo, email us at info@socialwok.com and drop by the Socialwok demo station at Google I/O.

Editor's Note: This post was written by Gilad Goraly from ScheduleOnce, a company that provides meeting scheduling solutions for Google Calendar. We invited ScheduleOnce to share their experiences building an application on top of Google Apps utilizing some of our APIs.

ScheduleOnce provides meeting scheduling solutions for organizations using Google Apps. Our solutions extend Google Calendar to support cross-organizational scheduling and include private labeling and robust scheduling features. Since our solution is not a standalone application but an add-on to a calendaring and messaging platform, we were looking to integrate it with a platform that is open and inviting for third party vendors. Google Apps was the natural choice.

Google Calendar does a great job when it comes to scheduling meetings with members inside the organization. The free/busy view allows you to see attendee availability and select a time that is good for all. But what do you do when the meeting involves one or more external attendees? With ScheduleOnce it is possible to see the availability of all attendees, both internal and external, across domains, in one simple free/busy interface. The meeting organizer then selects a time and schedules the meeting. It is that simple. Now let’s see what’s behind the scenes and why we chose to develop it for Google Apps.

For the solution to work effectively it should be completely integrated into the user’s messaging and calendaring environment. This is why we chose to work with Google. Google Apps is an open messaging and calendaring platform with a convenient integration framework. We have the following integration points with Google Apps:

  1. The Google Apps Marketplace installation process adds a link in Google’s universal navigation and enables Single Sign On (SSO).

  2. The Google Gadget framework is used to include a gadget in Google Calendar and in Gmail.

  3. The Google Calendar API is used to seamlessly integrate with the user’s calendar.

Now lets look at each integration point and some of the APIs we used to make ScheduleOnce work seamlessly with Google Apps.

Installation from the Google Apps Marketplace

The new Google Apps Marketplace installation process provides two major benefits:
  1. A quick and easy installation process and a link in Google’s universal navigation

  2. Single Sign On (SSO)

Installation process

The Google Apps administrator follows a simple installation wizard. During this process the following is done by ScheduleoOnce:
  1. The Administrator approves a Two Legged OAuth (2LO) calendar API permission for all domain users. This means that ScheduleOnce can access the calendar API of every user in the domain without requiring the user to re-enter their credentials. This is very convenient for the user.

  2. Every user in the domain automatically gets a link to a Personal ScheduleOnce Dashboard on his Google universal navigation. This is set in the installation manifest:
    <Extension id="oneBarLink" type="link">
    <Name>ScheduleOnce</Name>
    <Url>http://apps.scheduleonce.com/render.aspx?source=${DOMAIN_NAME}&amp;page=dashboard</Url>
    </Extension>
  3. The administrator selects a URL and a logo for the application. We use the SSO and ${DOMAIN_NAME} parameter to verify that the user is part of the domain so one cannot maliciously create ScheduleOnce instances. We also use the ${DOMAIN_NAME} parameter for presenting the domain custom logo:
    https://www.google.com/a/${DOMAIN_NAME}/images/logo.gif?alpha=1

Single Sign On (SSO)

During the installation process our URL is "white listed" at Google so we can authenticate the user by their Open ID. Behind the scenes, ScheduleOnce handles the authentication for the user as described here. In addition, the administrator grants permission to access the user calendar API for all the users in the domain. Since authentication for API access is done using 2-Legged-OAuth (2LO) we can directly connect to the user’s calendar.

On the server side there is a service that handles the 2LO requests
// Create a service for making 2LO requests
GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("cl", "yourCompany-YourAppName-v1");
requestFactory.ConsumerKey = <CONSUMER_KEY>;
requestFactory.ConsumerSecret = <CONSUMER_SECERT>;
CalendarService service = new CalendarService(requestFactory.ApplicationName);
service.RequestFactory = requestFactory;
SSO and 2LO provide the needed security with the convenience of a transparent login. With this combination the ScheduleOnce application looks like any other Google Apps application. When trying to access the ScheduleOnce application before authenticating with Google Apps, the user will get the normal Google Apps login (so no one outside the domain can login). When entering the ScheduleOnce application from one of the Google Apps entry points (Google’s universal navigation or one of the gadgets) then the login is done behind the scenes and it is transparent to the user.

Gadgets in Google Calendar, Gmail and the Start Page

We used an OpenSocial gadget for providing meeting management functionality. Authentication here is a bit trickier since it should be done without the user doing anything actively. To identify the user we used SSO and Open ID, allowing the gadget to be installed on any Google Apps gadget container (such as Google Calendar or Gmail).

Gadget initialization includes UI and OpenSocial data request:
function initGadget(){
//Initializing the gadget tabs
tabs.addTab("Pending", {
contentContainer: document.getElementById("pending_id"),
callback: callback
});
tabs.addTab("Scheduled", {
contentContainer: document.getElementById("scheduled_id"),
callback: callback
});
tabs.displayTabs(false);
refresh();

//Initializing the OpenSocial data request
var idspec = opensocial.newIdSpec({ "userId" : "OWNER"});
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER), "get_owner");
req.send(openSocialResponse);
}
where the POST request looks something like this:
function makePOSTRequest(){
var url = baseURL + "GadgetHandler.aspx";
var postdata = {opensocialid : openSocialID};
var params = {};
postdata = gadgets.io.encodeValues(postdata);
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
params[gadgets.io.RequestParameters.POST_DATA]= postdata;
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT;
gadgets.io.makeRequest(url, responseHandler, params);
}
When the gadget runs it loads a hidden iframe to check if the user (by his Open ID) is authenticated on the server. If the user is not authenticated, authentication is done behind the scenes and the user’s Open ID is added to a temporary application object. If the user’s Open ID mapping exists on the application object it means the user is authenticated and can work freely in the ScheduleOnce application.

Integration with Google Calendar

Google Calendar is accessed using the Google Calendar API. Three major functions are used:
  1. Getting the user's busy times: Since availability is dynamic and dependent on the current calendar status we update it every time it is needed. This ensures there will never be any double booking in the user’s calendar.
    // Retrieving the calendar events for a time frame
    EventQuery query = new EventQuery();
    string uriString = "https://www.google.com/calendar/feeds/" + username + "/private/full?ctz=utc";

    query.Uri = new Uri(uriString);
    query.StartTime = <time frame start>;
    query.EndTime = <time frame end>;

    EventFeed calFeed = service.Query(query);
    AtomEntryCollection entryColl = calFeed.Entries;
  2. Creating a calendar with tentative meeting times: ScheduleOnce cannot "lock" certain timeframes until the scheduling process is over. For this reason we create a tentative meetings calendar that can be used to see times that were proposed for a meeting.
    // Creating a calendar
    CalendarEntry calendar = new CalendarEntry();
    calendar.Title.Text = <calendar title>;
    calendar.Summary.Text = <calendar description>;
    calendar.TimeZone = <calendar timezone>;
    Uri postUri = new Uri("https://www.google.com/calendar/feeds/default/owncalendars/full");
    CalendarEntry createdCalendar = (CalendarEntry)service.Insert(postUri, calendar);
  3. Scheduling the meeting and sending the invitation via Google Calendar: When the meeting organizer schedules the meeting, a meeting entry is created in his calendar and meeting invitations are sent to all attendees.
    // Creating a meeting
    EventEntry entry = new EventEntry();
    entry.Title.Text = <meeting Title>;
    When eventTime = new When(<meeting startTime>, <meeting endTime>);
    entry.Times.Add(eventTime);
    Uri postUri = new Uri("https://www.google.com/calendar/feeds/" + username + "/private/full?ctz=utc");
    AtomEntry insertedEntry = service.Insert(postUri, entry);
Tip: Use Calendar API calls in a batch when possible to increase performance.

Using Documentation and Help Forums

Google provides very good documentation that can be accessed here. Marketplace listing and installation are very simple and instructions can be found on the Google Marketplace site. If you don't find what you need in the documentation, the first place to look is the Google Apps Discussion Groups. We were able to find everything we needed to build and integrate ScheduleOnce with Google Apps. The APIs and documentation made the job easy.

Check out ScheduleOnce at www.scheduleonce.com