The Caribbean’s biggest tech-entrepreneurship competition and showcase was held on

June 3-4, 2016

Meet the winners!
- Network
- get mentorship
- Meet market players
- meet funders
- understand investor expectations
- get publicity

25

entrepreneurs will pitch

On June 3 - 4, 2016, twenty-five finalists from across CARICOM will have the opportunity to pitch their mobile app to a panel of judges and an audience of regional and global investors at the PitchIT Caribbean Challenge, at the Mobay Convention Centre in Montego Bay, Jamaica.

5 winners will each be awarded US$5000 and a place in one of the five PitchIT Caribbean incubators around the Caribbean. During their incubation they will receive mentorship and coaching from some of the world’s best business coaches, and trips to international conferences and competitions.

5

winners will be chosen

The Final 10!

Terms & conditions

The following is a summary of the terms and conditions for the PitchIT Caribbean Challenge June 2016. Please download the official rules (pdf) and read it through carefully before you enter.

  • The Competition is open to Contestants from Antigua and Barbuda, Bahamas, Barbados, Belize Dominica, Grenada, Guyana, Haiti, Jamaica, Montserrat, Saint Kitts and Nevis, Saint Lucia, Saint Vincent and the Grenadines, Suriname, Trinidad and Tobago.
  • Contestants must be part of a team of at least two members.
  • Contesting organizations may be profit, non-profit or academic with fewer than 10 employees. Public sector agencies/organizations may not compete.
  • There is no cost to make a submission.

Submissions will be judged on the following criteria:

  1. Problem, Customer Segments and Opportunity Size
  2. Proposed solution to the customers’ pain
  3. Revenue Streams Envisaged and Tested
  4. Analysis of the competitive landscape and positioning
  5. Customer and User Growth Strategy / Channels
  6. Team Composition and Commitment
  7. Market Traction and Secondary Achievements
  8. Projections for milestones and Key metrics
  9. Completeness and Overall Impressiveness

25 finalists will be selected to pitch at the PitchIT Caribbean Challenge in June 2016.

  • The 25 finalists, when selected, will be asked to submit a three minutes video which will become part of their company profile and be used for a people’s choice Facebook competition, the prize for which will be awarded at the PitchIT Caribbean Challenge.
  • Two members of the 25 finalist teams must be willing and available to travel to Jamaica for the period May 29 – June 4, 2016. Travel and accommodation costs will be provided by PitchIT Caribbean. Selected Finalists will also get the opportunity to be a part of a two day intense pre-challenge Bootcamp that will prepare them to win over leading world investors and close deals.

Benefits for finalists

If you are selected as one of the 25 finalists, apart from the opportunity to win the main prize, the PitchIT Caribbean Challenge will provide you with opportunities to:-

network

Benefit from being a part of a community of innovators who share experiences, knowledge and resources. Source talent and build collaborative efforts for the future.

get mentorship

Ramp up your skills and knowledge through the training, coaching and mentorship we will provide to the selected teams.

Meet Market players

Get connected to important players in your target market - large corporates, development organizations, government entities - who can help you to reach your intended customers. intended customers.

Meet funders

Pitch your MVP to startup funders and build relationships that may lead to your project being funded.

Understand investor expectations

Grow in your understanding of investor expectations and how you can present your concept in ways that are more attractive to them.

Get publicity

Take advantage of the publicity and media around the PitchIT Caribbean Challenge and bring your app into the limelight.

How to enter

1

Create an executive summary

You’ll need to explain your vision for what your app will do. Use our guide document to create your executive summary.

Download executive summary guide

2

Create an investor pitch deck

You’re going to need to create a pitch deck. Here’s a template we’ve created that will help you with that process.

Download pitch deck template

3

Complete the entry form

Fill out the entry form. You'll need to attach your executive summary and investor pitch deck.

Enter now

Note: This project is a work in progress as a result these notes reflect the intention of the project and what has been done so far.

We needed a way to automatically invite new members to Slack. We're not the first, it turns out someone has already done this by integrating the Typeform API with Slack. We aren't using Typeform so I decided to work on integrating Slack with Plone, the content management system that powers PythonJamaica. 

Initial Research

The first lead came from @lesmumba who pointed out that a Slack community for digital nomads has done an implementation. Further research led me to other implementations including this one written in clojure and one written in nodejs.  After reading up on their process the key take-away for me was that Slack's invitation API was "undocumented".

Request Sniffing

To get an idea of what happens when an invite is sent out I used Chrome's developer tools to "sniff" the requests that my browser sent out when issuing an invitation. Yes (eyes rolling), I know I could have just compared what the other implementations did, in fact, I did some of that also.

Using the Slack website, I invited a new user and kept my eye on the Chrome developer tools console as it recorded the requests that were sent in the process.

When an invitation is sent from Slack here's what shows up in the Developer tools "Network" section.

Save as curl

Testing it out

Right clicking on the request I was able to select "Copy as cURL" and then, since Postman supports importing cURL commands, I imported it into the Postman add-on.

Postbin

Using the Postman interface I was able to isolate important things such as my token, my client id and my client secret/password. Basically creating a new invite is a post request sent to the Slack API, it seems to depend on a token and authentication via a client id and client secret.

First implementation (hardcoded)

I normally aim to do the quickest experiment that will show me that everything works. One quick solution is to create a simple Python script that does the key action, at this point it does not matter that we are hardcoding the solution we just want it to work. I created a simple Python script which utilizes the requests library to send a post to the Slack API (yes I know there's urllib2 in the standard library, but I'm a little allergic to it). I started out with everything hard coded. The script looks like this (note: since "requests" is not part of the standard library make sure it's available to your script, you'll need to use pip or something similar to install it):


import requests
url = "https://pythonjam.slack.com/api/users.admin.invite?t=1430801702"
clientid = "xxxxxx.xxxxxxx"
secret = "1xxxx057f2xxxxxx293c50"
payload = {}
payload["email"]="pxxxxxxxxx@gmail.com"
payload["channels"]="C04LBS6SA,C04KU7AJY"
payload["first_name"]="John"
payload["last_name"]="Brown"
payload["token"]="xoxs-467xxxxx10-xxxx73177-xx20xxxxx13-0xxx9exxx6"
payload["set_active"]="true"
payload["_attempts"]=1


r = requests.post(
               url,
               data=payload,
               auth=(clientid,secret)
               )
# the print statements are here for the sake of debugging
print r.status_code
print r.json()

As you can see the first iteration of the script is absolutely hard coded, which is fine as all I wanted to be able to do was see everything work. For the sake of not broadcasting my credentials to the internet I've replaced some of the values with 'x's. Running this script on the command line resulted in the following output

200
{u'ok': True}

and on the second attempt, something like this

200
{u'ok': False, u'error': u'already_invited'}

Next we need to make the script into a utility

So far so good, now we need a name. I decided to call it "autoslack" from Automate + Slack, this leaves space for additional functionality in the future, in case I decide I don't want it to just be a an auto inviter. Next we'll need to have this script act as a utility so that we can "import autoslack" into future Python projects. We also don't want to hardcode the token or invitee's information (firstname, lastname and email).

To use the library you will need a Slack API token get it here: https://api.slack.com/web#authentication.
 
Get a token
 
Here's the first version:
 
# autoslack.py
"""
Accept first name, last name and email address of member
Use the __name__ == '__main__' approach
generate a timestamp for the URL
add the ability to pass credentials (clientid, token, token)
"""
usage = """
usage: 
import autoslack
autoslack.invite(group="pythonjam",
                token="XXXXXXX",
                firstname="XXXXXXXX",
                lastname="XXXXXXX",
                emailaddress="XXXXXXX",
                channels=['XXXXX','XXXXX'])

"""

import requests
import time

def invite(group="",
                token="",
                firstname="",
                lastname="",
                emailaddress="",
                channels=[]):

    timestamp=int(time.time())
    slackuserapi = "api/users.admin.invite"
    url = "https://{}.slack.com/{}?t={}".format(
                                               group,
                                               slackuserapi,
                                               timestamp
                                               )
    # we should consider the channel api to autoinvite users to all channels

    channels = ",".join(channels)
    payload = {}
    payload["email"]=emailaddress
    payload["channels"]=channels
    payload["first_name"]=firstname
    payload["last_name"]=lastname
    payload["token"]=token
    payload["set_active"]="true"
    payload["_attempts"]=1
    
    
    r = requests.post(
                   url,
                   data=payload
#                   auth=(clientid,secret)
                   )
    # the print statements are here for the sake of debugging
    return r.json()

if __name__ == '__main__':
    
    print("use this module with another program")
    print(usage)
    print ("# that is all!")
    

Note that this version doesn't not include the client and secret used in our first hardcoded version. It seems the authentication is not required. There seems to be enough evidence to suggest that without the authentication Slack rate limits the number of invite events that can be sent to the API, for our light usage this should not be a problem.

Distributing autoslack via pypi

I made an initial effort to package autoslack as for distribution via pypi, unfortunately it is a "brown bag" release (so the package doesn't work)... Will get back to it when I have time.

Integrating this with Plone

Now that we have a library that we can import into our Python projects we can now begin the task of integrating it into our content management system

For this we'll need to configure Plone to listen for a user registration event and let that event trigger the sending of a Slack community invitation. Secondly we'll provide a way for an administrator to store key configuration settings like the token. This approach will provide the "infrastructure" needed to use different Slack communities on different sites by simply installing and adding appropriate credentials.

Future nice to haves

  • A standalone form, so that persons not joining the website can still join the Slack community.
  • Ability to support multiple Slack community forms per site