text:
Welcome to the documentation for the GameAnalytics REST API. ⚡
A Collector is a GameAnalytics server (one of many) that receive and collect game events being submitted using the HTTP protocol.
All official GameAnalytics SDK's are using this same API.
api basicsCopy link to clipboard
Game KeysCopy link to clipboard
The following keys are needed when submitting events.
- game key
- secret key
The game key is the unique identifier for the game.
The secret key is used to protect the events from being altered as they travel to our servers.
To obtain these keys it is needed to register/create your game at our GameAnalytics tool. Locate them in the game settings after you create the game in your account.
API EndpointsCopy link to clipboard
HTTP and HTTPS are supported.
Data is submitted and received as JSON strings.
Gzip is supported and strongly recommended.
API endpoint for production api.gameanalytics.com
API endpoint for sandbox sandbox-api.gameanalytics.com
- Use the sandbox-api endpoint and sandbox keys during the implementation phase.
- Switch to the production endpoint and production keys once the integration is completed.
Create your production keys in our GameAnalytics tool.
Do not use production keys on the sandbox-api; it will only authorise the sandbox game keys.
Sandbox Keys
|Game Key
|Secret Key
Event ProcessingCopy link to clipboard
Events will be registered at the realtime dashboard after a few minutes.
Once the time reaches 00:00 UTC all events for yesterday (the last 24hours) will be aggregated and thereby visible in all other areas of our tool.
GzipCopy link to clipboard
It is highly recommended to gzip the data when submitting.
- Set the header Content-Encoding header to gzip
- Gzip the events JSON string and add the data to the POST payload
- Calculate the HMAC Authorization header using the gzipped data
The collector has a POST size limit of 1MB.
Read more on the troubleshooting section.
Look at the code example for gzip and HMAC in python below. We also provide a full example with python at the end of this document.
import gzip from StringIO import StringIO import base64 import hmac import hashlib events_JSON_test = '["test":"test"]' game_secret = '16813a12f718bc5c620f56944e1abc3ea13ccbac' def get_gzip_string(string_for_gzip): zip_text_file = StringIO() zipper = gzip.GzipFile(mode='wb', fileobj=zip_text_file) zipper.write(string_for_gzip) zipper.close() enc_text = zip_text_file.getvalue() return enc_text def hmac_auth_hash(body_string, secret_key): return base64.b64encode(hmac.new(secret_key, body_string, digestmod=hashlib.sha256).digest()) # the gzipped payload gzipped_events = get_gzip_string(events_JSON_test) # the HMAC hash for the Authorization header HMAC_from_gzip_contents = hmac_auth_hash(gzipped_events, game_secret)
AuthenticationCopy link to clipboard
Authentication is handled by specifying the Authorization header for the request.
The authentication value is a HMAC SHA-256 digest of the raw body content from the request using the secret key (private key) as the hashing key and then encoding it using base64.
Look at the code examples for shell, python and C#.
echo -n '' | openssl dgst -binary -sha256 -hmac "" | base64
import base64 import hmac import hashlib def hmac_auth_hash(body_string, secret_key): return base64.b64encode(hmac.new(secret_key, body_string, digestmod=hashlib.sha256).digest()) # use example below to verify implementation on other platforms # body_string = '{"test": "test"}' # secret_key = '16813a12f718bc5c620f56944e1abc3ea13ccbac' # hmac_auth_hash(body_string, secret_key) = 'slnR8CKJtKtFDaESSrqnqQeUvp5FaVV7d5XHxt50N5A='
using System.Security.Cryptography; private string GenerateHmac (string json, string secretKey) { var encoding = new System.Text.UTF8Encoding(); var messageBytes = encoding.GetBytes(json); var keyByte = encoding.GetBytes(secretKey); using (var hmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash (messageBytes); return System.Convert.ToBase64String (hashmessage); } }
HeadersCopy link to clipboard
|The authentication hash.
|Content Type
|Content Encoding
|Optional. Set only if payload is gzipped.
|Content Length
|[ length of payload ]
|Optional. Set if possible.
routesCopy link to clipboard
2 routes are supported.
- Init
- Events
The API version is part of the URL. Currently it's v2.
Replace the <game_key> in the URL with your specific game key.
Validation for JSON body content is described later in the documentation.
Init / Remote configsCopy link to clipboard
The init call should be requested whenever a new session starts or at least when the game is launched.
Use the init call to retrive remote configs, A/B testing id, A/B testing variant id and to adjust client timestamp.
First run (no configs hash)
POST /remote_configs/v1/init?game_key=<game_key>&interval_seconds=<int>
On first run when you haven't have received a configs hash yet send the init request without the configs_hash parameter.
After first run (using configs hash)
POST /remote_configs/v1/init?game_key=<game_key>&interval_seconds=<int>&configs_hash=<configs_hash>
The response from the first init request will contain a configs_hash value which you need to save for the next time you send the init request.
POST /remote_configs/v1/init?game_key=<game_key>&interval_seconds=<int> HTTP/1.1 Host: sandbox-api.gameanalytics.com Authorization: <authorization_hash> Content-Type: application/json {"user_id":"[user_id]","platform":"ios","os_version":"ios 8.1","sdk_version":"rest api v2","build":"1.0.0"} HTTP/1.1 201 Created Connection: Keep-Alive Content-Type: application/json Access-Control-Allow-Origin: * X-GA-Service: collect Access-Control-Allow-Headers: Authorization, X-Requested-With {"server_ts":1546300000,"configs":[{"key":"enable_rocket_launcher","value":"true","end_ts":null},{"key":"gravity","value":"80","start_ts":1546300111,"end_ts":null},{"key":"mushroom_power","value":"32","end_ts":1546399999}],"configs_hash":"1448877966322221","ab_id":"1234","ab_variant_id":"1234variant"}
curl -vv -H "Authorization: <authorization_hash>" -d '{"user_id":"[user_id]","platform":"ios","os_version":"ios 8.1","sdk_version":"rest api v2","build":"1.0.0"}' http://sandbox-api.gameanalytics.com/remote_configs/v1/init?game_key=<game_key>&interval_seconds=<int>
import json import urllib2 game_key = '5c6bcb5402204249437fb5a7a80a4959' url_init = 'http://api.gameanalytics.com/remote_configs/v1/init?game_key=' + game_key + '&interval_seconds=0' init_payload = { 'user_id': '[USER_ID]', 'platform': 'ios', 'os_version': 'ios 8.1', 'sdk_version': 'rest api v2', 'build': '1.0.0', } init_payload_json = json.dumps(init_payload) headers = { 'Authorization': hmac_auth_hash(init_payload_json, secret_key), 'Content-Encoding': 'application/json' } try: request = urllib2.Request(url_init, init_payload_json, headers) response = urllib2.urlopen(request) except: print "Init request failed!"
using System.Security.Cryptography; using System.Collections.Generic; // Unity C# example using the WWW class void Start () { var encoding = new System.Text.UTF8Encoding(); // json payload string json = "{\"platform\":\"ios\", \"os_version\":\"ios 8.1\", \"sdk_version\":\"rest api v2\", \"build\":\"1.0.0\"}"; byte[] jsonByteData = encoding.GetBytes(json); // sandbox-api string gameKey = "5c6bcb5402204249437fb5a7a80a4959"; string secretKey = "16813a12f718bc5c620f56944e1abc3ea13ccbac"; string url = "http://sandbox-api.gameanalytics.com/remote_configs/v1/init?game_key=" + gameKey + "&interval_seconds=0"; string HmacAuth = GenerateHmac (json, secretKey); // create headers Dictionary<string, string> headers = new Dictionary<string, string>(); headers.Add("Content-Type", "application/json"); headers.Add("Authorization", HmacAuth); headers.Add("Content-Length", json.Length.ToString()); WWW www = new WWW(url, jsonByteData, headers); StartCoroutine(WaitForRequest(www)); } IEnumerator WaitForRequest(WWW www) { yield return www; // check for errors if (www.error == null) { Debug.Log("WWW Ok!: " + www.text); } else { Debug.Log("WWW Error: "+ www.error); } }
The POST request should contain a valid JSON object as in the body containing the following fields.
Query string
|String. The game key expressed in lower case hexadecimal alphabet
|Int. The duration of the requested effective range interval in seconds as a non-negative integer. An absent value will be interpreted as 0. If the interval is 0 then a configuration for the timestamp_start instant will be returned.
|String. optional 'configs_hash' value that might have been returned in a previous request to Remote Config service.
JSON body
|A unique identifier of the user. This is used detect if the user for A/B testing
|A string representing the platform of the SDK, e.g. "ios"
|A string representing the OS version, e.g. "ios 8.1"
|Custom solutions should ALWAYS use the string "rest api v2"
|Optional. Build version of the app.
|Random salt used for encryption.
Server responses
A "big response" with HTTP 201 Created, or "small response" with HTTP 200 OK, if the 'configs_hash' indicates that the SDK still holds the relevant version of the configuration.
The server response is a JSON object with the following fields.
|Int (epoch). Server time to adjust for faulty client clock. Always returned.
|Array. An array of SDK configuration objects. Not used at the moment. In the future this could contain flags set by GA servers to control SDK behaviour. Make sure the code does not break if this contain values in the future. Only sent for HTTP status 201.
|– key
|String. key. Only sent for HTTP status 201.
|– value
|String. value. Only sent for HTTP status 201.
|– start_ts
|Int (epoch). Start timestamp for configuration. Only sent for HTTP status 201.
|– end_ts
|Int (epoch). End timestamp for configuration. Only sent for HTTP status 201.
|String. Configs hash. Save for next time calling init request. Only sent for HTTP status 201.
|String. A/B testing id. Only added if part of an A/B testing experiment. Only sent for HTTP status 201.
|String. A/B testing variant id. Only added if part of an A/B testing experiment. Only sent for HTTP status 201.
Example responses
A user does not participate in an experiment. Only Global configs are received.
HTTP 201 Created { "server_ts": 1546300000, "configs": [ { "key": "enable_rocket_launcher", "value": "true", "end_ts": null }, { "key": "gravity", "value": "80", "start_ts": 1546300111, "end_ts": null }, { "key": "mushroom_power", "value": "32", "end_ts": 1546399999 } ], "configs_hash": "1448877966322221" }
A user participates in an experiment. Only variant config is received (no Global configs).
HTTP 201 Created { "server_ts": 1546300000, "configs": [ { "key": "background_color", "value": "#ff0000", "end_ts": null } ], "configs_hash": "124595093888900", "ab_id": "aaabc", "ab_variant_id": "1" }
A user is in the control group. No configs are received, only experiment and variant IDs.
HTTP 201 Created { "server_ts": 1546300000, "configs": [], "configs_hash": "3105646955558893", "ab_id": "aaabc", "ab_variant_id": "ctrl" }
The 'configs_hash' hasn't changed. SDK should follow the Configs from the last response.
HTTP 200 OK { "server_ts": 1546300000 }
Adjust client timestamp
The server_ts should be used if the client clock is not configured correctly.
- Compare the value with the local client timestamp.
- Store the offset in seconds.
- Use this offset whenever an event is added to adjust the local timestamp (client_ts) for the event
EventsCopy link to clipboard
POST /v2/<game_key>/events
The events route is for submitting events.
The POST body payload is a JSON list containing 0 or more event objects. Like this example:
[ { "category": "user", "[event_fields]": "[event_values]" }, { "category": "business", "[event_fields]": "[event_values]" } ]
Events always need to be in a list even if you are sending only 1 event.
An event object contain all data related to a specific event triggered. Each type of event is defined by a unique category field and each require specific fields to be defined.
If the status code 200 is returned then the request succeeded and all events were collected.
Read more about error responses (looking for the reason when validation should fail) in the troubleshooting guide.
When your game implementation is running it should cache events (local db recommended) and periodically (each 20 seconds for example) submit all stored events using the events route.
When offline the code should also queue events and submit once the connection is restored. Recommended to define a maximum size for the cache that (when exceeded) will activate a trim deleting all events for the oldest sessions.
POST /v2/<game_key>/events HTTP/1.1 Host: sandbox-api.gameanalytics.com Authorization: <authorization_hash> Content-Type: application/json [ {"category": "user", "<event_fields>": ""}, {"category": "business", "<event_fields>": ""} ]
HTTP/1.1 200 OK Connection: Keep-Alive Content-Type: application/json Access-Control-Allow-Origin: * X-GA-Service: collect Access-Control-Allow-Headers: Authorization, X-Requested-With
curl -vv -H "Authorization: <authorization_hash>" -d '[, ]' http://sandbox-api.gameanalytics.com/v2/<game_key>/events
[ {"category": "user", "[event_fields]": "[event_values]"}, {"category": "business", "[event_fields]": "[event_values]"} ]
import json import urllib2 game_key = '5c6bcb5402204249437fb5a7a80a4959' url_events = 'http://sandbox-api.gameanalytics.com/v2/' + game_key + '/events' events_payload = [ {"category": "progression"}, # + more event object fields {"category": "business"} # + more event object fields ] events_payload_json = json.dumps(events_payload) headers = { 'Authorization': hmac_auth_hash(events_payload_json, secret_key), 'Content-Encoding': 'application/json' } try: request = urllib2.Request(url_init, events_payload_json, headers) response = urllib2.urlopen(request) except: print "Events request failed!"
ExamplesCopy link to clipboard
Try it yourself now!
Install the Postman app or Chrome extension and click the button to import some request examples to run.
event typesCopy link to clipboard
Events are JSON objects with a certain set of required fields as well as optional fields. The exact requirements of a valid event depends on its category. Here are the available categories (event types).
- user (session start)
- session_end
- business
- progression
- resource
- design
- error
All the events share (inherit) a list of fields that we call the default annotations.
Each event has unique fields defining the event. But all events need to include shared fields called default annotations.
The default annotation fields define information like os_version, platform etc. and they need to be included in each event object. Some are required and some are optional.
It is recommended to create a method collecting the shared default annotations and returning a dictionary. When an event is triggered this method should be called and the specific event fields (for the event type) should be added to the dictionary. The merged dictionary is then used to create the JSON event object.
|Validation Type
|short string
|examples: "iPhone6.1", "GT-I9000". If not found then "unknown".
|Reflects the version of events coming in to the collectors. Current version is 2.
|Use the unique device id if possible. For Android it's the AID. Should always be the same across game launches.
|client ts integer
|Timestamp when the event was created (put in queue/database) on the client. This timestamp should be a corrected one using an offset of time from server_time.
|sdk version
|The SDK is submitting events to the servers. For custom solutions ALWAYS use "rest api v2".
|os version
|Operating system version. Like "android 4.4.4", "ios 8.1".
|short string
|Manufacturer of the hardware the game is played on. Like "apple", "samsung", "lenovo".
|The platform the game is running. Platform is often a subset of os_version like "android", "windows" etc.
|session id
|Generate a random lower-case string matching the UUID format. Example:
|unsigned integer
|The SDK should count the number of sessions played since it was installed (storing locally and incrementing). The amount should include the session that is about to start.
|Send true if detected. Very important to always check this when using iOS idfa.
|Send true if detected. Logged in to GameCenter.
|Send true if detected. Logged in to Google Play.
|If detected that device is jailbroken (hacked) or not. Should only be sent when true
|Send this if on Android and the google_aid is not available (e.g. Android phones without the play store)
|Send if found.
|Send if found. Should be stored cross-session and sent along always after that.
|short string
|Send Custom dimension 1 if that is currently active/set.
|short string
|Send Custom dimension 2 if that is currently active/set.
|short string
|Send Custom dimension 3 if that is currently active/set.
|short string
|Send if needed. A build version. Should be set before any events are sent.
|engine version
|Send if using engine. examples: "unreal 4.7" or "unity 5.6.10"
|Send if iOS. Apple's identifier for vendors. This is unique per app/game.
|connection type string
|Send if found. This will give the connection status of a device – how the device is connected to the internet (or if not). (offline, wwan, wifi, lan)
|Send if iOS. Apple's identifier for advertisers. This is the same across apps/games. Send this always (on iOS) and make sure to ALWAYS check if user has enabled "limited_ad_tracking". If so then add the field mentioned elsewhere and targeting for that idfa will not happen.
|Send if Android. Google's identifier for advertisers. This is the same across apps/games. Read more about it here.
Do something like the following to track this value.
- Use a persistent DB like SqlLite for storing queued events and other information.
- Create a table called key_value with key & value columns. Use this column for storing all variables cross game-launch.
- For counting session number use a key called session_num.
- When a session is started this row should be retrieved. Increment the value and update row.
custom_01, custom_02, custom_03
Read more about Custom Dimensions here.
JSON validation schema.
The collector servers will validate these fields and reject any event not passing.
User (session start)Copy link to clipboard
As session is the concept of a user spending a period of time focused on a game.
The user event acts like a session start. It should always be the first event in the first batch sent to the collectors and added each time a session starts.
|Unique Limit
+ add the default annotation fields
JSON validation schema.
The collector servers will validate these fields and reject any event not passing.
{ "description": "Schema for user event", "id": "user", "type": "object", "extends": "shared", "properties": { "category": { "type": "string", "required": true, "pattern": "^user$" } } }
Session endCopy link to clipboard
Whenever a session is determined to be over the code should always attempt to add a session end event and submit all pending events immediately.
Only one session end event per session should be activated.
|Session length in seconds
+ add the default annotation fields
On mobile devices the session normally stops when a user tap the home button and the app is not visible.
On certain phones (like Android) there is also a pause and stop event where the session will end on stop but also if pause has been active for 20 seconds or so.
Different platforms implement varying behaviour but all with the same goal – to end the session when the user is no longer focused on the game.
Session length
Session length is the amount of seconds spent focused on a game. Whenever a session starts the current timestamp should be stored in a variable. When session end is triggered this values is used to calculate the session length.
Detecting missing session end on game launch
Sometimes the session end event could not be added as the game closed without giving time to finish processing. It is recommended to implement code that is able to detect this on game launch and add the missing session end with correct session length.
This should be solved using a local storage that will work cross session/game-launch. In our official SDK implementation we use SqlLite. The following practise describe how to detect and submit a missing session end.
- Use a persistent DB like SqlLite for storing queued events and other information.
- Create a table called session_end with the columns session_start_ts, session_id & last_event_default_annotations.
- Each time (in that session) an event is added to the queue (excluding session end) this row is updated on the column last_event_default_annotations containing the shared default annotations for the particular event (including the field client_ts for the event). If the event added is a session end, then simply delete the row matching the session.
- On game launch query the session_end table. If an entry exists then there is a session that did not have time to add a session end. Look inside the last_event_default_annotations and find client_ts. Use that value with the session_start_ts to calculate session length. Use the last_event_default_annotations to create the session end event. Add event and submit.
JSON validation schema.
The collector servers will validate these fields and reject any event not passing.
{ "description": "Schema for session end event", "id": "session_end", "type": "object", "extends": "shared", "properties": { "length": { "type": "integer", "minimum": 0, "maximum": 172800, "required": true }, "category": { "type": "string", "required": true, "pattern": "^session_end$" } } }
BusinessCopy link to clipboard
Business events are for real-money purchases.
|A 2 part event id.
❗ Read about unique value limitations here.
|The amount of the purchase in cents (integer)
|Currency need to be a 3 letter upper case string to pass validation.
In addition the currency need to be a valid currency for correct rate/conversion calculation at a later stage. Look at the following link for a list valid currency values. http://openexchangerates.org/currencies.json.
|Similar to the session_num. Store this value locally and increment each time a business event is submitted during the lifetime (installation) of the game/app.
|A string representing the cart (the location) from which the purchase was made. Could be menu_shop or end_of_level_shop.
❗ Read about unique value limitations here.
|A JSON object that can contain 3 fields: store, receipt and signature. Used for payment validation of receipts. Currently purchase validation is only supported for iOS and Android stores.
For iOS the store is apple and the receipt is base64 encoded. For Android the store is google_play and the receipt is base64 encoded + the IAP signature is also required.Look at the validation schema later to see the structure of this receipt_info object.
+ add the default annotation fields
itemType & itemId
The itemType is like a category/folder for items and the ItemId is an identifier for what has been purchased. They are separated by a semicolon.
- BlueGemPack:GameAnalytics.blue_gems_50
- BlueGemPack:GameAnalytics.blue_gems_100
- BlueGemPack:GameAnalytics.blue_gems_500
- Boost:MegaBoost
- Boost:SmallBoost
In the GameAnalytics tool it is possible to select the itemId and get detailed information. But it is also possible to select the itemType and thereby get aggregated values for all itemIds within. This could be visualised like a histogram for each or simply showing the total revenue for all BlueGemPacks over time.
Transaction number
Do something like the following to track this value:
- Use a persistent DB like SqlLite for storing queued events and other information.
- Create a table called key_value with key value columns. Use this column for storing all variables cross game-launch.
- For the counting transactions use a key called transaction_num.
- Each time a business event is triggered this row is retrieved, value is incremented and row is updated.
Purchase validation
The result of validating receipts is monetization metrics being divided into valid and non-valid in the GameAnalytics tool.
Currently purchase validation is only supported for iOS and Android stores. We are working on adding more ways (stores) for validating purchases. This feature is not meant to provide validation inside the game to block hackers. It is intended to provide valid numbers in GameAnalytics by flagging business events from monetizer hacks. Simply exclude the receipt_info field when using stores that are not supported yet.
JSON validation schema.
The collector servers will validate these fields and reject any event not passing.
{ "description": "Schema for business event", "id": "business", "type": "object", "extends": "shared", "properties": { "amount": { "type": "integer", "required": true }, "currency": { "type": "string", "pattern" : "^[A-Z]{3}$", "required": true }, "event_id": { "type": "string", "pattern" : "^[A-Za-z0-9\\s\\-_\\.\\(\\)\\!\\?]{1,64}:[A-Za-z0-9\\s\\-_\\.\\(\\)\\!\\?]{1,64}$", "required": true }, "cart_type": { "type": "string", "maxLength" : 32, "required": false }, "transaction_num": { "type": "integer", "minimum": 0, "required": true }, "category": { "type": "string", "required": true, "pattern": "^business$" }, "receipt_info": { "type": "object", "required": false, "properties": { "receipt": { "type": "string", "required": true }, "store": { "type": "string", "required": true, "pattern": "^apple|google_play|unknown$" }, "signature": { "type": "string", "required": false } } } } }
ResourceCopy link to clipboard
Resource events are for tracking the flow of virtual currency registering the amounts users are spending (sink) and receiving (source) for a specified virtual currency.
|A 4 part event id string.
❗ Read about unique value limitations here.
|The amount of the in game currency (float). This value should be negative if flowType is Sink. For instance, if the players pays 100 gold for a level, the corresponding resource event will have the amount -100 added in this field.
+ add the default annotation fields
Flow type is an enum with only 2 possible string values.
- Sink means spending virtual currency on something.
- Source means receiving virtual currency from some action.
A custom string defining the type of resource (currency) used in the event. Some examples of possible values.
- Boost
- Coins
- Gems
- Lives
- Stars
itemType & itemId
The itemType functions like a category for the ItemId values.
The purpose/meaning of these values are different when using Sink or Source.
- Sink item values should represent what the virtual currency was spent on.
- Source item values should represent in what way the virtual currency was earned.
|Life used to play level
|Star used to continue level
|Gold spent to buy rainbow boost
|Earned a life by watching a video ad
|Bought gold with real money*
* When buying virtual currency for real money a business event should also be sent.
The resource event should not be spammed. Imagine an infinite runner game where coins are picked up quickly. Instead of submitting an event on each coin pickup the code should collect the gathered coins until the level is over and submit the amount.
JSON validation schema.
The collector servers will validate these fields and reject any event not passing
{ "description": "Schema for resource event", "id": "resource", "type": "object", "extends": "shared", "properties": { "event_id": { "type": "string", "pattern" : "^(Sink|Source):[A-Za-z]{1,64}:[A-Za-z0-9\\s\\-_\\.\\(\\)\\!\\?]{1,64}:[A-Za-z0-9\\s\\-_\\.\\(\\)\\!\\?]{1,64}$", "required": true }, "amount": { "type": "number", "required": true }, "category": { "type": "string", "required": true, "pattern": "^resource$" } } }
ProgressionCopy link to clipboard
Progression events are used to track attempts at completing levels in order to progress in a game. There are 3 types of progression events.
- Start
- Fail
- Complete
|A 2-4 part event id.
❗ Read about unique value limitations here.
|The number of attempts for this level. Add only when Status is "Complete" or "Fail". Increment each time a progression attempt failed for this specific level.
|An optional player score for attempt. Only sent when Status is "Fail" or "Complete".
+ add the default annotation fields
The progression evnetId will end up in the tool as a selectable metric with drilldown into a hierarchy. For example…
- Progression > Fail > PirateIsland > Sandyhills View Fails on specific level SandyHills on PirateIsland.
- Progression > Complete > PirateIsland > (all). View Completes for all levels on PirateIsland.
It is possible to use 1, 2 or 3 values depending on your game. For example…
- PirateWorld:PirateIsland:SandyHills
- PirateIsland:SandyHills
- SandyHills
The Start progression event should be called when a user is starting an attempt at completing a specific level. The attempt will stop once Fail or Complete is called.
When a Start event is called the progression event_id (excluding the progression status) should be stored locally. For example Start:PirateIsland:SandyHills should store PirateIsland:SandyHills locally.
If the Start event is called when there is an ongoing attempt already in progress the code should add a Fail event for that attempt, before adding the new Start event.
The Fail progression event should be called when a user did not complete an ongoing level attempt. Add a score value if needed.
- The user ran out of time or did not get enough points. Score screen is often shown.
- The user is exiting the game.
- A Start event was called during an ongoing attempt.
The Complete progression event should be called when a user did complete a level attempt. Add a score value if needed.
Handling attempt_num
The attempt_num is the number of times the user performed an attempt at completing a specific level (tracked for each progression event id). Once a complete is registered the counting is reset. Do something like the following to track the incrementing of progression attempts.
- Use a persistent DB like SqlLite for storing queued events and other information.
- Create a table called progression with progression_event_id attempt_num columns.
- On progression Fail look inside the table for the specified progression_event_id
- if it's there then increment attempt_num for the row by 1 and use this value in the event
- if it's not there then create row for progression_event_id with attempt_num equal to 1 and use 1 in the event
- On progression Complete look inside the table for the specified progression_event_id
- if it's there then get the attempt_num value, use this value+1 in the event and delete the row
- if it's not there then use 1 as the attempt_num
JSON validation schema.
The collector servers will validate these fields and reject any event not passing.
{ "description": "Schema for progression event", "id": "progression", "type": "object", "extends": "shared", "properties": { "event_id": { "type": "string", "pattern" : "^(Start|Fail|Complete):[A-Za-z0-9\\s\\-_\\.\\(\\)\\!\\?]{1,64}(:[A-Za-z0-9\\s\\-_\\.\\(\\)\\!\\?]{1,64}){0,2}$", "required": true }, "attempt_num": { "type": "integer", "minimum": 0, "required": false }, "score": { "type": "integer", "required": false }, "category": { "type": "string", "required": true, "pattern": "^progression$" } } }
DesignCopy link to clipboard
Every game is unique! Therefore it varies what information is needed to track for each game. Some needed events might not be covered by our other event types and the design event is available for creating a custom metric using an event id hierarchy.
|A 1-5 part event id.
❗ Read about unique value limitations here.
|Optional value. float.
+ add the default annotation fields
GamePlay:Kill:[monster_type] and value equal to points gained. In the GameAnalytics explore tool you can now select the following metrics.
|Metric Selection
|GamePlay (all)
|Show all count/sum etc. from all events beneath GamePlay. These metrics are not that useful, but GamePlay is defined as a group to contain all gameplay related metrics. Other root groups could be Ads, Performance, UI etc.
|GamePlay:Kill (all)
|Show count/sum etc. for all things tracked under GamePlay:Kill. Show either aggregated count/sum over time or histogram with bars for each monster_type. All points earned by killing (over time), the average points earned by killing (over time) or number of times something was killed (count).
|As the above, but only showing the specific monster_type.
|GamePlay:Kill:(AlienSmurf + HumanRaider)
|almost same as above. Show both AlienSmurf and HumanRaider values in chart and values.
This example was a simple part of what the Explore tool can provide. Design events are used for many other things like Funnels, Segments, Cohorts etc.
The design events grant more freedom for deep hierarchies and therefore these have a limitation; custom dimension and progression filters will not work on design events. Therefore you cannot (at the moment) filter a selected design event metric by custom or progression dimensions in the tool.
Read more about limits, creating optimal event id's and what you should track at our documentation page here.
The design event id structure (with the colon separation) represents a tree hierarchy. It is very important to not generate an excessive amount of unique nodes possible in the event hierarchy tree.
A bad implementation example.
Potential unique values for each.
monster_type=100 armor_used=300 weapon_used=300 damage_done=5000
100 * 300 * 300 * 5000 = 45.000.000.000 possible nodes.
This is far too many.
The damage should be put as a value and not in the event string. Even though we remove the damage string it will still be 90M nodes. The processing will be blocked when doing this and could cause other problems when browsing our tool.
Only use deep hierarchies when using values with a small distinct pool of possible values. Do NOT use any dynamic values inside the string like timestamps or other data that change over time.
The maximum amount of unique nodes generated should be around 10k.
JSON validation schema.
The collector servers will validate these fields and reject any event not passing.
{ "description": "Schema for design event", "id": "design", "type": "object", "extends": "shared", "properties": { "event_id": { "type": "string", "pattern" : "^[A-Za-z0-9\\s\\-_\\.\\(\\)\\!\\?]{1,64}(:[A-Za-z0-9\\s\\-_\\.\\(\\)\\!\\?]{1,64}){0,4}$", "required": true }, "value": { "type": "number", "required": false }, "category": { "type": "string", "required": true, "pattern": "^design$" } } }
ErrorCopy link to clipboard
An Error event should be sent whenever something horrible has happened in your code – some Exception/state that is not intended.
The following error types are supported:
- debug
- info
- warning
- error
- critical
Do not send more than 10 error events pr. game launch!
The error events can put a high load on the device the game is running on if every Exception is submitted. This is due to Exceptions having a lot of data and that they can be fired very frequently (1000/second is possible).
The GameAnalytics servers will block games that send excessive amounts of Error events.
Simple solution
Keep track of how many is sent and stop sending when the threshold is reached.
More advanced
Keep track of each type of Exception sent in a list. If an error event match a type already sent then ignore. If 10 types have been sent then stop sending. This will ensure that 10 similar Error events fired quickly will not result in other types not being discovered.
The idea is that developers should discover an error in the GameAnalytics tool and then fix the cause by submitting a new version of the app. Even with the limit of 10 error events this should still be possible.
|The type of error severity.
|Stack trace or other information detailing the error. Can be an empty string.
+ add the default annotation fields
The error event support large stack traces and therefore these events have a limitation; custom dimension and progression filters will not work on error events. Therefore you cannot (at the moment) filter a selected error event metric by custom or progression dimensions in the tool.
JSON validation schema.
The collector servers will validate these fields and reject any event not passing.
{ "description": "Schema for error event", "id": "error", "type": "object", "extends": "shared", "properties": { "severity": { "type": "enum", "enum": [ "debug", "info", "warning", "error", "critical" ], "required": true }, "message": { "type": "string", "maxLength" : 8192, "required": true }, "category": { "type": "string", "required": true, "pattern": "^error$" } } }
custom dimensionsCopy link to clipboard
Example for tracking player classCopy link to clipboard
player changes class to ninja and this is registered locally (variable and local db) as custom_01
an event is triggered and custom_01 value is set in the event
player changes class to wizard and this is registered locally (variable and local db) as custom_01
an event is triggered and custom_01 value is set in the event
session is ending and the session end event also get the custom_01 value
session starts (for example game launch)
custom_01 (+ the other 2) is retrieved from local db (if found)
- the user event (session start) get the retrieved custom_01 value added
- an event is triggered and custom_01 value is set in the event
- player removes class and custom_01 is set to empty (also in db)
- Custom_01 is not added on any further events
This will allow dimension custom_01 to have the filter values ninja and wizard available for selection in the tool. For example visualising Daily Active Users (DAU) filtered by players who were playing a ninja.
ℹ Use only custom dimensions if the need is for filtering all other data. Often a design event is a much better fit and will not use the more expensive and limited custom dimensions. Use a design event if you need counting and/or value aggregation for that specific action. For example when the player chooses a class you could track a design event with class:ninja or class:wizard and even include a value (like money in the bank or XP at the time). This will give you counts, sum, mean, histogram etc.
- Think about the need you have for filtering data
- Decide what area each custom dimension should track
- Decide on a finite list of dimension values for each. Using too many will block your game
- Don't use all 3 straight away unless you are certain of how to use it
DO NOT use custom dimensions for these
As they are already tracked or can be tracked in other ways.
- device information
- os version
- age
- platform
- level progression (use progression)
- never use float or timestamps or other dynamic content
Popular usage for custom dimensions
- player class (ninja, wizard)
- player affiliation (horde, alliance)
- player persona (social, power_gamer)
- player level (1_4, 5_8, 9_12 .. 97_100)
remote configs & a/b testingCopy link to clipboard
Remote ConfigsCopy link to clipboard
The Remote Configs feature enables you to control in-game parameters remotely. You get your remote configs from init request response. See more here.
The configurations loaded for the player need to be added to all events. This way, the GameAnalytics backend will be able to allow you to filter metrics by these remote settings.
Example of a
user event for a player that received the configurations listed in the response example above:
{ "device": "x86_64", "build": "1", "ios_app_build": "0.0.1", "category": "user", "ios_idfa": "AEA36878-D034-423C-BDEB-3C39A07CF951", "sdk_version": "rest api v2", "user_id": "AEA36878-D034-423C-BDEB-3C39A07CF951", "session_num": 20, "configurations": { "color": "red", "ab_bonus": "10" }, "platform": "ios", "connection_type": "wifi", "manufacturer": "apple", "client_ts": 1538659211, "session_id": "bd638487-1c88-4ce4-89f1-d6371f0996c2", "ios_idfv": "8431B825-8729-4E32-85C1-D54BD295E9F0", "os_version": "ios 11.4", "v": 2 }
A/B testingCopy link to clipboard
You get the A/B testing id and A/B testing variant id (only if the user is part of a A/B testing experiment) from the init request response. See more here.
The A/B testing ids loaded for the player need to be added to all events. This way, the GameAnalytics backend will be able to allow you to filter metrics by these A/B testing ids.
Example of a
user event for a player that received the A/B testing ids listed in the response example above:
{ "device": "x86_64", "build": "1", "ios_app_build": "0.0.1", "category": "user", "ios_idfa": "AEA36878-D034-423C-BDEB-3C39A07CF951", "sdk_version": "rest api v2", "user_id": "AEA36878-D034-423C-BDEB-3C39A07CF951", "session_num": 20, "ab_id": "1234", "ab_variant_id": "1234variant", "platform": "ios", "connection_type": "wifi", "manufacturer": "apple", "client_ts": 1538659211, "session_id": "bd638487-1c88-4ce4-89f1-d6371f0996c2", "ios_idfv": "8431B825-8729-4E32-85C1-D54BD295E9F0", "os_version": "ios 11.4", "v": 2 }
limitationsCopy link to clipboard
These are the technical limitations currently for sending events.
- size of POST request
- event field validation
- frequency of unique values
Size of POST request
The collector has a POST size limit of 1MB in the request body.
Read more in the troubleshooting section on 413 status codes.
Event field validation
When events are submitted they will each be validated. These validation rules are listed by each event in this documentation.
Read more in the troubleshooting section on 400 status code.
Frequency of unique values
GameAnalytics have some additional limitation regarding the frequency of unique values for certain events. If these thresholds are exceeded during the day then the GameAnalytics servers will start to throttle the game.
ThrottleCopy link to clipboard
When a game is being throttled it means that certain processing of the raw data has stopped. This is often due to events containing too many unique values that result in aggregation being hard/impossible.
It is worth specifying that the collection of events is not suspended.
The result in the tool will be metrics flatlining. Many core metrics will still be there; like DAU etc. But event types (design, progression etc.) will not be updated.
How to solve it?
This happens rarely. Contact support and get information about why the throttle was activated and how to fix the implementation to avoid it.
These are the recommended unique value limitations.
Default annotations
|Unique Limit
|100 pr. event part
Business Event
|Unique Limit
|event_id (itemType)
|event_id (itemId)
Resource Event
|Unique Limit
|event_id (virtualCurrency)
|event_id (itemType)
|event_id (itemId)
Design Event
|Unique Limit
|event_id (entire string)
* This is a very large threshold. The amount of tree-nodes generated will also affect if the game will be throttled. Having this many is not recommended and it can affect the GameAnalytics tool experience (downloading that much information to the browser).
troubleshootingCopy link to clipboard
The servers validate fields and reject events that do not pass. Therefore it is valuable to know which field(s) did not pass validation and the reason why.
The most common HTTP response status codes 200, 401, 400.
The request went well. All possible events sent were collected successfully.
Authorization could not be verified. Either the game keys are not correct or the implementation is not done properly for calculating the HMAC hash for the Authentication header.
The collector has a size limit of 1MB in the request body.
If the post body is less than 2 times the max limit (between 1M and 2MB) you get a 413 response code.
If it is bigger than that you will get a closed connection from the collector.
Therefore when submitting a large amount of events the code should split them up. Use multiple requests one after the other. Again it is highly recommended to use gzip as this will reduce the size significantly.
This can happen in the following scenarios.
- the data sent was not valid JSON (unable to decode)
- the JSON data sent was not a list (read more here)
- the JSON contents (events) failed validation
In the first 2 cases there will be very little information in the response.
The last case will happen when one or more events fail to match it's validation schema.
The servers will then not collect the failed events but still collect the valid events. Then reply with a JSON string containing a list of objects for each event that failed. Each error object will contain information about all the fields that might have failed validation for that specific event and also include the event fields that were submitted.
When receiving a 400 status code during implementation please review the response JSON to ascertain if it's valid and a list. Then review what fields did not pass validation and fix.
If a batch contains two events (A and B) and A fails validation but B passes then A will be rejected and B collected.
Due to this – do not resubmit event data when a 400 response is received.
Look at the following 400 response error reply snippet example in JSON:
[ ], "event": { "connection_type": "wifi", "session_num": 1, "session_id": "b887216b-3cfa-11e5-b8a9-a8206618c53b", "device": "iPhone6.1", "manufacturer": "apple", "category": "user", "user_id": "AEBE52E7-03EE-455A-B3C4-E57283966239", "client_ts": 1438948324, "os_version": "ios 8.2", "custom_01": "ninja", "engine_version": "unity 5.1.0", "platform": "ios", "sdk_version": "rest api v2", "build": "alpha 0.0.1", "v": 2 } } ]
Re-submitting events?Copy link to clipboard
When queued events are sent to the collector servers they should each be marked locally as being submitted.
If the attempt failed due to no connection (no network etc.) or 413 (body too large) then the being submitted events should be put into queue again. If you get a 413 then try to split the events into even smaller batches and then submit. For all other responses (200, 401, 400 etc.) these events should be wiped.
Do not keep events and resubmit based on other reasons than offline or the 413 response.
In production a 400 response should be logged and the implementation fixed for the next time the game is released.
Character encodingCopy link to clipboard
Make sure your character encoding is UTF-8 for strings.
Certain event_id strings require specific characters validated by matching a regex.
An example is the progression event_id string. This requires a match for this regex:
The validation for this event_id can fail if using UTF-8 strings dynamically (like level names). These might contain other characters then just a-Z and numbers. Make sure to encode strings to support the requirements.
Users are reporting issues with failing authentication using the UTF-8 standard in Java. In this case make sure you encode to the ISO-8859-1 standard instead.
server implementationCopy link to clipboard
It is possible to submit events from a server on behalf of clients. A scenario could be a multiplayer server keeping track of sessions for all clients connected.
Even though this is possible it is not recommended.
Country lookup by IP
The GameAnalytics collectors will inspect the request IP and perform a GEO look-up for country information.
Note that GameAnalytics will not store the IP on our servers. It is only used to resolve to a country abbreviation string like US.
If all the events are submitted by a single server then the country for all users would be the same (the country the server is located in). This can be solved by forwarding the client IP in the request when sending events.
This is done using the standard X-Forwarded-For HTTP header. For example if your client has the IP 18.104.22.168 then the header to be included in the request should look like this…
X-Forwarded-For: 188.8.131.52
Read more about this header on wikipedia.
Request per user
As you can submit many events in the same request (a batch) it would be tempting to send events from multiple users at the same time. This is not recommended as you specify one IP per request in the header X-Forwarded-For and thus all the events submitted will be annotated with the country resolved by that single IP.
It is needed to submit a request per user and specify the IP. A way to obtain this on the server would be to…
- collect intended events for users inside buckets per IP (user)
- activate a synchronous loop (one after the other) that submit events for each bucket (user) using the IP in the forward header
- wait a few seconds (15-20) and activate the loop again submitting events collected
This will make sure each user is resolved properly by country and our servers are not spammed with requests.
Session End
The server should keep track of the session time for each user. When it is detected that a user is no longer playing the game it is important to add (submit) a session end event for that user and session_id.
python exampleCopy link to clipboard
Download a Python example here using the sandbox api and sandbox game key and secret. The code is implementing several key areas.
- HMAC Authorization hash
- gzipping
- simple memory queue (use something like SqlLite instead)
- server-time adjustment
- default annotations function
- init / event routes etc.
Run the example from the terminal:
python REST_v2_example.py
Example steps
- make an init call
- check if disabled
- calculate client timestamp offset from server
- start a session
- add a user event (session start) to queue
- add a business event + some design events to queue
- add some design events to queue
- add session_end event to queue
- submit events in queue
java exampleCopy link to clipboard
Download a Java example here using the sandbox api and sandbox game key and secret key. The code is implementing several core areas.
- HMAC Authorization hash
- simple queue (use something like SqlLite instead and create a local storage)
- default annotations function
- init / event routes and basic events composition
Run the example in a Java IDE i.e. Eclipse Oxygen 2
Example steps
- make an init call
- check if disabled
- start a session (session_id generation)
- add a user event (session start) to queue
- add some design events to queue
- add a business event
- add some progression events (Start, Fail, Complete)
- add some resource (Sink and Source)
- add an error event (Info)
- submit current existing events from queue
- add session_end event and send
Document sections
- api basics
- Game Keys
- API Endpoints
- Event Processing
- Gzip
- Authentication
- Headers
- routes
- Init / Remote configs
- Events
- Examples
- event types
- Default annotations (shared)
- User (session start)
- Session end
- Business
- Resource
- Progression
- Design
- Error
- custom dimensions
- Example for tracking player class
- remote configs & a/b testing
- Remote Configs
- A/B testing
- limitations
- Throttle
- troubleshooting
- Re-submitting events?
- Character encoding
- server implementation
- python example
- java example


text:
The cost of using a number of UPS shipping services is going up but, fortunately, not until the holidays are over.
The Atlanta-based package delivery service announced its planned rate hikes Monday.
On average, rates will jump 4.9 percent for UPS ground, air, international and freight services in the U.S., Canada and Puerto Rico. According to The Wall Street Journal:
The pricing change, which is expected to go into effect Dec. 29, comes as consumers are increasingly buying lightweight items online that had once been purchased in brick-and-mortar stores. Those items often come with free shipping and are sent out in large packaging. With box size now a consideration in pricing, e-tailers may choose smaller boxes, easing the burden on UPS.
Reuters said UPS-rival FedEx announced last month that it was hiking rates by 4.9 percent beginning Jan. 5.
Will the rate hike affect your pocketbook? Share your comments below or on our Facebook page.
Disclosure: The information you read here is always objective. However, we sometimes receive compensation when you click links within our stories.

subset: commoncrawl


text:
Sponsored Links
Want to beat your Scrabble friends no matter where you are?WordSolver Android App!
2 Definitions of Chit
The definition of chit, the meaning of the word Chit:
Is chit a scrabble word? Yes!
- n. - A dismissive term for a girl who is immature or who lacks respect
- n. - The bill in a restaurant
Chit is worth 9 points in Scrabble, and 9 points in Words with Friends
There are 4 letters in chit: C H I T
1 Anagram of Chit
Words that can be created with an extra letter added to chit:
9 words found using the letters in "Chit"
4 Letter Words
Sponsored Links
3 Letter Words
2 Letter Words


text:
Awards 2020Judges
This year's judges
Industry leading figures working across design, architecture, hospitality and lifestyle media
Ali Alt Recanati
Co Founder
Farmer J
Ali Alt Recanati
Co Founder - Farmer J
Design excellence
Design Excellence combines an intimate understanding of the spaces function with imagination, uniqueness, soul and detail. Design Excellence defies time as it is always driven by quality.
Alexandra Alt Recanati, previously worked as a Corporate Solicitor at Linklaters. In 2016 she left the Law to start a food blog - 'Baliboosta'. The growing blog, began to attract publications such as The Daily Mail, The Independent and The Evening Standard, who all regularly featured her recipes. It is with this industry knowledge and passion for food, that in 2017, she decided to join her husband alongside him, as his partner at Farmer J.
Amanda Harling
Freelance Writer & Interiors Stylist
Amanda Harling
Freelance Writer & Interiors Stylist
Design excellence
Design Excellence - along with an understanding of architectural principles, confidence is a vital ingredient. The choice of colour and texture can be boldly striking or natural and neutral but creating a sense of visual excitement through the use of furniture, finishes, art and lighting is an innate skill. A space that is inviting, welcoming, that invokes a feeling of well-being yet is stimulating too - it's a complicated cocktail to achieve but you recognise it when you see it.
Initially studied fashion, and then briefly worked in theatre costume before joining Condé Nast and Vogue. A couple of years later, I moved across to House & Garden where I found the world of interior design of increasing interest. Subsequently attended the City and Guilds of London Art School for two years learning traditional decorative techniques such as lacquering, gilding and verre eglomisé, whilst at the same time writing features for House & Garden and The Evening Standard, on the homes of artists and designers. Now freelance, I work in the main with photographer Andreas von Einsiedel on a combination of residential and commercial projects and contribute to magazines in the UK and abroad.
Amir Nahai
CEO, Global Food & Beverage & Lifestyle Brands
Amir Nahai
CEO, Global Food & Beverage & Lifestyle Brands - Accor
Design excellence
Design Excellence has a far deeper meaning than just making things look good. If a place has good design, it has a welcoming vibe. Good restaurants or bars are places where guests choose to return repeatedly. This usually happens when they've had excellent food and service and when the atmosphere feels special. If you don't get those things right, it just comes off as trendy.
Amir Nahai joined Accor, as CEO Global Food & Beverage and Group Executive Committee member, in September 2015. He has also been responsible for Lifestyle brands since 2018. Amir was previously a partner at Bain and Company where he spent 17 years. While at Bain, he served clients in the CPG, retail, technology and hospitality sectors. He has worked out of multiple offices in the US (Boston, New York, Los Angeles), Asia (Singapore, Thailand, India, China) and Europe (Paris, London). Amir is American. He holds a BA in Government from Dartmouth College and an MBA from the Tuck School of Business at Dartmouth.
Andrew McConnell
Owner & Executive Chef
Cutler & Co
Andrew McConnell
Owner & Executive Chef - Cutler & Co
Design excellence
Good design bridges form and function, it should be considered and timeless. Good design talks to everyone, not only the select few. Design in the hospitality sphere should not only consider the built form but also the emotional. How it makes people feel is paramount.
Andrew McConnell is a Melbourne-based chef, restaurateur, cookbook author and columnist. His restaurants are amongst Australia's most loved and together tell a story of Melbourne's culinary identity and how the city likes to dine. Through its own personality, each restaurant celebrates local Victorian producers and growers and the diverse seasonality of the region. It is the creative aspect of the job that drew Andrew to the world of restaurants and to this day it continues to drive him.
Andy Lewis-Pratt
Market Halls
Andy Lewis-Pratt
CEO - Market Halls
Design excellence
Design Excellence is creating a space that is accessible and relevant to all
Andy Lewis-Pratt is the CEO of Market Halls which launched in 2018 with the aim of redefining the British concept of food halls and turning unloved public spaces with particular architectural interest public again. Andy has over 35 years experience in the property, retail and leisure sector. His expertise ranges from launching and advising startups to serving as the MD of a FTSE 250 company, CEO of a retail and property fund and non-executive director for numerous retailers. In 2000, Andy created Xscape, a successful sports and entertainment complex with indoor snow slopes, climbing walls, bowling lanes, multi-screen cinemas, retail and restaurant units.
Beatrix Ong MBE
Founder & Design Director
the Company of X
Beatrix Ong MBE
Founder & Design Director - the Company of X
Design excellence
Design Excellence is creating better, in better ways.
Beatrix Ong began her career as an intern for Harpers Bazaar and rose quickly to Creative Director of Jimmy Choo (at age 22). In 2002, she launched her eponymous shoe line; her collections secured her place on the Independent's Top 10 Leading Shoe Designers list, along with Manolo Blahnik. Ms. Ong has collaborated with some of the world's most respected designers and brands. A regular key-note speaker on Design and Sustainability, Ms. Ong is currently working within multiple creative industries with a focus on sustainability. Beatrix Ong shoes are part of the Victoria and Albert Museum's permanent collection
Bruce Robertson
Managing Director
The Standard, London
Bruce Robertson
Managing Director - The Standard, London
Bruce Robertson is Managing Director of Standard International's first opening outside of the USA. With 25 years experience in the hotel industry, Bruce has opened numerous hotels across Europe including Columbus Monaco, and Aviator by Tag before joining Standard International in 2015 to launch the brand into Europe with the project to transform the historic, brutalist Camden Town Hall Annex into The Standard, London, a world-class 266-room hotel. A design fanatic and Barbican resident Bruce has literally been living and working a brutalist life for the last four-and-a-half years."
Camille Walala
Camille Walala Studio
Camille Walala
Founder - Camille Walala Studio
Design excellence
Design Excellence is understanding the direction design that is desired from other a client or brief, then taking that direction smashing it into a million pieces and then re-inventing it.
Camille Walala is purveyor of positivity, expressed through vibrant colour and bold pattern. Her work, from the micro to the macro, harnesses optimistic typography and exuberant geometries to create environments that stimulate the senses and inspire joy. Her practice has taken her all over the world to transform homes and workspaces with her signature tribal-pop style. Drawing on influences including the Memphis Movement, the Ndebele tribe and op-art master Victor Vasarely, Walala has an irrepressible enthusiasm for playful, graphic patterns that invoke a smile in all who view them.
Channing Elise Henry
CEO & Founder
Alma Development
Channing Elise Henry
CEO & Founder - Alma Development
Design excellence
Design excellence is the confluence of many things - lighting, seating, art, traffic flows, color, music – that, together, engender an overall feeling of comfort within a space. Comfort is a user's sense of connectivity to the experience that is intended in a space – sometimes it is alertness and awareness, other times rest, sometimes social, other times focused. Design excellence celebrates all the senses that lead to a complete human experience.
Channing Henry is a boutique hotel developer and advisor to the hospitality industry. She is co-head of PKF hotelexperts in the US, providing market analysis, investment strategy, and development services to clients in the US and Latin America. Channing co-developed the Downtown LA Proper hotel and she has worked on many hotel developments from acquisition through asset management in Los Angeles, Miami, Atlanta, Dallas/Fort Worth, Mexico and Costa Rica. Development partners and hotel brands include the Kor Group, BV Resorts, Proper Hotels, Viceroy Resorts, Bunkhouse Hotels, and Amanresorts. Channing holds a BA from Princeton University and an MBA from Yale.
Dave Lane
Creative Director
The Gourmand
Dave Lane
Creative Director - The Gourmand
Design excellence
Design excellence is truly understanding the brief, the audience and the limitations of a project, then offering up something no one else could ever have thought of, or realised.
David Lane is the co founder, creative director and editor-in-chief of the The Gourmand. Alongside the publication David runs Lane & Associates where he has produced work for clients as diverse Hermes; Nike; Google; Tate; Facebook; The National Portrait Gallery and Adidas. David is also the Creative Director of frieze and frieze Masters and a contributing editor of the Evening Standard Magazine. His work has received numerous awards and accolades, exhibited at the Design Museum and published in books internationally.
David Moralejo
Condé Nast Traveler
David Moralejo
Editor-in-Chief - Condé Nast Traveler
Design excellence
Design excellence is the perfect balance between luxury, simplicity and functionality. In any case, we can't forget the importance of sustainability and conscious design as a big value for our present and future.
With a career focused in lifestyle, fashion and travel journalism, David Moralejo is always tracking trends, traveling and visiting the best restaurants. He enjoys communicating through Condé Nast Traveler Spain the way travel and lifestyle are changing around the world. He has also written a novel and a book of poems and tales.
Didier Souillat
Time Out Market
Didier Souillat
CEO - Time Out Market
Design excellence
Design excellence is when the cinematic energy it has created captures the people, product and experiences of a venue and turns it into a destination. In addition, you will see I have clarified a few other points below. If you need anything else at all though, please do not hestiate to contact me.
Didier Souillat joined Time Out Market as CEO in 2016 to lead the global expansion of the food & cultural market which is now present in Lisbon, Miami, New York and Boston, and is set to come to more cities around the world. He has considerable experience in retail and hospitality having held senior management positions at Hakkasan as Executive Vice President, at Selfridges and Harrods as Director of Food Halls & Restaurants, at McArthur Glen as Director Food & Restaurants and at Daylesford Organic as Managing Director. Didier is a graduate from the Ecole Lausanne Hotel Management School.
Giovanni Paradiso
Fratelli Paradiso
Giovanni Paradiso
Owner - Fratelli Paradiso
Design excellence
For me design excellence is sensory, especially in hospitality. Every surface I touch has to feel comfortable and tactile, like a great fabric, the visuals must not distract yet involve you. Food and drink engages smell taste, and sounds whether its the room or the music will work together.n The space creates its own vibe whether there be 2 people or a full house it will always feel justified.
Born in Melbourne, Australia, Educated in film, Worked in Melbourne's most influential and ground breaking restaurants bars and clubs. Was hugely influenced by the Melbourne underground music and arts scene of the 80s/90s. Opened Fratelli Paradiso Sydney in 2001 in what used to be dive bar with no funding in a very then bohemian Potts Point. First to really introduce continuous service in Sydney till late into the evening. Opened 10 William Street Paddington in 2010, the first natural wine bar in Australia. Opened Fratelli Paradiso Tokyo in 2017 in Omotesando Hills a building designed by Tadao Ando. Started the Italo Dining and Disco Club with Maurice Terzini in 2015 a multi faceted music art food and drink party which brings together chefs, artists, winemakers and djs a concept which blurs the line between restuarant bar club.
Guy Heywood
Six Senses Hotels Resorts Spas
Guy Heywood
COO - Six Senses Hotels Resorts Spas
Design excellence
Design Excellence is about crafting an interesting play on light, texture, patterns and ambience to set the right mood and feel for whatever the project is. No cookie cutter approaches, but a real "feel" for the site / location / space that allows for all the senses to be stimulated when present in the space. There needs to be a daytime and a nigh time design intent that can even transmit a unique experience between the two seamlessly.
Guy has joined Six Senses Hotels Resorts Spas as COO in April 2019. He was the COO for Alila Hotels & Resorts for the past 8 years. With over 30 years of experience within the international hotel and tourism industry, Guy started his journey down under in Australia as the restaurant and lounge manager at InterContinental Sydney. He then moved on to The Regent Sydney, followed by Four Seasons Hotel Tokyo at Marunouchi and Four Seasons Hotel Singapore. Guy is always a quest for meaningful experiences. An advocate for exercise and a competitive triathlete, he needs to run, swim or bike ride most days.
Hamish Watts
Applejack Hospitality
Hamish Watts
Co-Founder - Applejack Hospitality
Design excellence
Design excellence is, within the hospitality world, the delivery of a space that enables the guest to be fully immersed within the concept. When executed correctly, guests should feel a real sense of excitement and escapism whilst being completely comfortable within their surrounds. To ensure service is effortless, design excellence must also deliver flawless functionality and "working flow" of the space, to ensure there is no interruption to the guests interpretation of the concept.
Creativity is the driver behind hospitality leader Hamish Watts, it's what continually motivates him to build and operate boutique restaurants and bars. Watts climbed his way up the hospitality ladder in London and Sydney, running boutique-style bistros and larger classic-style pubs, before opening his own business. Sydney group Applejack, launched 2011, employs over 200 professionals across 8 brands. Watts says, "I love the creativity of the trade; coming up with interesting concepts for venues along with directions for drinks and food. It's a unique environment being a jack of many trades." Together with business partner Ben Carroll, the passionate duo are determined to challenge the status quo and lead the hospitality industry by delivering innovative venues that bring people together, creating epic concepts and uniquely magical experiences.
Jana Hamman
Owner & Director
Jana + Koos
(South Africa)
Jana Hamman
Owner & Director - Jana + Koos
Design excellence
Design Excellence is attention and care given to a client's brief, creating the trust to experiment and try new things, solving problems strategically and creatively, simplifying chaos, a pleasant surprise, and when done right, the ability to drive impact and change, be memorable or make people smile.
Jana Hamman is one part of the highly acclaimed South African design duo Jana + Koos, whose work spans across many creative fields including, but certainly not limited to, branding and graphic design, art, fashion, advertising and creative direction, photography and styling, art direction and illustration. Their extensive portfolio spans everything from concept spaces for big brands like Nike, to branding and creative direction/ curation for iconic restaurants and hotels (most notably Alice and Fifth, Restaurant and Bar Awards winner 2019 and Gorgeous George A-head winner 2019), fashion brands, shops, development companies and precincts, and recently even a powerful brand film for the progressive casting and creative management agency, Disco. As J+K, and in her personal capacity, Jana has had various successful group and solo exhibitions, locally and internationally. They're a powerhouse conceptual consultancy who have the Midas touch when it comes to creating brands or experiences entrenched in culture and immediately embraced and loved by their communities.
John Meadow
LDV Hospitality
John Meadow
President - LDV Hospitality
Design excellence
Design excellence is where form and function meet to create a distinct restaurant experience. Where a concept unifies the aesthetic with the meaningful DNA of a brand into a functional whole that compels the senses to feel altered and nourished while operating flawlessly. A space should encourage us to feel connected, whether to each other or to the desired experience and offer a sense of discovery.
John Meadow is the founder and president of LDV Hospitality, a boutique hospitality group that creates authentic restaurant and lounge experiences inspired by La Dolce Vita. John founded LDV in 2008 with critically acclaimed Scarpetta, followed by signature brands American Cut and Dolce Italian. Based in New York City, LDV has locations in The Hamptons, Miami and Las Vegas, and internationally in London. LDV specializes in developing tailor-made concepts for its hotel partners, working with iconic partners such as The Cosmopolitan of Las Vegas, The Fontainebleau of Miami, Gurney's Resorts, The James New York – NoMad and Bvlgari Hotel London."
Katya Wachtel
Editorial Director
Katya Wachtel
Editorial Director - Broadsheet
Design excellence
Design Excellence is creating a space that's not just technically brilliant but transports and moves the person situated in it, and the very best examples offer something genuinely original – something new.
Katya Wachtel is the editorial director of Broadsheet, one of Australia's leading culture publications covering the best in Australian dining, fashion, art, design, cinema, active lifestyles and travel. She was previously a financial journalist in New York for Reuters, and contributes to publications including Conde Nast Traveler and Vault magazine.
Kerrie McCallum
Kerrie McCallum
Editor-in-Chief - Delicious
Design excellence
Design Excellence is a space embodied by functionality, comfort, heart, inspiration and individuality. A place where light, acoustics, wit and thoughtful elegance combine to create a space that makes the user happy, content, fulfilled, inspired and joyous, perhaps even intrigued and hungry for more. Elusive, and hard to sum up, but something you know and feel when you see and experience it.
Kerrie McCallum is the editor-in-chief of delicious., the leading premium food and lifestyle brand in the Australian market. A highly experienced and talented editor with a strong track record of developing products that connect with consumers, Ms McCallum is responsible for the delicious. brand across all platforms, including print, digital, social and the weekly lift-out delicious on Sunday in Stellar in the Sunday Telegraph and Sunday Herald Sun. With over 20 years' publishing experience, Ms McCallum joined News Corp Australia in 2012 as the editor-in-chief of Sunday Style and then began leading delicious. in September 2014. Prior to this Ms McCallum was editor of InStyle Magazine for four years. In 2009 she launched their inaugural Women of Style awards to celebrate and pay tribute to Australia's most inspiring female talent across a range of disciplines. Ms McCallum also edited Shop Til You Drop magazine for five years; and has written for leading Australian magazines and newspapers, such as Vogue, Harper's Bazaar and Elle along with The Australian and Brisbane's The Sunday Mail, on topics as diverse as health, beauty and fashion, to sport, lifestyle and popular culture. delicious. has a premium, highly engaged audience who seek out the best in all areas of their lives – from the food they eat to their homes, purchases and travel.
Kiran Jethwa
Kiran Jethwa
Design excellence
Design excellence, for me in the context of F&B is effectively articulating your F&B vision to your consumer through the aesthetics of your space within 30 seconds of somebody walking into it. Good restaurant design provokes people into using their imagination, makes their surroundings more exciting and elevates the full sensory experience of eating out. You know you have nailed it, when there is nothing left to add, but equally nothing you would take away.
Born and raised in Kenya, Kiran Jethwa is widely recognized as East Africa's first International celebrity chef. Having fronted multiple shows for a variety of broadcasters across the world, his TV programs have been viewed in over 180 countries and he is currently a judge fronting "The Great Kenyan Bake Off". Kiran's brand is globally recognized and has often been described as "Bear Grylls meets Jamie Oliver". Through his passion for the outdoors, he sources wild and unusual ingredients and coupled with his culinary flare and creativity, Kiran is renowned for being the go-to-face for food with world-wide adventure.
Marion Vignal
Marion Vignal
Design excellence
Design Excellence is a capacity of telling a relevant story in a dedicated place. It's not just about styles, shapes and colors, it's about expressing a spirit – a philosophy and sharing it wih the others through every details of the project, from the light to the sound and every service proposed.
As an independent curator, Marion Vignal has cultivated a wide-ranging appreciation for the many and varied forms of expression encountered in contemporary creative art. With her background in art history and journalism, she founded Ida M. in 2014 in Paris to offer artistic and editorial advisory services. Ida M. gathers a network of international artists to create bespoke projects from conceiving, to commissioning artists and production. Since 2015, Marion Vignal has been programming and moderating The Art & Design Conversations at Silencio, a Paris members Club dedicated to creative communities designed by David Lynch.
Miguel Ardid
Owner & CEO
Coolrooms & Globhi Management
Miguel Ardid
Owner & CEO - Coolrooms & Globhi Management
Design excellence
Design execllence is the ability to transform something dull, boring with no personality into something unique, useful, confortable, lasting without a huge budget.
I started in the Hotel business attending Hotel School "les Roches" in Switzerland and then transfers to Cornell hotel school. In Cornell both of my roommates were Architecs so I got a great exposure to design. Since my graduation in `99 I have developed and renovated a good number of properties for international brands like Marriott, NH, Ac Hilton. We specialise in recovering 17th and 18th century palaces and turning them into hotels, Palacio de Villapanes (Seville), Coolrooms Atocha (Madrid) nh collection cordoba, palacio de Santa Marta in Trujillo.
Nkosiyati Khumalo
(South Africa)
Nkosiyati Khumalo
Editor-in-Chief - GQ
Design excellence
Design Excellence is realized when people remain at the centre of the equation. It's the sweet spot between creating spaces and experiences wherein people comfortable and at ease, while also surprising and delighting them through beautiful, innovative and functional detail.
Nkosiyati Khumalo is the Editor-in-Chief of GQ South Africa, where he has held various roles since 2012. Named as one of The Business of Fashion's 500 People Shaping the Global Fashion Industry in 2019, "Yati" is especially passionate about giving exceptional South Africans a platform to share their incredible stories with the world, and brings that vision to life daily thorugh print, digital, video channels and events – with a signature style that's as representative as it is revolutionary.
Nuriel Molcho
Chief Marketing Officer
Nuriel Molcho
Chief Marketing Officer - NENI
Design excellence
Design Excellence is finding perfection in imperfections. Allowing room for creative exploration into the unknown to create something new. There is no perfect design, design should evoke emotions and support the space within which it is. We have a saying at NENI it's an Israeli word called 'Balagan' and what it means is a sympathetic chaos and that applies to life, food and design don't strive for perfection or excellence but rather allow space for creative exploration.
I'm the first N in NENI : ) the oldest of us 4 Molcho boys. I take care of the Marketing and branding of NENI as well as concept developments. Besides passionalty working with my family i also run a bespoke Hat Label together with my wife Audrey called NOMADE MODERNE and am a content creator for many external brands as well. I love my work and always try to expand our brand into new directions making NENI more than a food company but rather a lifestyle brand.
Riccardo Giraudi
Giraudi Group
Riccardo Giraudi
CEO - Giraudi Group
Design excellence
Design excellence is design that gives me an instant emotion. Like a perfect melody, it is often simple, pure and honest.
Riccardo Giraudi was born in Genoa in 1975 and joined the family company, specialized in the meat business, in 2001. He concentrated on high-end beef from the United States, Australia and even Japan, to become the exclusive importer of the finest meats in the world. He then took the company into a new dimension and opened his very first restaurant in Monaco, Beefbar, in 2005. Today, Riccardo Giraudi is also a restaurateur at the helm of 18 innovative and fantastic addresses all over the globe.
Rochelle Cohen
Managing Director & Founder
Roche Communications
Rochelle Cohen
Managing Director & Founder - Roche Communications
Design excellence
Design excellence within hospitality extends beyond simple aesthetics. It must embrace functionality and reflect the personality of the brand. In an increasingly Instagram-obsessed world, every design detail, however small, must be carefully considered – it's no longer just about the food and service. Interiors significantly contribute to the overall dining experience, often the trigger for visiting. Ambience is king – choice of colour, furniture, lighting, spacing between tables and acoustics all contribute.
Rochelle set up Roche Communications over 26 years ago. From humble beginnings as a one man band she has grown the agency into one of the most respected specialist hospitality agencies in the country. She has worked with some of the country's best chefs, operators and owners and has been responsible for helping to build some of the most recognised brands in the industry. Her wealth of experience spans from casual dining brands and bars, to Michelin-starred restaurants and luxury hotels, providing clients with concept consultancy, public relations, marketing and social media.
Roya Sullivan
National Director, Window Presentation
Macy's Inc.
Roya Sullivan
National Director, Window Presentation - Macy's Inc.
Design excellence
Design Excellence is giving form to ideas with beauty and emotional power. Good design aesthetics, is imaginative and explanation free. The audience should be engaged by experiencing the design, therefore designer and design has created a memory for the user.
Roya Sullivan joined Macy's in 2012 and was named National Director of Window Presentation in 2014. Prior to her time at Macy's, she was the Visual Design Director at Bloomingdale's. Roya attended the Corcoran School of Art for her B.A. and received her M.F.A. from the Pratt Institute. She is the recipient of several prestigious industry awards from Clio, Women In Design 2018 winner, design:retail and WindowsWear and has been featured in publications such as The New York Times, USA Today, Entrepreneur, Psychology Today, A1 Retail and more. Roya was born in Iran and grew up in Germany, and later Connecticut. She lives in New York City with her husband and two sons.
Samantha Goodrich
Director of Design & Planning
Viceroy Hotel Group
Samantha Goodrich
Director of Design & Planning - Viceroy Hotel Group
Design excellence
Design excellence is creating spaces infused with purpose and personality that tell a story. From entry to exit, great design is implemented by a thread, connecting the layers of surprise, nostalgia and belonging. Great design challenges the norms of the built environment and creates its own path to follow.
Samantha Goodrich is an interior designer who oversees the design, planning and construction of new Viceroy hotel properties. Her position at Viceroy focuses on creating design standards and instilling brand vision into each project. Driven by the unique narrative of each property her work brings to life a range of diverse hospitality experiences across the globe. Prior to joining Viceroy, Samantha steered the design of a variety of projects such as hotels, bars, restaurants, and nightclubs as an Associate with Rockwell Group.
Samantha Wasser
Founder, Senior VP and Creative Director
by CHLOE.
Samantha Wasser
Founder, Senior VP and Creative Director - by CHLOE.
Design excellence
Design should spark an emotional connection or feeling. True excellence is when design is fully integrated with a brand identity and feels familiar while allowing for unexpected, playful and unique moments
Samantha Wasser is the Founder, Senior VP and Creative Director of popular plant-based, fast-casual brand by CHLOE. Samantha provides creative vision for the brand, overseeing brand identity, growth, menu development, and social media presence, all of which have been major credits to the brand's rapid expansion and evolution. by CHLOE.'s flagship location opened to customer and critical acclaim in New York City in 2015, and was followed by national and international expansion to new markets including Los Angeles, Boston, London and Canada, landing on 18 locations by 2019. Samantha is helping to lead the brand's expansion plans in 2020 and beyond.
Sara Lieberman
New York Times, Wall Street Journal, Washington Post, Condé Nast Traveler
Sara Lieberman
Journalist - New York Times, Wall Street Journal, Washington Post, Condé Nast Traveler
Design excellence
Design excellence is both a feeling—a sensory reaction to something stunning, evocative and eye-catching—but also tactile in its functionality, use of space, materials and imagination.
Before moving to Paris in 2014, New York-born Sara Lieberman worked as an editor for over a decade at Seventeen, the New York Post, Page Six Magazine, and briefly the Daily Beast. Now, as a full-time freelance writer, her travel and lifestyle articles appear in the New York Times, the Wall Street Journal, the Washington Post, Condé Nast Traveler, AFAR and more. When she's not writing, traveling or practicing yoga, she's overthinking something (as noted in her biweekly newsletter Overthinking It), eating or helping others eat via a seafood pop-up biz Cup o' Cockles.
Sarah Douglas
Sarah Douglas
Editor-in-Chief - Wallpaper*
Design excellence
Design excellence is a problem solved if that problem is precisely defined but of the highest ambition. It should engage the senses and be generous of spirt, be properly human shaped. It should be intuitive but also surprise and open up possibility. It should play with formal language but steer clear of pointless novelty. And, of course, it should explore new materials and manufacturing processes that are less wasteful of energy and resources.
Sarah Douglas is Editor-in-Chief at Wallpaper*, where she is responsible for its print magazine, digital platforms, in-house creative agency Bespoke, interior design service Composed, and brand partnerships and events, including Wallpaper's annual Handmade (soon to be Re-Made) exhibition at Salone del Mobile. Douglas joined Wallpaper* in 2007 as Art Editor, becoming Creative Director in 2012, before being named Editor-in-Chief in 2017. During this time, Douglas has commissioned a wealth of illustrious artists and designers, including Jean Nouvel, Tom Sachs, Jenny Holzer, and Hussein Chalayan, championed next generation talents, such as Bethan Laura Wood, and Philippe Malouin, and created partnerships and collaborations with prestigious brands, such as Rolex, B&B Italia, Bentley and Prada. Douglas is also a member of the judging panel for the London Design Medal, and regularly judges for international design competitions, including D&AD.
Skye Gyngel
Executive Chef
Spring Restaurant
Skye Gyngel
Executive Chef - Spring Restaurant
Design excellence
Excellent design to me is when beautiful form equals function
Originally from Australia, Skye Gyngell is now one of Britain's most respected and acclaimed chefs. In October 2014, Skye opened her much-anticipated London restaurant, Spring. Located in the New Wing of Somerset House, Spring encompasses Skye's signature style of cooking, led by seasonal ingredients. Alongside Spring, Skye is culinary director for luxury Hampshire hotel Heckfield Place, which opened in 2018. Since January 2017, Skye has exercised the philosophy of cooking and eating with economy and grace at Spring Restaurant by incorporating the 'Scratch Menu' '
Stephanie Juliet Pearson
The Entourage Group
(The Netherlands)
Stephanie Juliet Pearson
CEO - The Entourage Group
Design excellence
Design Excellence is paying attention to every single detail, every aspect has to be captured by the same language. At The Entourage Group we always ensure new venues are adapted to the local culture and heritage, yet simultaneously offer something new. We not only create restaurants, we create experiences. It's all about meeting the needs of your target group and if you succeed in that, that is design excellence.
Stephanie Eliyahoo is CEO of The Entourage Group, renowned for creating cutting-edge food and drinks concepts. With many years experience within Hospitality, Stephanie Eliyahoo ventured to Amsterdam in 2008. Together with Yossi Eliyahoo and Liran Wizman, they opened a contemporary Asian-fusion concept; Momo Restaurant, Bar & Lounge. Momo became a roaring success and led to the launch of The Entourage Group. With the rapid growth of The Entourage Group, Stephanie manages all concepts within Group's portfolio, overseeing business development staffing, marketing and finance. She is passionately dedicated within the business, helping to create unforgettable experiences across the globe.
Tatiana Fokina
Hide Restaurant
Tatiana Fokina
CEO - Hide Restaurant
Design excellence
Design Excellence is creating something original, visually striking, but convenient and people friendly, something that will inspire other creative minds. Making interiors that will not go out of fashion but last and age well. Designing spaces that will become taking points, destinations and change trends within the industry
Tatiana was born and grew up in St Petersburg, moving to London in 2009. She managed various commercial projects prior to joining Hedonism Wines in 2010. Tatiana project managed the launch, was heavily involved in all aspects of recruitment, design, branding, marketing. In 2011 she became CEO of the company.Under her management the business has developed into the world's finest wine retailer. In 2018 she launched Hide restaurant, which soon became one of the busiest London restaurants and received a Michelin star the same year. Tatiana has also created an online project Open University, initiative advocating democracy and human rights in Russia.
Vanessa Craft
Vanessa Craft
Editor-in-Chief - ELLE
Design excellence
Design Excellence is about storytelling: creating a world that is immersive, thrilling and at the same time emotionally resonant and useful. Regardless of materials, structure or innovation, it must find that balance between aesthetic and function. And, more than ever, have consideration to environmental impact and sustainability.
In her role as editor-in-chief of ELLE Canada, Vanessa Craft is one of the most prominent representatives of the Canadian fashion industry. An award-winning journalist and author, her work has been syndicated in over a dozen countries around the world. Known as an influential thought leader and public speaker, Vanessa is passionate about the arts, inclusivity and empowering women to pursue and achieve their dreams. Her career history is international and non-traditional, ranging from fashion, beauty and sports journalism to the television and music industries. Vanessa was born and raised in Toronto, Canada.


text:
Welcome, my name is Ken Slusser. I wanted to express my appreciation for the progressive rock band YES. In the early 80's, Chris Squire was being interviewed and was asked if YES music was sending any type of message. He replied, "A message of HOPE." I decided to use HOPE as a theme for what became a succession of banners which were displayed during the various YES tours. The first banner was rather crude, just block letters created with black spray paint (not pictured on this site). They eventually became more involved. I was fortunate enough to meet Jon Anderson on several occasions. The first being in 1989. He greeted me as, "The HOPE Man!"
I personally handed this painting directly to Jon Anderson just prior to his concert on Wednesday, July 24th, 2019 at Levon Helm's Studio in Woodstock, NY. I was fortunate enough to attend his band's rehearsals on Monday, July 22nd and Tuesday, July 23rd just before the 1st concert of their 2019 tour. Jon's new album is titled, "1000 Hands," therefore, I wanted to create a piece of artwork that incorporated Jon's album cover with my theme of HOPE. If you haven't surmised as of yet, each hand in my painting is Sign Language for the word HOPE.
This painting was done on framed stretched canvas and is 12 inches high X 36 inches wide. Most of the artwork on this site was painted on large bedsheets so that Jon would be able to see it while performing in large venues. Due to the intimate setting of Levon Helm's Studio, there was no need to create such a large project.
Thank you for your anticipated viewing. I sincerely hope that something that you see herein, is attractive to your higher self.
(Please view through a large device such as a PC or laptop)
8/6/19 - If you haven't visited recently, there's a fairly new poem on the "poetry" page titled, "She Is Loved." Just click on the poetry tab and scroll down.


text:
AMRO Gives Some Recommendations to Maintain High Growth in Cambodia
AKP Phnom Penh, May 02, 2019 —
The ASEAN+3 Macroeconomic Research Office (AMRO) said that Cambodia's real GDP growth is projected to be 7.1 percent, with the inflation rate at 2.8 percent this year, and next year would reach only 7 percent while the inflation rate rose slightly to 3 percent.
According to the AMRO's report released recently, the growth has been solid for the developing economies, particularly Cambodia and Vietnam. Cambodia's direct exposure to China and through the global value chains (GVCs) is relatively low.
A small reduction in China's apparel production would be reflected in higher production in Vietnam and Cambodia. In other sectors, chemicals production would decline across the region, while services production would decline in the United States, China, Singapore and Cambodia, possibly due to second-round effects from dampened demand in the United States and China, and consequently from the rest of the world.
Public finances in the region remain generally prudent. Although the general government debt-to-GDP ratios for most regional economies have generally risen over the past several years, the debt-to-GDP levels are still moderate by international standards. Compared to the respective benchmarks for low-income and middle-income developing economies, Lao PDR's and Vietnam's debt-to-GDP levels are relatively high, suggesting that fiscal consolidation is needed. In contrast, Cambodia, Indonesia, Korea, the Philippines and Thailand have debt-to-GDP ratios that are lower than their comparators, pointing to some available fiscal space.
Cambodia's reform efforts in revenue mobilisation have yielded desired results, with sustained tax revenue growth via broad-based increases in both direct and indirect taxes, although continuing efforts are needed to improve spending efficiency. Lower-income ASEAN ("CLMV") economies with the traditional developing country problems: investment needs exceeding what they can save for, and limitations in productive capacity (including labour, technology, institutions). Unlike earlier emerging economies, Cambodia, Laos, Myanmar, and Vietnam confront these development constraints at a time when globalisation and access to foreign capital can help close the gaps, or wreak economic damage if financing is excessive.
Cambodia, Laos and Vietnam also have plans to construct new airports to facilitate international travel and highways to link the major cities. Almost unique among ASEAN countries, Singapore has a comfortable airport utilisation rate, but is already planning ahead for Terminal 5 at its Changi Airport, which will double the existing capacity.
According to World Bank data, Cambodia's and Myanmar's experience with the textiles, clothing and footwear (TCF) sector is one example where high-skilled and technology-intensive manufactured goods account for very small shares of their manufactured exports (0.4 percent for Cambodia in 2016 and 6.1 percent for Myanmar in 2017).
The gap in skilled labour is especially stark in the CLMV economies, which rank below the global-average in the World Economic Forum's human capital development index. Particularly in Cambodia, Laos and Myanmar, low healthcare spending and chronic underinvestment in education, and the limited availability of skilled labour, are now impinging on these countries' capacity for further growth catch-up and development. In response, efforts are now underway to ramp up investment in these areas significantly. In Cambodia for example, total expenditure on the social sector reached around 7.0 percent of GDP in 2018, up from 4.6 percent in 2013. Current expenditure on education increased from 1.6 percent of GDP in 2013 to 2.7 percent of GDP in 2017, and if capital expenditure is included, public spending on education sector increased to 3.1 percent of GDP. In contrast, Hong Kong, Korea, Japan, and Singapore have systematically upgraded and raised the quality of education throughout the past few decades.
The infrastructure spending gap per year over the next two decades is large for the developing countries such as Cambodia and Vietnam, but is relatively small for high-income countries.
Headwinds to the growth outlook are mainly from external factors. Given Cambodia's high reliant on the EU market under the Everything But Arms (EBA) preferential trade arrangement, a suspension of the EBA scheme could substantially weaken its export competitiveness in that market. Another external risk arises from the possible escalation of the U.S.-China trade war—where it would result in weaker growth momentum in these two economies and intensify the global trade protectionism sentiment. In addition, given China's increasing investment in Cambodia, FDI inflows—in particular into the real estate sector—have become more susceptible to any sudden policy change by China.
In order to sustain a high growth potential in the medium-term, Cambodia needs to continue its efforts to enhance external competitiveness and economic diversification. Improving infrastructure and human resources, as well as trade facilitation, are critical to enhancing competitiveness and productivity. In addition, given a relatively narrow growth base, continuing efforts to diversify growth are also essential, and the tourism-related service sector shows great potential.
By Khan Sophirom


text:
Setting the standard
in sustainability
and ingredient purity...
ECOCERT Certified Natural and Organic Beauty Products
ECOCERT is one of the largest and most respected organic certification organizations in the world. Founded in France in 1991, it carries out inspections in over 80 countries and sets the standard for natural and organic cosmetics worldwide, ensuring sustainability, environmentally friendly processes and products formulated without GMO, Parabens, Phenoxyethanol, Nanoparticles, Silicon, PEG, synthetic perfumes and dyes or animal-derived ingredients. It offers the most natural seal of approval.