ThunkableWebviewerExtension.postMessage('loaded');//send Thunkable a ready message to respond with UID raw_convert: 'aspose', defaultSource: "local", ThunkableWebviewerExtension.receiveMessage(function (message) { if (message.indexOf("Thunkable") != -1) {//requires message from Thunkable. looking for Thunkable specific message. var uidfolder = message.slice(9)//parsing UID folder name from message. var myWidget = cloudinary.createUploadWidget({ // cloudName: '***',//currently using unsigned Preset cloudName: 'ealalin2020',//modify to give the name of my cloudinary used uploadPreset: 'ml_default', multiple: true, resource_type: 'auto', folder: uidfolder,//Save to users asset folder. Creates folder if doesn't exist. sources: ['local', 'url', 'facebook', 'image_search'], dropboxAppKey: '***', // googleApiKey: '***' googleApiKey: '362758469977132' // give the APIKey of my cloudinary used }, (error, result) => { if (!error && result && result.event === "success") { console.log('Done uploading..: ', result.info); ThunkableWebviewerExtension.postMessage(result.info.secure_url);//.info.secure_url); } else if (result.event === 'abort') { ThunkableWebviewerExtension.postMessage('aborted') } else if (!error && result && result.event === 'queues-end') { ThunkableWebviewerExtension.postMessage('finished') } }); myWidget.open();//opens created widget after messages are swapped. } });