White Label API

October 12, 2020

Getting Started

What is the White Label?

Cvent’s SpeedRFP White Label makes venue sourcing easy and frictionless by embedding a simple request for proposal (RFP) form in your website.   This product increases the quality and quantify of inbound group leads your venue will receive directly on your branded site by providing 3 event-specific, mobile-friendly forms for meeting planners to fill out.  Once implemented, RFPs are fed directly into Cvent (or your venue’s existing RFP response system) for your hotels to respond quickly and efficiently.

White label is either purchased as:

  • SpeedRFP White Label Pro – Built to support a single property on a single website domain.
  • SpeedRFP White Label Enterprise – Built to support multiple properties on a single website domain. The implementation process for an enterprise form is slightly longer due to more configuration options and venue mapping.

Questions to think about as you get started with deployment:

  1. Which website do I plan to implement this product to?
  2. Do I plan to implement a meeting, wedding, and/or special event form as part of this product? Do I have a specific wedding page versus a meeting page to deploy forms to?
  3. Do I plan to use an analytics system to track any metrics? Do I plan to integrate the solution into my website’s current analytics engine?
  4. What terms of service and/or consent language (if any) do I want on my form?
  5. Does my white label come with theming options? Or do I want a standard look and feel?
  6. If representing multiple properties, how will I want my website visitors to select the hotels for their RFP submission?

Widget API Deployment

After your implementation kick-off, your Cvent representative will provide you with HTML specific code for your website.  The code can be implemented on one website domain, and the code can be deployed once to each page on your website.

Note: In order to better secure user data, Cvent recommends the use of HTTPS. The RFP Form will always communicate with Cvent servers exclusively in HTTPS, and we recommend that you implement your sites using HTTPS as well for even better protection.

By default, RFP forms include fields to collect first and last name, email, phone, organization, city, and country.  Your representative can also help you add form fields for:

  • Address 1
  • Address 2
  • State
  • Third party planner and commission questions
  • Lead generation – The ability for sales staff to send and track an RFP on behalf of a client

By default, the form is set up to accept all three form types, but your Cvent representative can configure your form to only accept the RFP types you wish to deploy on your site:

  1. Meeting
  2. Wedding
  3. Special Event

To support any General Data Protection Regulations (GDPR) you may need to comply with, your Cvent representative can help you configure your form with:

  1. A cookie banner
  2. Required and/or optional consent language to agree to
  3. Your own terms of service hyperlink

Lastly, property ID(s) are provided.  These unique IDs are usually 5-character codes that identify the property the RFP is submitted to.  Enterprise customers can have more than one UID. In that case each UID should be in the same string, comma-delimited.

Sample Code:

<script type="text/javascript" src="https://www.speedrfp.com/irfps/js/widget/"></script>

<script type="text/javascript" charset="utf-8">
var options = {};
options.display = "overlay";
options.key = "XXXXXXXXXXXXXX";
options.uid = "XXXXX";
var srfp_widget = new srfp.widget(options);
</script>

Where options.key identifies your form:

Example value: f8ed8ecf0eaa7b8b

Where options.uid identifies your venue(s):

Example value: 53F31, DEIKK

Display Options

The code can be customized based on which query parameter options you choose to utilize below.  First, decide on how you wish to display the form on your site:

Embed

options.display =”inline”

This option places the SpeedRFP web form into your actual webpage, as if it were part of the page. It is recommended to have at least 800 pixels of width available for this option.

Overlay

options.display = “overlay”

This option shows a SpeedRFP button that, when clicked, opens the SpeedRFP web form on top of the existing page.

New Window

options.display =”window”

This option shows a SpeedRFP button that, when clicked, opens the SpeedRFP web form in a new window.

Note: When a user is on a mobile device, the widget will always deploy as a new window, regardless of your implementation choice.  Opening in a new window when a mobile device is detected is the best user experience for your visitors. 

If choosing the overlay or new window option, you may decide to customize the look and feel of the SpeedRFP button that opens the form.  Use the following JavaScript code right before “var srfp_widget = new srfp.widget(options);” in the SpeedRFP widget:

ParameterNotes
options.button = “custom”This tells the form to use the custom button option.  This is a string.  "request proposal" (default button) "send a speedrfp" "custom"  Request Proposal "none" Don't show a button
options.button_style =This is a string.  CSS style attributes applied to the SpeedRFP button. This is only used if the options.button = "custom"
options.button_text = "Provide Your Text Here";What do you want your button to say?  Provide text like “Submit a Meeting RFP.” This is a string.  CSS style attributes applied to the SpeedRFP custom button text. This is only used if the option.button="custom".
options.button_text_style = "text-decoration:underline; padding: 2px;"How you can customize the style of the button.  CSS style attributes applied to the SpeedRFP custom button text. This is only used if the option.button="custom".
options.button_icon_size = "24";Specify the size of the SpeedRFP icon used in the custom button (24px is the default).

Optional Parameters

srfp_widget class

MethodReturn ValueNotes
show()"null"Opens the SpeedRFP widget if options.display="overlay" or options.display= "window".
setRfpType()"null"Sets the type of RFP you want to receive. Can be "meeting", "wedding" or "special event". Any other value will clear this setting. This overrides anything set with options.rfp_type.
setUid()"null"Sets the hotel UIDs that are loaded into the SpeedRFP web form when it is opened. Can by used to dynamically change what hotels are in the SpeedRFP.

Additional srfp_widget.options specification parameters to consider during deployment:

PropertyValueNotes
options.containerStringThe ID if an element in the web pages's DOM that the SpeedRFP web form is placed into. If display="overlay" or display="window", then the SpeedRFP button appears here. If display="inline", then the web form appears here. If container is not used, then the button or web form appears where the javascript code block is.
options.heightStringControls the height of an inline instance of SpeedRFP, in pixels. This default to 600px, but to prevent double scroll bars we recommend setting this to 900px. For example: options.height = "1000px"
options.clear_previousbooleanClears any hotels currently added to the existing SpeedRFP. Users may begin a SpeedRFP, then continue browsing your site and add more hotels to that SpeedRFP. Sometimes that may not be desired. Set this to "true" remove any previous properties whenever the user begins their SpeedRFP. Disabled by default.
options.populateUid  String "getHotelUids”The name of a function to run before SpeedRFP is loaded. That function should return a string of comma delimited list of UIDs.  For White Label Enterprise users, this allows prepopulation of hotel(s) into SpeedRFP and supports sending an RFP to multiple hotels.
options.rfp_type"meeting" "wedding" or "special event"Forms may collect any combination of meeting, wedding, and special event RFPs. By default the user can select the type of RFP they want to create. But you can force an RFP type by using "meeting", "wedding", or "special event". This is helpful if you have one form that accepts multiple RFP types, but you want to accept different types on different pages on your site. For instance, you may have a "Wedding" page and only want to accept wedding RFPs from it.
currencystringSets the default currency to be used for the RFP. Expects a supported ISO currency code, eg. "IDR" for the Indian Rupee. Defaults to "USD" if an invalid value is provided. Supported Currencies: AED, AUD, BGN, BRL, CAD, CHF, CNY, DKK, EUR, GBP, HKD, IDR, INR, JOD, JPY, KES, KRW, MAD, MXN, NOK, NZD, PLN, RON, RUB, SEK, SGD, TRY, USD
localestring**Note – Check your contract for multi-locale support. The locale that the widget should be displayed in. If this locale is not valid/supported, the browsers locale will be used. If that locale is not valid/supported, the default locale for the form will be used. Must be a valid BCP 47 locale tag (eg. de-DE for German). Supported Locales: bg-BG, zh-Hans, zh-Hant, da-DK, nl-NL, en-US, fi-FI, fr-FR, de-DE, it-IT, ja-JP, ko-KR, nb-NO, pl-PL, pt-BR, ro-RO, ru-RU, es-ES, sv-SE

If you are already collecting information from the planner elsewhere on your site, you can prepopulate that information in the form with the following available parameters at the start of form load.

start_rfp is the parameter passed to set the default state of select fields in the application.

PropertyValueNotes
start_rfp. areRoomsRequiredstringDefault value parameter passed to set the default state of My event needs guest rooms in the application. If you know your visitors will have a meeting space only request, you can always default this property to False.  Must be in the format: "true" or "false" For example: start_rfp={"areRoomsRequired":true}
start_rfp. isFunctionSpaceRequiredstringDefault value parameter passed to set the default state of My event needs meeting space in the application. If you know your vistors will have a guest room only request, you can always default this property to False.  Must be in the format: "true" or "false" For example: start_rfp={"isFunctionSpaceRequired":true}
start_rfp.numRoomsstringDefault value parameter passed to set the default state of Rooms Per Night in the application. Must be a valid integer. For example: start_rfp={"numRooms":12}
start_rfp.numAttendeesstringDefault value parameter passed to set the default state of Expected attendees in the application. Must be a valid integer. For example: start_rfp={"numAttendees":3}
start_rfp.startDatestringDefault value parameter passed to set the default state of Start Date in the application. Must be a valid ISO 8601 Date string (eg. 2017-11-16T05:00:00.000Z). For example: start_rfp={"startDate":"2017-11-16T05:00:00.000Z"}
start_rfp.endDatestringDefault value parameter passed to set the default state of End Date in the application. Must be a valid ISO 8601 Date string (eg. 2017-11-16T05:00:00.000Z). For example: start_rfp={"endDate":"2017-11-16T05:00:00.000Z"}
start_rfp.weddingDatestringDefault value parameter passed to set the default state of Wedding Date in the application. Must be a valid ISO 8601 Date string (eg. 2017-11-16T05:00:00.000Z). For example: start_rfp={"weddingDate":"2017-11-16T05:00:00.000Z"}

Note: When implementing your code, be careful of the order in which values are loaded. If you implement the code where it executes prior to the iframe or div tag being added to the DOM, you will likely see JavaScript errors in the console. Be sure to double-check the console frequently so you can identify these issues more quickly.

Sending an RFP to Multiple Venues at a Time

If you have purchased White Label Enterprise, there are four options to consider how website visitors will select one or multiple venue(s) to send an RFP to.

Venue Search: Cvent provides the option to embed a full global search experience to your website powered by Google’s geo-search services and Cvent’s venue content. Please visit Venue Search Implementation for all details.

Checkbox: If you are looking for a simpler approach to venue selection, the checkbox option below feeds multiple property UIDs to the SpeedRFP widget.

HTML

<form id="hotelpicker">

<input type="checkbox" name="hotels" value="XX94N" />XX94N - A Demo Gold Resort

<br /><input type="checkbox" name="hotels" value="JB811" />JB811 - A Demo Property

<br /><input type="checkbox" name="hotels" value="TXS38" />TXS38 - A Demo Resort

</form>

The following JavaScript is needed to fetch the selected venues:

function getHotelUids(){  var uids = "";  var form = document.getElementById("hotelpicker");  for ( i=0; i<form.hotels.length; i++ )  {    if ( form.hotels[i].checked )    {      if ( !form.hotels[i].value ) continue;  // skip blank uids      uids = ( uids ) ?               uids + "," + form.hotels[i].value :               form.hotels[i].value;    }  }    return uids;} 

The following SpeedRFP options are used:

<script type="text/javascript" charset="utf-8">var options = {};options.display = "overlay";options.key = "fc959b6624924310";  options.populateUid = "getHotelUids";options.clear_previous = true; var srfp_widget = new srfp.widget(options);</script>

Explanation of Implementation

The checkbox form above has the id “hotels”. When the user clicks the SpeedRFP button, it will call getHotelUids(). That function returns a comma-delimited string of the selected UIDs. Something like: “XX94N,JB811”

options.populateUid = “getHotelUids”; tells SpeedRFP to call that function any time the SpeedRFP overlay is opened from its native button.

options.clear_previous = true; clears any previous venues selected if a SpeedRFP widget was previously opened which is changed from the default value of false.

Multi-Select: Similar to the checkbox approach, you can provide your website visitors with a process to select from a list of your properties.

HTML

<form id="hotelpicker"> <select name="hotels" id="hotels" multiple size="5">    <option value="" selected>Please choose one or more hotels</option>    <option value="XX94N">XX94N - A Demo Gold Resort</option>    <option value="JB811">JB811 - A Demo Property</option>    <option value="TXS38">TXS38 - A Demo Resort</option></select><button type="button" onclick="useUids();">Use UIDs in multi-select</button></form>

The following JavaScript is used:

function getHotelUids(){  var uids = "";  var hotels = document.getElementById("hotels");  for ( i=0; i<hotels.options.length; i++ )  {    if ( hotels.options[i].selected )    {      if ( !hotels.options[i].value ) continue;       // skip blank uids      uids = ( uids ) ? uids + "," + hotels.options[i].value : hotels.options[i].value;    }  }   return uids;} function useUids(){  srfp_widget.setUid(getHotelUids());  srfp_widget.show();}

The following SpeedRFP options are used:

<script type="text/javascript" charset="utf-8">var options = {};options.display = "overlay";options.key = "fc959b6624924310";  options.populateUid = "getHotelUids";options.clear_previous = true; var srfp_widget = new srfp.widget(options);</script>

Explanation of Implementation: The multi-select form above has the id “hotels”. The user selects the desired hotels, then clicks the “Use UIDs in multi-select” button. This calls the useUids() function, which in turn calls getHotelUids().  getHotelUids() returns a comma-delimited string of the selected UIDs. Something like: “XX94N,JB811”

That string is then passed to the srfp_widget.setUid() method. That tells SpeedRFP what hotels to load into the SpeedRFP form when srfp_widget.show() is called.  We also attach the function getHotelUids() to the SpeedRFP widget itself, using options.populateUid = “getHotelUids”; This tells SpeedRFP to call that function any time the SpeedRFP window is opened.

Additional SpeedRFP Options: We set a few options in our SpeedRFP widget to make this option work:

  • populateUid = “getHotelUids”;
    The name of a function to run before SpeedRFP is loaded. That function should return a string of comma-delimited list of UIDs.
  • clear_previous = true;
    Tells SpeedRFP to clear any previous UIDs already set if a SpeedRFP window was previously opened. Defaults to false.

SpeedRFP Widget Methods

  • setUid() – passes UIDs to the widget
  • show() – reloads the iframe
  • Custom – Lastly, you can replace the SpeedRFP button with your own image, or make a text link open the widget. In the initialization javascript, hide the SpeedRFP button with the following command:

options.button = “none”;

Add an “onclick” handler to any DOM element you want to have clicked to show the SpeedRFP:

onclick=”srfp_widget.show()”

Examples

The following example makes an image show the SpeedRFP widget.

<img src="/path/to/image.png" onclick="srfp_widget.show()" style="cursor:pointer;" />

This example makes a “fake” link that shows the SpeedRFP widget.

Click <span onclick=”srfp_widget.show()” style=”text-decoration:underline; cursor:pointer;” />here</span> to submit an RFP.

In fact, you can use srfp_widget.show() anywhere in your javascript to open the SpeedRFP widget.

Custom Theming and Branding

Some white label contracts include the ability to lightly theme the RFP form to better match the look and feel of your own website.  By default, the widget theme looks like this:

https://rfp.speedrfp.com/?key=f354b4f5020eec43&uid=165R8,123&theme_name=default

Below are the technical specifications to provide for theming, which can be implemented by Cvent’s development team**

  • For the logo (Appears at the top of the RFP form and on customer emails):
    • Should be 250 width. Height is ideally 50 -80 pixels in a height
    • Png file
    • High resolution image render is ideal (at least 72 dpi resolution, preferably 144)
  • For colors:
    • Provide the HEX ID of the color that should be implemented.
    • Typically, we have customer provide one primary color for the following places in the RFP widet.    But we can accommodate a secondary color for hover states if desired.
  • On hover of RFP types
  • RFP type icons
  • Left drawer
  • Pop-up dialogs
  • Primary action buttons
  • Spinner
  • Header form fields on Event Details and Review/Submit screen

If you have further customization requirements, like font changes, or changes to the Venue Search, please contact your Cvent representative to discuss implementation.

Analytics

Out-of-the-Box Implementation with Google Analytics

Using Google Analytics is a great option out of the box to monitor your RFP form’s traffic and a user’s progress through the SpeedRFP process.  We have tags that live on each step in the RFP process, creating a simple RFP conversion funnel for you.  With your own GA account, you can track:

  1. When a website visitor loads the widget
  2. Chooses an RFP form type
  3. Provides their contact details
  4. Fills out event details
  5. Reviews their submission
  6. Confirms their RFP submission (RFP is sent)

If you are interested in this tracking mechanism, you can provide your Google Analytics ID to your Cvent representative.

The process works best if you can create a new web property within Google Analytics for widget tracking.  This will give you a unique web property id that can be used with SpeedRFP.

  1. Sign into Google Analytics, or create an account.
  2. For users with multiple accounts, select the account you want to track SpeedRFP with in the dropdown menu under Google Analytics > Admin > Account.
    NOTE: It’s not necessary to create a new analytics account if you already have one for your website. Just create a new Web Property under your existing account.
  3. To create a new account, select “Create new account” in the dropdown menu under the Google Analytics > Admin > Account.
  4. Fill in the following details:
    • Account Name: SpeedRFP Tracking
    • Web Property Name: SpeedRFP
    • Website’s URL: https://speedrfp.com
    • Industry Category (optional): Choose One
    • Time zone: Your local time zone.
  5. Next, enter your SpeedRFP web property, and click the Tracking ID menu item under Google Analytics > Admin > Property > Tracking Info > Tracking CodeYou should see your Tracking ID: UA-XXXXXXX-XX. That is the code SpeedRFP will need to connect Google Analytics to your SpeedRFP web form.

Goal and Funnel Visualization

To better gauge how people use your SpeedRFP form, you can set up goals. Goals will track how many people reach the SpeedRFP confirmation page. Once a SpeedRFP goal is created, you can view a funnel to view how many people use each page leading to the goal.

Quick goal setup link: https://www.google.com/analytics/web/template?uid=FCxlxwFuSGqbxPbSKJ3B1w

Note: After you click the quick setup link above you’ll have to select the correct account & web property to apply your goal. By default web properties are named “All Web Site Data” under new accounts.

Viewing Goal and Funnel Results

Goal results should appear within 24 hours.

  • Visit Google Analytics > Home and your select your newly created “Speed RFP Tracking” web property (“All Web Site Data”) to view your analytics.
  • To view traffic, click on Behavior > Site Content > All Pages
  • To view goals, click on Conversions > Goals > Overview
  • To view a conversion funnel, click on Conversions > Goals > Funnel Visualization

Custom Analytics Implementation

If you are looking to track data in a more custom or robust way, or if you use a tag management system to track data from different analytics tools, you may be more interested in our “custom tracking” offering.

You can provide Cvent with an HTML and/or JavaScript code snippet, allowing for anonymous user tracking of the widget.  Once provided, since the path gives a lot of control on both our product performance and security standards, Cvent has established a process to manually approve these snippets before they go live.

If this path is chosen, you are required to display your own site’s privacy policy in addition to SpeedRFP’s policy within the widget.   Please provide your privacy policy URL when submitting your tracking code to your Cvent representative.

Example Code:

<script>

function trackRfpVenue() {

var listOfVenueIds = Object.keys(window.analyticalData.venuesAttached);

var location = window.compatibleLocation;

var selectedVenueId = listOfVenueIds[0];

var currentVenueName = window.analyticalData.venuesAttached[selectedVenueId].name;

console.log('current venue - '+currentVenueName);

if ( location != undefined && location.length > 0) {

ga( 'send', 'event', 'RFP', location, currentVenueName );

} else {

console.log('location is undefined or empty');

}

}

function callGoogleAnalyticsIfAvailable() {

if (typeof ga === 'function') {

trackRfpVenue();

} else {

console.log('Not loaded');

setTimeout(callGoogleAnalyticsIfAvailable, 1000);

}

}

callGoogleAnalyticsIfAvailable();

</script>

<!—Net Conversion Google Tag Manager -->

<noscript>

<iframe src=”www.googletagmanager.com...” height="0" width="0" style="display:none;visibility:hidden"></iframe>

</noscript>

<script>

<Net Conversion Code here>

</script>

<!-- End Net Conversion Google Tag Manager -->

<!-- Google Tag Manager -->

<script>

<Google Tag Manager Script Here>

</script>

<!-- End Google Tag Manager -->

<script>

ga('set', '<Google Analytics Variable Here>',  window.analyticalData.venuesAttached.uid);

</script>

In the RFP Form, we track on several events which we can then report to you. Trackable events include:

  • When the user loads the form
  • When the user selects their RFP type
  • When the user begins entering contact details
  • When the user begins entering meeting details
  • When the user is reviewing their event details
  • When the user has clicked the “Submit” button

For each of these events, we can track along the following anonymous criteria:

  • Which event was tracked (corresponds to the list above)
  • When the trackable event occurred
  • The access key for the form
  • The list of venues attached at the time the trackable event occurred
    • The ID internal to SpeedRFP (called the UID)
    • The ID provided by the customer (called the external ID)
    • The name of the venue
    • The city of the venue
    • The state/province of the venue (if one is defined)
    • The country of the venue

Variables

Below are the variables available to your custom code. These are made available to you for the purpose of tracking through the RFP funnel.

window.compatibleLocation: This variable attempts to deliver backwards-compatible representations of the URL, even though the URL does not change.

Values

window.analyticalData.eventType

This is the type of event being planned by the user. Possible values include:

– MEETING

– WEDDING

– SPECIAL_EVENT

window.analyticalData.widgetPath

This value indicates the path being used by the planner as they enter the RFP.

– NEW – This is a new RFP

– COPY – This is a new RFP which is copying an existing RFP

– ADD – New venues are being added to an existing RFP

window.analyticalData.venuesAttached

This is an object with key/value pairs having details about the venues attached to the event. There may be multiple entries in this object, but there will never be duplicates.

The shape of this object looks something like what you see below:

For this object, the properties are the UID values for each property. The value of each property will be an object containing metadata about the venue:

  • uid – The UID value for the property; this will always match the property name for the top-level object
  • city – The city in which the hotel is located
  • state – The state in which the hotel is located
  • country – The country in which the hotel is located
  • externalId – If the property was configured to use an “external ID” (meaning an ID which is internal to the hotel or chain, but external to SpeedRFP), that value will appear here
  • name – The name of the venue

window.analyticalData.timeOf-Event

This is a JavaScript Date instance of the time at which the event occurred. It is unlikely that this will differ from the time at which the event was triggered, but if latency is a concern for you then this value may be of use to you.

Note: For RFP Form tracking, your code snippet will be forcibly reloaded for each tracking event. If your code uses window-scoped variables then you will likely need to refactor.  If you use cookies to maintain state, please consider the impact that this will have on your privacy policy.

In the URL used to open the iframe, you can pass in a query parameter named analytics. This parameter should have the value of a JSON string/object.  This will get bundled with any variables defined in the documentation and be available and accessible for the custom tracking snippet.

Testing

Cvent recommends you test your code snippet in a testing area prior to deploying it to your production website.

In addition, if you choose to, you can receive a testing code snippet from Cvent in our lower environment, demo.speedrfp.com, before receiving your production code snippet.  If you need to test analytics, the demo.speedrfp.com region will support testing of analytics as well as creating RFPs. This is only available for one test property.  Please reach out to your Cvent representative for this code if desired.

Not a Developer? Get started here