Using Nintex Workflow Cloud and Azure Functions to call on-premises workflows

This is from a lab from the soon to be released Nintex End User Training courses.  Its the first of its kind and I'll simply say, you will learn some fun stuff!  

  1. Login to
    Azure, or create a trial for Azure Functions
    • Trial
      https://functions.azure.com/try
    • Portal
      1. Select
        your subscription
      2. For
        the function name, type “NintexExternalStart”
      3. Select
        a region
      4. Click
        “Create + get started”, this can take a few seconds
  2. Click the
    “New Function” button
  3. Select the
    “HttpTrigger-CSharp” template:
  4. Click
    “Create"
 Copy the following to your azure function:
 
#r "Newtonsoft.Json"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");    
    string url = "https://run.nintex.io/x-start/YourEndPoint";
    string securityKey = "YourSecurityKey";
    var variableValues = new Dictionary<string, object>();
    var service = new ExternalStartApiClient();
    try
    {
        log.Info("C# HTTP trigger function processed a request.");
        var correlationId = service.StartWorkflow(url, securityKey, variableValues, log);
    }
    catch
    {
    }
    string name = "Chris";
    return name == null
        ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
        : req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}
    
    public class ExternalStartApiClient
    {
        public RestClient Client { get; internal set; }
        #region Constructors
        public ExternalStartApiClient()
        {
            this.Client = new RestClient();
        }
        public ExternalStartApiClient(RestClient client)
        {
            this.Client = client;
        }
        #endregion
        /// <summary>
        /// Retrieves information about the workflow variables available for the Nintex workflow associated with the
        /// specified endpoint URL.
        /// </summary>
        /// <param name="endpointUrl">The External Start endpoint URL associated with a Nintex workflow.</param>
        /// <returns>A List object that contains a WorkflowVariable object for each available workflow variable.</returns>
        public List<WorkflowVariable> GetWorkflowVariables(string endpointUrl)
        {
            // Send a GET request to the specified endpoint URL. No authorization or authentication is
            // required for this request.
            HttpResponseMessage response = this.Client.Invoke(HttpMethod.Get, endpointUrl, null, null);
            // If a response is returned, check the HTTP status code.
            if (response != null)
            {
                switch (response.StatusCode)
                {
                    case HttpStatusCode.OK:
                        // Success – deserialize and return the list of workflow variables.
                        return this.Client.DeserializeJson<List<WorkflowVariable>>(response);
                    case HttpStatusCode.BadRequest:
                        // Failure – the endpoint URL could not access a workflow.
                        throw new ArgumentException("The request could not be processed.");
                    default:
                        throw new Exception("An unexpected error has occurred.");
                }
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// Sends a message to start the Nintex workflow associated with the specified endpoint URL, optionally specifying 
        /// values for workflow variables defined by that workflow
        /// </summary>
        /// <param name="endpointUrl">
        /// The External Start endpoint URL associated with a Nintex workflow.
        /// </param>
        /// <param name="securityKey">
        /// The security key associated with the endpoint URL.
        /// </param>
        /// <param name="workflowVariables">
        /// The workflow variable values to use when starting the workflow.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// The X-CorrelationId: {GUID} of the request
        /// </returns>
        public string StartWorkflow(string endpointUrl, string securityKey, Dictionary<string, object> workflowVariables, TraceWriter log)
        {
            // If no workflow variable values are provided, send an empty request body; otherwise, send
            // a serialized JSON object, in which each workflow variable value is represented as a property value.
            string requestBody = "";
            if (workflowVariables != null)
            {
                JObject associationData = new JObject();
                foreach (string key in workflowVariables.Keys)
                {
                    JProperty value = new JProperty(key, workflowVariables[key]);
                    associationData.Add(value);
                }
                requestBody = associationData.ToString();
            }
            // Retrieve and configure the values used to calculate the digest value for the request.
            var path = new Uri(endpointUrl).AbsolutePath.ToLower();
            var httpMethod = HttpMethod.Post.ToString().ToLower();
            var nonce = Guid.NewGuid().ToString();
            var timestamp = DateTime.UtcNow.ToString("O");
            // Calculate and return the digest value for the request.
            var digest = CalculateDigest(securityKey, httpMethod, path, nonce, timestamp, requestBody);
            log.Info(digest);
            log.Info(timestamp);
            log.Info(nonce);
            // Specify the header values for the request.
            var headerValues = new Dictionary<string, string>();
            headerValues.Add("X-Api-Digest", digest);
            headerValues.Add("X-Api-Timestamp", timestamp);
            headerValues.Add("X-Api-Nonce", nonce);
            headerValues.Add("X-Api-Source", "ExternalStart");
            // Send the request to the endpoint URL. 
            HttpResponseMessage response = this.Client.Invoke(HttpMethod.Post, endpointUrl, headerValues,
                new StringContent(requestBody, Encoding.UTF8, "application/json"));
            
            if (response != null)
            {
                log.Info(response.StatusCode.ToString());
                switch (response.StatusCode)
                {
                    case HttpStatusCode.OK:
                        // Success – the message was successfully sent.
                        IEnumerable<string> correlationIds;
                        response.Headers.TryGetValues("X-CorrelationId", out correlationIds);
                        return correlationIds.FirstOrDefault();
                        break;
                    case HttpStatusCode.BadRequest:
                        // Failure – the endpoint URL could not access a workflow.
                        throw new ArgumentException("The request could not be processed.");
                    default:
                        throw new Exception("An unexpected error has occurred.");
                }
            }
            else
            {
                throw new Exception("An unexpected error has occurred.");
            }
        }
        /// <summary>
        /// Calculate the digest value used to authenticate requests for the External Start feature.
        /// </summary>
        /// <param name="securityKey">The security key associated with an External Start endpoint URL.</param>
        /// <param name="httpMethod">The HTTP method name, in lower case.</param>
        /// <param name="path">The absolute URI of the External Start endpoint URL, in lower case.</param>
        /// <param name="nonce">The nonce value.</param>
        /// <param name="timestamp">The date and time of the request, in ISO 8601 format.</param>
        /// <param name="requestBody">The serialized body of the request.</param>
        /// <returns>A keyed hash value, using the SHA-256 function, to be used as the Hash-based Authentication Code (HMAC) value for a request.</returns>
        public string CalculateDigest(string securityKey, string httpMethod, string path, string nonce,
            string timestamp, string requestBody)
        {
            // The data values are concatenated into a single string, in which each data value is delimited by 
            // a colon (:) character, which is then encoded as a UTF-8 byte array.
            var dataBytes = Encoding.UTF8.GetBytes(String.Join(":", httpMethod, path, nonce, timestamp, requestBody));
            // The security key is encoded as a UTF-8 byte array.
            var keyBytes = Encoding.UTF8.GetBytes(securityKey);
            // Using the HMACSHA256 object provided by .NET Framework, the
            // data values are hashed, using the security key, and any dashes are removed.
            using (var hasher = new HMACSHA256(keyBytes))
            {
                var hashBytes = hasher.ComputeHash(dataBytes);
                return BitConverter.ToString(hashBytes).Replace("-", "");
            }

        }
    }
    public class RestClient
    {
        public NetworkCredential Credential { get; set; }
        #region Constructors
        public RestClient()
        {
        }
        public RestClient(NetworkCredential credential)
        {
            this.Credential = credential;
        }
        #endregion
        #region Deserialization
        /// <summary>
        /// Deserialize the body of a specified HTTP response as an instance of a specified type.
        /// </summary>
        /// <typeparam name="T">The type into which to deserialize.</typeparam>
        /// <param name="restResponse">The HTTP response from which to deserialize.</param>
        /// <param name="jsonConverters">If needed, any custom JSON converters with which to deserialize.</param>
        /// <returns>An instance of the specified type, deserialized from the body of the specified HTTP response.</returns>
        internal T DeserializeJson<T>(HttpResponseMessage restResponse, JsonConverter[] jsonConverters = null)
        {
            return this.DeserializeJson<T>(restResponse.Content.ReadAsStringAsync().Result, jsonConverters);
        }
        /// <summary>
        /// Deserialize a specified JSON-encoded string as an instance of a specified type.
        /// </summary>
        /// <typeparam name="T">The type into which to deserialize.</typeparam>
        /// <param name="jsonString">The string from which to deserialize.</param>
        /// <param name="jsonConverters">If needed, any custom JSON converters with which to deserialize.</param>
        /// <returns>An instance of the specified type, deserialized from the body of the specified string.</returns>
        internal T DeserializeJson<T>(string jsonString, JsonConverter[] jsonConverters = null)
        {
            if (jsonConverters != null)
                return JsonConvert.DeserializeObject<T>(jsonString, jsonConverters);
            else
                return JsonConvert.DeserializeObject<T>(jsonString);
        }
        #endregion
        #region Serialization
        /// <summary>
        /// Serialize the specified object as a JSON-encoded string.
        /// </summary>
        /// <param name="value">The object from which to serialize.</param>
        /// <param name="jsonConverters">If needed, any custom JSON converters with which to serialize.</param>
        /// <returns>A JSON-encoded string that contains the serialization of the specified object.</returns>
        internal string SerializeJson(object value, JsonConverter[] jsonConverters = null)
        {
            if (jsonConverters != null)
            {
                return JsonConvert.SerializeObject(value, Formatting.Indented, jsonConverters);
            }
            return JsonConvert.SerializeObject(value, Formatting.Indented);
        }
        #endregion
        #region REST invocation
        /// <summary>
        /// Invokes the specified REST resource, using the specified HTTP method, optionally providing any specified header values and request content.
        /// </summary>
        /// <param name="operationMethod">The HTTP method with which to invoke the REST resource.</param>
        /// <param name="operationUrl">The operation URL with which to invoke the REST resource.</param>
        /// <param name="operationHeaders">A collection of header names and values to include when invoking the REST resource.</param>
        /// <param name="operationContent">The HTTP content to include when invoking the REST resource.</param>
        /// <returns></returns>
        internal HttpResponseMessage Invoke(HttpMethod operationMethod, 
            string operationUrl, 
            Dictionary<string, string> operationHeaders, 
            HttpContent operationContent)
        {
            HttpResponseMessage response = null;
            try
            {
                // Instantiate a new HttpClientHandler object and, if credentials are provided,
                // configure and include them.
                var clientHandler = new HttpClientHandler { PreAuthenticate = true };
                if (this.Credential == null)
                {
                    clientHandler.UseDefaultCredentials = true;
                }
                else
                {
                    clientHandler.Credentials = this.Credential;
                }
                // Instantiate a new HttpRequestMessage, using the specified HTTP method and operation URL,
                // for the request.
    &n
bsp;           var request = new HttpRequestMessage(operationMethod, operationUrl);
                // If header values are provided, add them to the request.
                // NOTE: The implementation is not optimal, but suffices for the sample.
                if (operationHeaders != null)
                {
                    foreach (var key in operationHeaders.Keys)
                    {
                        request.Headers.Add(key, operationHeaders[key]);
                    }
                }
                if (operationContent != null)
                {
                    request.Content = operationContent;
                }
                // Instantiate a new HttpClient, asynchronously invoke the REST resource,
                // and await the result. 
                using (var client = new HttpClient(clientHandler))
                {
                    response = client.SendAsync(request).GetAwaiter().GetResult();
                }
            }
            catch (Exception)
            {
                response = null;
            }
            // Return the resulting HttpResponseMessage.
            return response;
        }
        #endregion
    }
    public enum VariableTypes
    {
        Text,
        TextMultipleLine,
        Number,
        DateTime,
        Boolean
    }
    /// <summary>
    /// Models the information returned for workflow variables by the External Start feature.
    /// This class is used to deserialize that information for the purposes of the sample.
    /// </summary>
    public class WorkflowVariable
    {
        [JsonProperty("Name"), JsonRequired]
        public string Name { get; internal set; }
        [JsonProperty("Type"), JsonRequired]
        public VariableTypes Type { get; internal set; }
        [JsonProperty("Required"), JsonRequired]
        public bool Required { get; internal set; }
    }
 
 And then you'll need a project.json file:
 
 {
  "frameworks": {
    "net46":{
      "dependencies": {
        "Newtonsoft.Json": "8.0.3"
      }
    }
   }
}

Nintex Training (Advanced) – Its almost here!

New Nintex Courses are coming! 

Yup, Nintex is such a great product and it has been making so many strides in so many ways, I decided to go ahead and build a set of in-depth courses that cover just about everything you could possibly imagine about Nintex on-premises.  Currently the Nintex customer base is focused on 2013, but many people are moving to 2016 and Office 365 so another set of courses is coming in mid-2017 to cover those technologies.  The courses will become officially available in mid-February 2017, but I would love to have some testers that would like to get up to speed on Nintex quickly and get some free training if you give me feedback to cycle back in!

Cloud Services 

As some of you may be aware, Nintex has started to move its technology investments to cloud based applications.  The new Nintex Hawkeye, Nintex Workflow Cloud (competitor to PowerApps) and other items in the pipeline are designed to leverage the benefites of the cloud.  The new courses cover those technologies too (a first for Nintex courses)!

Nintex Subscription Pricing 

In addition, ACS has become a Nintex Partner so we can sell you Nintex subscriptions.  I'm not greedy so you can imagine the pricing will be pretty amazing, just drop me a line and I'll get you a quote!  Not only that, but I'll even throw in free training courses with the purchase in most cases!

You can find out more about the courses here:

http://www.architectingconnectedsystems.com/Nintex.aspx

Enjoy! 
Chris 

Nintex XChange Asset Review

Nintex earlier this year unveiled a community portal for community members to provide helpful contributions to the Nintex user base called Nintex XChange.  It follows along with the "App marketplace" style of the Office 365 app store. 

To date there are 80 contributions, here are my ratings (5 highest) on all of them with some extra data points at the end:

AssetId Name Comment Rating DeploymentType AssetType Platform
3686 Uber Price Estimate UDA Uber price estimate UDA…sweet! 5 Workflow Template;UDA UDA Nintex Workflow
3947 Multi-Step form for Office 365 An example of how to make a Nintex Form that is multi stepped. This is pretty freakin awesome! 5 JavaScript JavaScript Nintex Forms
3968 Data One 4 PowerShell Woah…running Server Side OM in a Nintex Action…Cool! Comes with intellsense and everything…dang! 5 SharePoint Solution Custom Action Nintex Workflow
3949 Parsing XE.com data – UDA Currency convertor UDA, nice! 4 UDA UDA Nintex Workflows
4210 How to Create Cascading Choice Controls – Nintex Forms A mix of CSS and JavaScript to implement cascading drop downs. Good Stuff! 4 CSS; JavaScript CSS; JavaScript Nintex Forms
4237 Extract Lookup ID A regular expression to get the item ID from a lookup control. 4 JavaScript JavaScript Nintex Forms
5896 Wunderlist UDAs for Nintex Workflow On-Prem A UDA that wraps Wunderlist API REST Calls. Actually made me go sign up so I could check it out…interesting! 4 UDA User Defined Action Nintex Workflow
3894 Nintex Add-in for Outlook Nintex Add in for outlook. A simple app that looks for links in an email to notify a person that it is a Lazy Approval task. 4 Add-In Add-In Nintex Workflow
3943 Visual Studio Post Deployment Script – ALCM A VisualStudio Post Deployment script for deploying your Nintex Artifacts to SharePoint from Visual Studio. Very handy! 4 PowerShell PowerShell Windows
3896 Show Repeating Section as table in List View A script to show a repeating section as table in SharePoint View 4 JavaScript JavaScript Nintex Forms
3897 Custom Validation for Nintex Forms An exmaple of how to write your own JavaScript custom validator. Very helpful! 4 JavaScript JavaScript Nintex Forms
3903 Generate an HTML document with dynamic data Interseting take on generating a document from metadata in HTML format 4 Workflow Template Workflow Nintex Workflow
3923 Iterate through documents in a Document Set Workflow that iterates through all the files in a document set. Coolness… 4 Workflow Template Workflow Nintex Workflow
3925 Archiving a List Item with Workflow History A UDA that backs up workflow history from one instance to another. Interesting pattern. 4
3936 Terminate Old Instances of a Workflow A UDA to terminate old workflow instances. Interesting… 4 UDA UDA Nintex Workflow
3937 Business Days Validation for Forms Business day calculation JavaScript. 4 JavaScript JavaScript Nintex Forms
3939 Convert Forms to PDF w/ Workflow Convert a form to a PDF using workflow. Pretty sweet use of out of box technology. 4 Workflow Template Workflow Nintex Workflow; Nintex Forms
3706 Sending a TXT w/ Nintex Workflow How to send a SMS with Twilio via a web request – nice! 4 Guide Guide Nintex Workflow
3723 Latitude and Longitude UDA How to get Latitude and Longitude via web request – nice solution 4 UDA UDA Nintex Workflow
3607 Start Workflow with PowerShell Useful powershell script to start a nintex workflow 4 PowerShell PowerShell Nintex Workflow
3729 Resetting Repeating Sections A custom action to reset the items in a repeating section. This is actually pretty darn handy! 4 SharePoint Solution Custom Action Nintex Workflow
3841 Using the SharePoint REST service inside Nintex Forms An example of how to query SP REST endpoints using JavaScript 4 JavaScript JavaScript All
3876 Tab-based Layout Solution How to make your forms tab based. Very helpful! 4 CSS CSS Nintex Forms
3891 Embedding Signature Pad using JSignature.min.js An example of how to use JavaScript to embed a signature pad into your Nintex Forms. 4 JavaScript JavaScript Nintex Forms
3892 Splitting Text – RegEx Example of a regex usage in Nintex Workflow 3 Guide Guide Nintex Workflow
3858 Parsing Nintex Forms Repeating Section Solution – O365 A second type of master-child form using workflow to break out the items. This one is for Office 365. Similar to 3385. 3 Workflow Template Workflow Nintex O365
3859 Get Recurring Events – UDA UDA to get recurring events…not bad… 3 Workflow Template Workflow Nintex Workflow
3846 Dynamically Generated Hyperlinks JavaScript to generate hyperlinks to document in a Form and in O365 3 JavaScript JavaScript Nintex O365
3847 Create Salesforce Lead via Nintex Workflow Creates a SalesForce lead via Nintex Workflow 3 Guide Guide Nintex Workflow
3848 Dynamic approvers for douments Workflow for doing dynamic approvals on a document. Another basic pattern, but helpful if you haven't seen the pattern before. 3 Workflow Template Workflow Nintex Workflow
3758 Nintex Form File Attachment Validation Settings Nintex form that only allows an upload of PDF files 3 Nintex Form Nintex Form Nintex Forms
3385 Parent/Child Forms/Workflow Solution An example of how to use the repeating section of a nintex form to drive list item creation via workflow. Pretty basic pattern, but useful if you haven't done it before. 3 Nintex Forms
3725 Set image based on location in Forms Set an image based on GeoLocation 3 JavaScript JavaScript Nintex Forms
3726 Start a workflow & wait w/ Form JavaScript to start a workflow from Nintex Forms. Interesting implementation… 3 JavaScript JavaScript Nintex Forms
3728 SAP Made Easy w/ Zimt SAP Actions from Zimt 3 SharePoint Solution Custom Actions Nintex Workflows
3608 PowerShell Find All Workflows – Part 1 Shows how to get all the Nintex workflows via the NWAdmin tool. More for reporting than anything else. 3 PowerShell PowerShell Windows
3613 Safely purge items from history list – PowerShell PowerShell script to purge the workflow history list. 3 PowerShell PowerShell Nintex Workflow
3940 Add a Site Workflow Link in O365 A way to add a link to Nintex Site Workflows to quick nav 3 Other Other SharePoint
3895 Replace Text – RegEx An example of using regex to do a replacement 3 RegEx RegEx Nintex Workflow
4073 Layer2 Cloud Connector A data connector for Nintex Workflow. Doesn't really give any helpful patterns of why you should buy/use it. 3 SharePoint Solution Custom Action Nintex Workflow
4137 Theobald Software – ERPConnect Services  Theobald Software – ERPConnect Services 3 SharePoint Solution Custom Actions Nintex Workflow
4017 Delete Attachments – UDA UDA to delete attachments 3 UDA UDA Nintex Workflow
4018 What Changed – UDA UDA for tracking what changed in an item 3 UDA UDA Nintex Workflow
4019 Random Number – UDA A UDA that will generate a random number 3 UDA User Defined Action Nintex Workflow
4060 Panels UI Magic with Nintex Forms for Office 365 Another example of how to do a "Stepped" or "Paneled" nintex Form 3 CSS CSS Nintex Forms
4153 Action Task Reminder – Site Workflow Another pattern around task reminders. 3 Workflow Template Workflow Nintex Workflow
4155 Dynamic button label Dynamic button label via calculated value and events 3 JavaScript JavaScript Nintex Forms
4157 Remove Permissions UDA UDA to remove permission down to read only 3 UDA UDA Nintex Workflow
4174 Set Manager in a Nintex Forms People Picker Control A javascript code snippet (must be paid for), to populate the manager of a people form control. I'm betting no one has really paid for this… 2 JavaScript JavaScript Nintex Forms
4063 Simple email validation for forms Basic email reg ex. 2 Regular Expression Text Nintex Forms
4147 Document Review and Approval (State Machine) Workflow An example of a workflow to do review and approvals. 2 Workflow Template Workflow Nintex Workflow
3950 Document Review Reminder Process Basic reminder pattern. 2 Workflow Template Workflow Nintex Workflow
5974 WYSIWYG Business Cards in Office 365  SharePoint  Online using @Nintex Forms and Workflow apps for @Office365 A video of how to build a business card application with preview capabilites 2 Video Video Nintex Forms
6071 Trigger a Nintex Workflow from DropBox w/ Zapier Just a walkthrough of connecting your external start to Nintex Workflow for DropBox/Zapier. 2 Guide Guide Nintex Workflow
6072 Trigger a Nintex Workflow from OneDrive w/ Zapier Just a walkthrough of connecting your external start to Nintex Workflow for OneDrive/Zapier 2 Guide Guide Nintex Workflow
6073 Trigger a Nintex Workflow from Salesforce w/ Zapier Just a walkthrough of connecting your external start to Nintex Workflow for SalesForce/Zapier 2 Guide Guide Nintex Workflow
6082 Trigger a Nintex Workflow from Zendesk w/ Zapier Just a walkthrough of connecting your external start to Nintex Workflow for Zendesk/Zapier. 2 Guide Guide Nintex Workflow
3941 Upload ULS Logs to Doc Library – PowerShell A powershell script to upload ULS logs. Kinda odd, but I guess? 2 PowerShell PowerShell Windows
3724 Hide Form Footer How to hide the Nintex Form footer 2 CSS CSS Nintex Forms
3772 Birthday UDA A UDA that figures out the day of the week you were born on. Fun, but not very useful. 2 UDA UDA Nintex Workflow
3797 Replace Empty String Variable A UDA that will replace an empty string with something else. Hmmm… 2 UDA UDA Nintex Workflow
3798 Site Creation Workflow Workflow to create a site. 2 Workflow Template Workflow Nintex Workflow
3820 Set Placeholder Text Hints for Text Box Controls Just some javascript to show sample text in a text box on your Nintex Form. Pretty basic. 2 JavaScript JavaScript Nintex Forms
3853 Create user group in your SharePoint Site – UDA A user defined function (UDF) for Nintex 2010 that allows you to create a SharePoint groups 2 UDA User Defined Action Nintex Workflow
3854 Remove user group from SharePoint Site – UDA A user defined function (UDF) for Nintex 2010 that allows you to removew users from SharePoint groups 2 UDA User Defined Action Nintex Workflow
3855 Add user to a SharePoint group – UDA A user defined function (UDF) for Nintex 2010 that allows you to add users to SharePoint groups 2 UDA User Defined Action Nintex Workflow
3856 Remove user from SharePoint group – UDA Remove a user from SP Group 2 UDA UDA Nintex Workflow
3857 Math Power – UDA Math Power UDA…funny comments… 2 UDA UDA Nintex Workflow
3893 Extract Text – RegEx An example of how to run a regular expressions against some text. Not very helpful. 2 Other Text Nintex Workflow
3887 Sample Case Summary Template – Salesforce SalesForce case study doc…for DrawLoop stuff… 2 Guide Guide Drawloop
3888 Sample Cover Letter Template – Drawloop SalesForce case study doc…for DrawLoop stuff… 2 Guide Guide Drawloop
3889 Sample Quote Template – Drawloop SalesForce case study doc…for DrawLoop stuff… 2 Guide Guide Drawloop
3590 Theobald SAP – Connector Theobald SAP – Connector – looks like it has absoltely nothing valuable to do… 1 ? ? ?
3614 <Xchange Template – Delete this field and replace with your title> Hmm…nada here… 1 ? ? ?
3948 Expense Report Solution – PointBeyond supposed to be an expense form, but nothing here 🙁 1 Other Other Nintex Forms
3944 Build a Nintex form – pt 1 of 3 Simple tutorial – should probably not be in the XChange 1 Guide Guide Nintex Forms
3945 Build a Nintex form – pt 2 of 3 Simple tutorial – should probably not be in the XChange 1 Guide Guide Nintex Forms
3946 Build a Nintex form – pt 3 of 3 Simple tutorial – should probably not be in the XChange 1 Guide Guide Nintex Forms
6111 SharePlus & Nintex Integrated Solution : Introduction Nothing but a 3rd party adverisement/marketing slick 1 Guide Guide Nintex Workflow;Nintex Forms
4209 Nintextionary – Nintex Actions Dictionary Have no idea what this does or why it is posted. Doesn't seem to have any assets at all! 1 Other Other Nintex Workflow

Platforms:

  • 44 Nintex Workflow
  • 25 Nintex Forms
  • 3 Drawloop
  • 3 Windows
  • 2 ?
  • 2 Nintex O365
  • 1 All
  • 1 SharePoint

Deployment Types:

  • 15    UDA
  • 14    Guide
  • 13    JavaScript
  • 10    Workflow Template
  • 5    SharePoint Solution
  • 5    PowerShell
  • 4    Other
  • 3    CSS
  • 2    NULL
  • 2    ?
  • 1    Add-In
  • 1    CSS; JavaScript
  • 1    RegEx
  • 1    Regular Expression
  • 1    Nintex Form
  • 1    Video
  • 1    Workflow Template;UDA

Top Views:

  • 3771 – Convert Forms to PDF w/ Workflow
  • 2330 – Terminate Old Instances of a Workflow
  • 2135 – Nintex Add-in for Outlook
  • 2055 – Parsing Nintex Forms Repeating Section Solution – O365
  • 2018 – Set Placeholder Text Hints for Text Box Controls
  • 2009 – PowerShell Find All Workflows – Part 1
  • 1915 – Document Review Reminder Process
  • 1906 – Build a Nintex form – pt 1 of 3
  • 1868 – Custom Validation for Nintex Forms
  • 1855 – Tab-based Layout Solution
  • 1810 – Iterate through documents in a Document Set
  • 1808 – Using the SharePoint REST service inside Nintex Forms
  • 1800 – Splitting Text – RegEx
  • 1800 – Parent/Child Forms/Workflow Solution
  • 1734 – Start Workflow with PowerShell 

Top Likes:

  • 17 – Nintex Add-in for Outlook
  • 11 – Show Repeating Section as table in List View
  • 11 – Convert Forms to PDF w/ Workflow
  • 11 – Document Review Reminder Process
  • 11 – Simple email validation for forms
  • 11 – Tab-based Layout Solution
  • 10 – Set Placeholder Text Hints for Text Box Controls
  • 10 – Generate an HTML document with dynamic data
  • 10 – Iterate through documents in a Document Set
  • 9 – Business Days Validation for Forms
  • 9 – Using the SharePoint REST service inside Nintex Forms
  • 8 – Embedding Signature Pad using JSignature.min.js
  • 8 – Parent/Child Forms/Workflow Solution
  • 8 – Build a Nintex form – pt 1 of 3
  • 8 – Multi-Step form for Office 365 

Top Contributors:

  • 54 Eric Harris
  • 5 Patrick Abel
  • 2 rbachmann
  • 2 Jesse McHargue
  • 2 Swetha Sankaran
  • 2 Brad Orluk
  • 2 Cassy Freeman
  • 1 Chris Sullivan
  • 1 Christian Tauchmann
  • 1 Dean Virag
  • 1 Frank Daske
  • 1 frankgr
  • 1 jackgelo
  • 1 Jan Eyres
  • 1 Jay Cheong
  • 1 Vadim Tabakman
  • 1 Andrew Glasser
  • 1 Samantha Pugh

 

Videos – K2 vs Nintex – Want to know the real difference between the two? Here ya go!

Now that I have access to just about every 3rd party ISV software for SharePoint (K2, Nintex, VisualSP, ConceptSearch, Ephesoft, KnowledgeLake, etc, etc, etc), I have been able to install and configure all of them. And in most cases, I have automated the install of all of them (more on that in a later blog post after our new site goes live).  Due to this ISV software exposure, I was asked by some individuals to do a K2 vs Nintex comparison video.  Well, it takes more than just one video to really show the differences between the two.  So, here are a set of videos that you can review to see what the real differences are.  This is the list of videos that I will be posting in the next few days:

FYI: If you need Nintex Training or Nintex Subscription pricing, let me know! 

  • Headsup Install ( Videos : K2 vs Nintex)
    • Winner – Nintex
    • Why?
      • Nintex install takes around 10 minutes total for all components
      • Nintex install is simple .NET installer that adds solutions to your farm (and with Nintex Live, two windows services)
      • Nintex doesn't need a license key to install and configure
      • K2 install takes over an hour, and in many cases, up to 3 to get install properly
      • K2 requires a license to install it
      • K2 install has multiple components, each requiring much more time to install than the respective Nintex parts
  • Headsup ConfigurationAdmin UI (Videos – K2 vs Nintex)
    • Winner – Nintex
    • Why?
      • Nintex is SharePoint feature based – simply activate the features – all changes are inherited – no real updating of anything
      • Nintex is integrated into SharePoint Central Administration
      • Nintex has its own category of links, all of which are simple and easy to maneuver around
      • K2 requires you to leave SharePoint to configure anything admin
        related.  You can always put a link to the K2 admin UI in Central Admin,
        but you still have to leave SharePoint to get to it
      • The K2 admin UI is a bit slow and its not very intuitive.
      • K2 utilizes the App Model, this means extra work to deploy the app across web application boundaries (multiple app catalogs), and you have to "add" the app to each web you want to use it on
      • You must also ensure that you can connect to the K2 server for the app to function properly (mean properly setting up the SSL bindings on the K2 server).
      • K2 app updates mean you have to redeploy the app to each web (no easy automation available for this unless you are an old school SharePoint person)
  • Headsup Designer(s) (Videos – K2 vs Nintex)
    • Winner – Tie
      • Nintex has a very simple web based Designer for both workflows and forms.  It is integrated into the browser, no separate applications, all via a rich web client.
      • K2 has many ways to design "processes" aka workflows.  You can do it via the browser, or you can do it via Designer tools like K2 Studio, Visual Studio or a web based designer.
      • K2 is a bit more complex to work with and understand the various UIs versus the simple-ness of Nintex
  • Headsup Site and List Workflow (Videos – K2 vs Nintex)
    • Winner – Tie
    • Why
      • TODO
  • Headsup Actions (Videos – K2 vs Nintex)
    • Winner Nintex
    • Why
      • TODO
  • Headsup Forms (Videos – K2 vs Nintex)
    • Winner Nintex
    • Why?
      • TODO
  • Headsup Extensability (Videos – K2 vs Nintex)
    • Winner – Nintex
    • Why
      • TODO
  • Headsup O365 versions (Videos – K2 vs Nintex)
    • Winner – Nintex
    • Why?
      • Nintex just works.  Period.  Install the O365 Workflow and Forms apps, your up and running with a 30 day trial.  Easy.  After the trial, call your Nintex Partner (ACS of course) and we can get you activated same day.  Easy.
      • K2 takes a very complicated process of working with them to setup a backend tenant tied to your O365 tenant.  You must also be given the AppIt app to install into your app catalog in order to use it (it is not in the SharePoint store).
      • K2 also requires that you continue to use it or the OAuth token will expire and the system won't be able to talk back to your O365 instance.  You'll get a ton of emails notifying you of this until you click the link to refresh it.

Overall, I prefer Nintex over K2.  I'll get flak for that statement (but most of my friends have left K2 for various reasons I'm not at liberty to share at this point so maybe not).  Some will say, but have you seen the extensibliliy and architecture of K2 behind the scenes?  I'll simply say yes, but customers don't care about that.  They want something that is easy to install, easy to get started with and productive out of the box.  Nintex does that perfectly.

Enjoy,
Chris