<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-4191548740220130749</id><updated>2017-06-07T11:00:24.956-07:00</updated><category term="firebase" /><category term="Firebase Analytics" /><category term="Develop" /><category term="featured" /><category term="Firebase Cloud Messaging" /><category term="Android Studio" /><category term="AdMob" /><category term="Firebase Realtime Database" /><category term="Remote Config" /><category term="Crash Reporting" /><category term="Test Lab" /><category term="Admin SDK" /><category term="Fabric" /><category term="Firebase App Indexing" /><category term="Firebase Authentication" /><category term="Firebase Dynamic Links" /><category term="Firebase Notifications" /><category term="cloud functions for firebase" /><category term="event" /><category term="Android" /><category term="Announcement" /><category term="BigQuery" /><category term="Cloud" /><category term="I/O" /><category term="Pirate Metrics" /><category term="Storage" /><category term="io17" /><category term="#io17" /><category term="AdWords" /><category term="Firebase Invites" /><category term="I/O 2017" /><category term="Santa Tracker" /><category term="Todd Kerpelman" /><category term="Udacity" /><category term="Unity" /><category term="analytics" /><category term="cloud functions" /><category term="engagement" /><category term="games" /><category term="ios" /><category term="mobile" /><category term="training" /><category term="zero to app" /><category term="API" /><category term="Case Study" /><category term="Espresso" /><category term="Firebass" /><category term="HTTPS" /><category term="ID token verification" /><category term="IDFA" /><category term="James Tamplin" /><category term="Messaging" /><category term="Metrics" /><category term="Next" /><category term="Performance Monitoring" /><category term="Sign-in Security" /><category term="Stewart Miles" /><category term="WWDC" /><category term="ads" /><category term="advertisers" /><category term="android development" /><category term="attribution" /><category term="auth" /><category term="blaze" /><category term="concurrent connections" /><category term="custom token minting" /><category term="dynamic content" /><category term="firebase admin sdks" /><category term="firebase hosting" /><category term="flame" /><category term="io2017" /><category term="ios development" /><category term="java" /><category term="javascript" /><category term="learn firebase" /><category term="machine learning" /><category term="moderation" /><category term="moderator" /><category term="node" /><category term="open source" /><category term="party" /><category term="phone" /><category term="python" /><category term="sdks" /><category term="wattpad" /><category term="web" /><title type="text">The Firebase Blog</title><subtitle type="html" /><link rel="alternate" type="text/html" href="http://firebase.googleblog.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" /><author><name>ewood</name><uri>http://www.blogger.com/profile/12341551220176883769</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>195</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/FirebaseBlog" /><feedburner:info uri="firebaseblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-7879859687309978351</id><published>2017-06-07T11:00:00.000-07:00</published><updated>2017-06-07T11:00:24.968-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cloud functions" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud functions for firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="dynamic content" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="HTTPS" /><title type="text">Serving dynamic content with Cloud Functions on Firebase Hosting</title><content type="html">&lt;figure class="profile"&gt;  &lt;div class="profile-picture"&gt;&lt;img alt="Michael Bleigh" src="https://1.bp.blogspot.com/-MTGnHEPkrmo/V-LEf1CTtMI/AAAAAAAABwY/H9okWkyDthI74QthwGeuKtEBjdR-c49TwCLcB/s1600/bleigh-md.jpg" style="margin: 0 0 0 0%;" /&gt;  &lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Michael Bleigh&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Engineer, Firebase Hosting&lt;/em&gt;  &lt;/figcaption&gt;&lt;/figure&gt; &lt;p&gt;&lt;a href="https://firebase.googleblog.com/2014/05/introducing-firebase-hosting.html"&gt;Three years ago&lt;/a&gt;, we launched Firebase Hosting to make it easier for developers to deliver fast, engaging experiences on the web. &lt;a href="https://firebase.googleblog.com/2017/03/introducing-cloud-functions-for-firebase.html"&gt;Two months ago&lt;/a&gt;, we launched the beta of Cloud Functions for Firebase to let developers write custom backend logic without having to worry about servers or infrastructure. More recently at Google I/O, we brought Firebase Hosting and Cloud Functions together to provide a flexible set of tools to build Progressive Web Apps with world-class scale and performance. &lt;/p&gt;&lt;p&gt;You can connect an HTTPS Cloud Function to your Firebase Hosting app by adding a rewrite to the &lt;code&gt;firebase.json&lt;/code&gt; configuration for your project: &lt;/p&gt;  &lt;pre class="prettyprint"&gt;&lt;br /&gt;{&lt;br /&gt;  "hosting": {&lt;br /&gt;    "rewrites": [&lt;br /&gt;      {"source": "/function/**", "function":"myFunction"}&lt;br /&gt;    ]&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Once connected, matching requests seamlessly proxy to your Cloud Function (in the example above, a function named &lt;code&gt;myFunction&lt;/code&gt;). This one-line change enables exciting new capabilities for Firebase Hosting users including: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Server-Side Rendering. &lt;/b&gt;Until now, Firebase Hosting has only served static content. Now you can serve dynamic content using industry-standard libraries like &lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt;, while still leveraging a lightning-fast global CDN cache. &lt;li&gt;&lt;b&gt;Custom APIs.&lt;/b&gt; With Cloud Functions and Firebase Hosting, you can create custom API endpoints on your own domain, avoiding the overhead of cross-origin requests. Plus, with a few extra &lt;a href="https://github.com/firebase/functions-samples/tree/master/authorized-https-endpoint"&gt;lines of code&lt;/a&gt; you can authorize your endpoints through Firebase Auth. &lt;li&gt;&lt;b&gt;User-Generated Web Content.&lt;/b&gt; For the first time, Firebase Hosting can generate content compatible with &lt;a href="https://www.ampproject.org/"&gt;AMP&lt;/a&gt;, &lt;a href="https://dev.twitter.com/cards/overview"&gt;Twitter Cards&lt;/a&gt;, and more without requiring a deploy. This means your Firebase Hosting apps can be more shareable and more searchable than ever before.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For Cloud Functions users, you can now run functions on an SSL-secured custom domain and get powerful caching to avoid unnecessary executions. &lt;/p&gt;&lt;p&gt;To get started using Cloud Functions on Firebase Hosting for your own Firebase project, take a look at our &lt;a href="https://firebase.google.com/docs/hosting/functions"&gt;documentation&lt;/a&gt;. You can also learn more in our I/O session: &lt;a href="https://www.youtube.com/watch?v=R3v8EcYzf_M&amp;feature=youtu.be&amp;list=PLl-K7zZEsYLma7gxYxtEwO1rsAPn7wkV_"&gt;Building Fast Web Experiences with Firebase Hosting&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/h9n2hoqpMyA" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/7879859687309978351" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/7879859687309978351" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/h9n2hoqpMyA/serving-dynamic-content-with-cloud.html" title="Serving dynamic content with Cloud Functions on Firebase Hosting" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-MTGnHEPkrmo/V-LEf1CTtMI/AAAAAAAABwY/H9okWkyDthI74QthwGeuKtEBjdR-c49TwCLcB/s72-c/bleigh-md.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/06/serving-dynamic-content-with-cloud.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-4374371566828873116</id><published>2017-06-02T09:00:00.000-07:00</published><updated>2017-06-04T11:07:36.488-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cloud functions" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud functions for firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="moderation" /><category scheme="http://www.blogger.com/atom/ns#" term="moderator" /><title type="text">Content Moderation with Cloud Functions for Firebase</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Nicolas Garnier" src="https://4.bp.blogspot.com/-I7wQ0XOVV5I/WTB5Q5jrUBI/AAAAAAAABJA/A4eSyTG1_aQ-S0tVB2zhjrU2KIOVBTv2QCLcB/s1600/Headshot%2B%25281%2529.jpg" style="margin-left: 0px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Nicolas Garnier&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Developer Programs Engineer&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;In apps that allow users to post public content - for instance in forums, social networks and blogging platforms - there is always a risk that inappropriate content could get published. In this post, we'll look at ways you can automatically moderate offensive content in your Firebase app using &lt;a href="https://firebase.google.com/features/functions/"&gt;Cloud Functions&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;The most commonly used strategy to moderate content is "reactive moderation". Typically, you'll add a link allowing users to report inappropriate content so that you can manually review and take down the content that does comply with your house rules. You can better prevent offensive content from being publicly visible and complement your reactive moderation by adding automated moderation mechanisms. Let's see how you can easily add automatic checks for offensive content in text and photos published by users on your Firebase apps using Cloud Functions. &lt;/p&gt;&lt;p&gt;We'll perform two types of automatic content moderation: &lt;/p&gt;&lt;p&gt;&lt;b&gt;Text moderation&lt;/b&gt; where we'll remove swearwords and all shouting (e.g. "SHOUTING!!!"). &lt;/p&gt;&lt;div class="asset"&gt;&lt;a href="https://1.bp.blogspot.com/-vRAfp-fHFJk/WTB5dDGn-tI/AAAAAAAABJE/t854KmtNxy8wohnn5Vhcj-I3Dmx54-ztwCLcB/s1600/image1.png" imageanchor="1" &gt;&lt;img border="0" src="https://1.bp.blogspot.com/-vRAfp-fHFJk/WTB5dDGn-tI/AAAAAAAABJE/t854KmtNxy8wohnn5Vhcj-I3Dmx54-ztwCLcB/s1600/image1.png" data-original-width="472" data-original-height="207" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;Image moderation&lt;/b&gt; where we'll blur images that contain either adult or violent content. &lt;/p&gt;&lt;div class="asset"&gt;&lt;a href="https://2.bp.blogspot.com/-AqLjreRLqkY/WTB5jRJq6jI/AAAAAAAABJI/R7mgTn7TihA5hPNlnjBSYXyEnrUxgXCDACLcB/s1600/image2.png" imageanchor="1" &gt;&lt;img border="0" src="https://2.bp.blogspot.com/-AqLjreRLqkY/WTB5jRJq6jI/AAAAAAAABJI/R7mgTn7TihA5hPNlnjBSYXyEnrUxgXCDACLcB/s1600/image2.png" data-original-width="233" data-original-height="152" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Automatic moderation, by nature, needs to be performed in a trusted environment (i.e. not on the client), so Cloud Functions for Firebase is a great, natural fit for this. Two functions will be needed to perform the two types of moderation. &lt;/p&gt;&lt;h2&gt;Text Moderation&lt;/h2&gt;&lt;p&gt;The text moderation will be performed by a Firebase Realtime Database triggered function named &lt;code&gt;moderator&lt;/code&gt;. When a user adds a new comment or post to the Realtime Database, a function is triggered which uses the &lt;a href="https://www.npmjs.com/package/bad-words"&gt;bad-words&lt;/a&gt; npm package to remove swear words.We'll then use the &lt;a href="https://www.npmjs.com/package/capitalize-sentence"&gt;capitalize-sentence&lt;/a&gt;npm package to fix the case of messages that contain too many uppercase letters (which typically meaning users are shouting). The final step will be to write back the moderated message to the Realtime Database. &lt;/p&gt;&lt;p&gt;To illustrate this we'll use a simple data structure that represents a list of messages that have been written by users of a chat room. These are made of an object with a &lt;code&gt;text&lt;/code&gt; attribute that gets added to the &lt;code&gt;/messages&lt;/code&gt; list: &lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;/functions-project-12345&lt;br /&gt;   /messages&lt;br /&gt;       /key-123456&lt;br /&gt;           text: "This is my first message!"&lt;br /&gt;       /key-123457&lt;br /&gt;           text: "IN THIS MESSAGE I AM SHOUTING!!!"&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Once the function has run on the newly added messages, we'll add two attributes: &lt;code&gt;sanitized&lt;/code&gt; which is &lt;code&gt;true&lt;/code&gt; when message has been verified by our moderation function and &lt;code&gt;moderated&lt;/code&gt; which is &lt;code&gt;true&lt;/code&gt;if it was detected that the message contained offensive content and was modified. For instance, after the function runs on the two sample messages above we should get: &lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;/functions-project-12345&lt;br /&gt;   /messages&lt;br /&gt;       /key-123456&lt;br /&gt;           text: "This is my first message!",&lt;br /&gt;           sanitized: true,&lt;br /&gt;           moderated: false&lt;br /&gt;       /key-123457&lt;br /&gt;           text: "In this message I am shouting."&lt;br /&gt;           sanitized: true,&lt;br /&gt;           moderated: true&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Our &lt;code&gt;moderator&lt;/code&gt; function will be triggered every time there is a write to one of the messages. We set this up by using the &lt;code&gt;functions.database().path('/messages/{messageId}').onWrite(...)&lt;/code&gt;trigger rule. We'll moderate the message and write back the moderated message into the Realtime Database: &lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;exports.moderator = functions.database.ref('/messages/{messageId}')&lt;br /&gt;  .onWrite(event =&gt; {&lt;br /&gt;      const message = event.data.val();&lt;br /&gt;&lt;br /&gt;      if (message &amp;&amp; !message.sanitized) {&lt;br /&gt;        // Retrieved the message values.&lt;br /&gt;        console.log('Retrieved message content: ', message);&lt;br /&gt;&lt;br /&gt;        // Run moderation checks on on the message and moderate if needed.&lt;br /&gt;        const moderatedMessage = moderateMessage(message.text);&lt;br /&gt;&lt;br /&gt;        // Update the Firebase DB with checked message.&lt;br /&gt;        console.log('Message has been moderated. Saving to DB: ', moderatedMessage);&lt;br /&gt;        return event.data.adminRef.update({&lt;br /&gt;          text: moderatedMessage,&lt;br /&gt;          sanitized: true,&lt;br /&gt;          moderated: message.text !== moderatedMessage&lt;br /&gt;        });&lt;br /&gt;      }&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;In the &lt;code&gt;moderateMessage&lt;/code&gt; function, we'll first check if the user is shouting and if so fix the case of the sentence and then remove all bad words using the &lt;code&gt;bad-words&lt;/code&gt; package filter. &lt;/p&gt;  &lt;pre class="prettyprint"&gt;&lt;br /&gt;function moderateMessage(message) {&lt;br /&gt;  // Re-capitalize if the user is Shouting.&lt;br /&gt;  if (isShouting(message)) {&lt;br /&gt;    console.log('User is shouting. Fixing sentence case...');&lt;br /&gt;    message = stopShouting(message);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Moderate if the user uses SwearWords.&lt;br /&gt;  if (containsSwearwords(message)) {&lt;br /&gt;    console.log('User is swearing. moderating...');&lt;br /&gt;    message = moderateSwearwords(message);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return message;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Returns true if the string contains swearwords.&lt;br /&gt;function containsSwearwords(message) {&lt;br /&gt;  return message !== badWordsFilter.clean(message);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Hide all swearwords. e.g: Crap =&gt; ****.&lt;br /&gt;function moderateSwearwords(message) {&lt;br /&gt;  return badWordsFilter.clean(message);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Detect if the current message is shouting. i.e. there are too many Uppercase&lt;br /&gt;// characters or exclamation points.&lt;br /&gt;function isShouting(message) {&lt;br /&gt;  return message.replace(/[^A-Z]/g, '').length &gt; message.length / 2 || message.replace(/[^!]/g, '').length &gt;= 3;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Correctly capitalize the string as a sentence (e.g. uppercase after dots)&lt;br /&gt;// and remove exclamation points.&lt;br /&gt;function stopShouting(message) {&lt;br /&gt;  return capitalizeSentence(message.toLowerCase()).replace(/!+/g, '.');&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Note: the bad-words package uses the &lt;a href="https://www.npmjs.com/package/badwords-list"&gt;badwords-list&lt;/a&gt; package's &lt;a href="https://github.com/web-mech/badwords-list/blob/master/lib/array.js"&gt;list of swear words&lt;/a&gt; which only contains around 400 of these. As you know the imagination of the user out there has no limit, so this is not an exhaustive list and you might want to extend the bad words dictionary. &lt;/p&gt;&lt;h2&gt;Image Moderation&lt;/h2&gt;&lt;p&gt;To moderate images we'll set up a &lt;code&gt;blurOffensiveImages&lt;/code&gt; function that will be triggered every time a file is uploaded to Cloud Storage. We set this up by using the &lt;code&gt;functions.cloud.storage().onChange(...)&lt;/code&gt; trigger rule. We'll check if the image contains violent or adult content using the &lt;a href="https://cloud.google.com/vision/"&gt;Google Cloud Vision API&lt;/a&gt;. The Cloud Vision API has a feature that specifically allows to &lt;a href="https://cloud.google.com/vision/#detect-inappropriate-content"&gt;detect inappropriate content&lt;/a&gt; in images. Then if the image is inappropriate we'll blur the image: &lt;/p&gt;  &lt;pre class="prettyprint"&gt;&lt;br /&gt;exports.blurOffensiveImages = functions.storage.object().onChange(event =&gt; {&lt;br /&gt;  const object = event.data;&lt;br /&gt;  const file = gcs.bucket(object.bucket).file(object.name);&lt;br /&gt;&lt;br /&gt;  // Exit if this is a move or deletion event.&lt;br /&gt;  if (object.resourceState === 'not_exists') {&lt;br /&gt;    return console.log('This is a deletion event.');&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Check the image content using the Cloud Vision API.&lt;br /&gt;  return vision.detectSafeSearch(file).then(data =&gt; {&lt;br /&gt;    const safeSearch = data[0];&lt;br /&gt;    console.log('SafeSearch results on image', safeSearch);&lt;br /&gt;&lt;br /&gt;    if (safeSearch.adult || safeSearch.violence) {&lt;br /&gt;      return blurImage(object.name, object.bucket, object.metadata);&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;To blur the image stored in Cloud Storage, we'll first download it locally on the Cloud Functions instance, blur the image with ImageMagick, which is installed by default on all instances, then re-upload the image to Cloud Storage: &lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;function blurImage(filePath, bucketName, metadata) {&lt;br /&gt; const filePathSplit = filePath.split('/');&lt;br /&gt; filePathSplit.pop();&lt;br /&gt; const fileDir = filePathSplit.join('/');&lt;br /&gt; const tempLocalDir = `${LOCAL_TMP_FOLDER}${fileDir}`;&lt;br /&gt; const tempLocalFile = `${LOCAL_TMP_FOLDER}${filePath}`;&lt;br /&gt; const bucket = gcs.bucket(bucketName);&lt;br /&gt;&lt;br /&gt; // Create the temp directory where the storage file will be downloaded.&lt;br /&gt; return mkdirp(tempLocalDir).then(() =&gt; {&lt;br /&gt;   console.log('Temporary directory has been created', tempLocalDir);&lt;br /&gt;   // Download file from bucket.&lt;br /&gt;   return bucket.file(filePath).download({&lt;br /&gt;     destination: tempLocalFile&lt;br /&gt;   });&lt;br /&gt; }).then(() =&gt; {&lt;br /&gt;   console.log('The file has been downloaded to', tempLocalFile);&lt;br /&gt;   // Blur the image using ImageMagick.&lt;br /&gt;   return exec(`convert ${tempLocalFile} -channel RGBA -blur 0x8 ${tempLocalFile}`);&lt;br /&gt; }).then(() =&gt; {&lt;br /&gt;   console.log('Blurred image created at', tempLocalFile);&lt;br /&gt;   // Uploading the Blurred image.&lt;br /&gt;   return bucket.upload(tempLocalFile, {&lt;br /&gt;     destination: filePath,&lt;br /&gt;     metadata: {metadata: metadata} // Keeping custom metadata.&lt;br /&gt;   });&lt;br /&gt; }).then(() =&gt; {&lt;br /&gt;   console.log('Blurred image uploaded to Storage at', filePath);&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://firebase.google.com/features/functions/"&gt;Cloud Functions for Firebase&lt;/a&gt; can be a great tool to reactively and automatically apply moderation rules. Feel free to have a look at our open source samples for &lt;a href="https://github.com/firebase/functions-samples/tree/master/text-moderation"&gt;text moderation&lt;/a&gt; and &lt;a href="https://github.com/firebase/functions-samples/tree/master/moderate-images"&gt;image moderation&lt;/a&gt;. &lt;/p&gt; &lt;style&gt;.asset { text-align: center; width: 500px; padding: 10px; margin: auto; display: block; max-width: 100%; } &lt;/style&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/O5UPKyPuNkg" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/4374371566828873116" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/4374371566828873116" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/O5UPKyPuNkg/content-moderation-with-cloud-functions.html" title="Content Moderation with Cloud Functions for Firebase" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-I7wQ0XOVV5I/WTB5Q5jrUBI/AAAAAAAABJA/A4eSyTG1_aQ-S0tVB2zhjrU2KIOVBTv2QCLcB/s72-c/Headshot%2B%25281%2529.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/06/content-moderation-with-cloud-functions.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-2824582270621749510</id><published>2017-05-30T12:32:00.000-07:00</published><updated>2017-05-31T07:40:21.986-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance Monitoring" /><title type="text"> Introducing Firebase Performance Monitoring</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Laurence Moroney" src="https://4.bp.blogspot.com/-b-sY-uZc9cg/WS2-7y9_eWI/AAAAAAAABIY/vHDwydUsjEInI77UcZUYC7jVji_nMRnfgCLcB/s200/Screen%2BShot%2B2017-05-30%2Bat%2B11.49.19%2BAM.png" style="margin-left: -2px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Ali Abdelhadi&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Product Manager&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;  Monitoring performance from the end user's point of view - both app code performance and network responsiveness/reliability - is a challenge for building great mobile apps. You have to be able to understand conditions that need improvement, in order to avoid user churn and negative reviews. Conversely, we have seen that 60% of 5-star reviews on Google Play mention speed, design or usability. &lt;br /&gt;&lt;br /&gt;The biggest challenge in monitoring performance in native apps is understanding context. It's not enough to know that users experience delays or that your animations are not running smoothly; you need to understand where in your app that happens. It's also important to understand how those experiences differ for various countries, devices, OS levels, etc. &lt;br /&gt;&lt;br /&gt;This is why we built &lt;a href="https://firebase.google.com/products/performance/"&gt;Firebase Performance Monitoring&lt;/a&gt; for iOS and Android. It provides an SDK to capture and instrument performance metrics in production, and a console to gain insights about the data captured by the SDK. &lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/0EHSPFvH7vk" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Firebase Performance Monitoring provides two main features: traces and network activity monitoring. Let's talk about traces first. Traces allow you to instrument parts of your app to know the duration of an action, as well as attach custom metrics to that action using the "counter" API. As an example, you might set up a trace for the time from starting an image load until the image is fully rendered on the screen, and track how many times you hit or miss the cache while loading images using counters.&lt;br /&gt;Just by installing the SDK, you get an automated trace for your app start so you can monitor how long it takes users to go through a cold app start. &lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-7Kd8TbtFVfk/WS3ClZeOkiI/AAAAAAAABIk/0US8FoTz1awwvHTGF52IZr_A7l2Y4eqOACLcB/s1600/Screen%2BShot%2B2017-05-30%2Bat%2B12.05.33%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="748" data-original-width="972" height="492" src="https://2.bp.blogspot.com/-7Kd8TbtFVfk/WS3ClZeOkiI/AAAAAAAABIk/0US8FoTz1awwvHTGF52IZr_A7l2Y4eqOACLcB/s640/Screen%2BShot%2B2017-05-30%2Bat%2B12.05.33%2BPM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/dl&gt;&lt;br /&gt;The other feature Firebase Performance offers is monitoring network activity. HTTP/S requests made by your app will be automatically monitored from the time they are sent until the response is received. For each URL pattern, you will see the response time, payload size and success rate. &lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-_Hxl59GJNXI/WS3Cv8ezgmI/AAAAAAAABIo/oFJ--ni02DkuSmh11qWBxJpq2s1UJA82QCLcB/s1600/Screen%2BShot%2B2017-05-30%2Bat%2B12.06.23%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1210" data-original-width="1098" height="640" src="https://3.bp.blogspot.com/-_Hxl59GJNXI/WS3Cv8ezgmI/AAAAAAAABIo/oFJ--ni02DkuSmh11qWBxJpq2s1UJA82QCLcB/s640/Screen%2BShot%2B2017-05-30%2Bat%2B12.06.23%2BPM.png" width="580" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;dl&gt;&lt;br /&gt;&lt;/dl&gt;When failures happen, you will also see a breakdown of 400 and 500 response codes that caused them. &lt;/dl&gt;&lt;dl&gt;&lt;br /&gt;&lt;/dl&gt;&lt;dl&gt;&lt;br /&gt;&lt;/dl&gt;&lt;dl&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-Xne_el6El60/WS3C5mLLDzI/AAAAAAAABIs/Ly5CJqsxymQNHBmqChRcyCtM3b_LkRxKwCLcB/s1600/Screen%2BShot%2B2017-05-30%2Bat%2B12.07.02%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="490" data-original-width="1216" height="256" src="https://1.bp.blogspot.com/-Xne_el6El60/WS3C5mLLDzI/AAAAAAAABIs/Ly5CJqsxymQNHBmqChRcyCtM3b_LkRxKwCLcB/s640/Screen%2BShot%2B2017-05-30%2Bat%2B12.07.02%2BPM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;dl&gt;&lt;br /&gt;&lt;/dl&gt;All metrics collected for traces and network can be broken down by country, device, app version and OS version. This helps you narrow down the cause of an issue and fix it more easily. &lt;/dl&gt;&lt;dl&gt;&lt;br /&gt;&lt;/dl&gt;&lt;dl&gt;&lt;br /&gt;&lt;/dl&gt;&lt;dl&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-l03_n-0Sa8I/WS3DBU1vx8I/AAAAAAAABIw/VnmwAmnhjQIYI9dyDKP00z4hp8c_ZbxQACLcB/s1600/Screen%2BShot%2B2017-05-30%2Bat%2B12.07.32%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="807" data-original-width="1214" height="424" src="https://2.bp.blogspot.com/-l03_n-0Sa8I/WS3DBU1vx8I/AAAAAAAABIw/VnmwAmnhjQIYI9dyDKP00z4hp8c_ZbxQACLcB/s640/Screen%2BShot%2B2017-05-30%2Bat%2B12.07.32%2BPM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/dl&gt;&lt;br /&gt;Firebase Performance Monitoring is available now in beta. To learn more, check out the documentation &lt;a href="http://firebase.google.com/docs/perf-mon"&gt;right here&lt;/a&gt;, or watch our &lt;a href="https://www.youtube.com/watch?v=HwFIxbCR4Hs"&gt;I/O session&lt;/a&gt; for a deep dive. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/8trwCyAfQOY" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/2824582270621749510" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/2824582270621749510" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/8trwCyAfQOY/introducing-firebase-performance.html" title=" Introducing Firebase Performance Monitoring" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-b-sY-uZc9cg/WS2-7y9_eWI/AAAAAAAABIY/vHDwydUsjEInI77UcZUYC7jVji_nMRnfgCLcB/s72-c/Screen%2BShot%2B2017-05-30%2Bat%2B11.49.19%2BAM.png" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/05/introducing-firebase-performance.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-3182415262423250878</id><published>2017-05-25T10:20:00.000-07:00</published><updated>2017-05-25T15:18:54.944-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="auth" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="phone" /><title type="text">Firebase Phone Auth</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Laurence Moroney" src="https://4.bp.blogspot.com/-yOoCTKrYcvA/V031rmLWzFI/AAAAAAAAABg/MWGeqAhYRdsnp-LARhhS7gTKIXPH2LwHQCLcB/s1600/laurence-moroney.png" style="margin-left: 0px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Laurence Moroney&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Developer Advocate&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;      &lt;p&gt;When Firebase was first released, it came with a number of authentication schemes: &lt;/p&gt;&lt;p&gt;You could build an app for &lt;b&gt;email &amp; password &lt;/b&gt;authentication (&lt;a href="https://firebase.google.com/docs/auth/ios/password-auth"&gt;iOS&lt;/a&gt;, &lt;a href="https://firebase.google.com/docs/auth/android/password-auth"&gt;Android&lt;/a&gt;, &lt;a href="https://firebase.google.com/docs/auth/web/password-auth"&gt;Web&lt;/a&gt;), where the user provides you with basic details -- and Firebase would manage signing in using those as their identity.  You could also build using &lt;b&gt;federated identity&lt;/b&gt; where, instead of signing up for your app, users could simply sign in using credentials provided by third parties such as &lt;a href="https://firebase.google.com/docs/auth/android/google-signin"&gt;Google&lt;/a&gt;, &lt;a href="https://firebase.google.com/docs/auth/android/facebook-login"&gt;Facebook&lt;/a&gt;, &lt;a href="https://firebase.google.com/docs/auth/android/twitter-login"&gt;Twitter&lt;/a&gt;or &lt;a href="https://firebase.google.com/docs/auth/android/github-auth"&gt;GitHub&lt;/a&gt;, or &lt;b&gt;anonymous &lt;/b&gt;authentication where you could apply security rules to people who haven't yet signed up. &lt;/p&gt;&lt;p&gt;One type of authentication that was requested by a number of developers was the ability to sign in using a phone number. With that in mind, we're delighted to announce that Firebase Auth now supports phone number authentication. If you're currently using the Digits SDK for phone number auth, check out the announcement &lt;a href="http://get.digits.com/blog/introducing-firebase-phone-authentication"&gt;here&lt;/a&gt;for details on the migration to Firebase Auth. &lt;/p&gt;&lt;p&gt;Here's how Firebase Phone Auth works. &lt;/p&gt;&lt;div class="parent"&gt; &lt;div class="child-1l"&gt;  &lt;a href="https://1.bp.blogspot.com/-afxkcNzOwnE/WSX8k7CrGAI/AAAAAAAABH0/X_da0EDYIlAW8l8Tc9IPEqvTbz_4OASuQCLcB/s1600/image3.png" &gt;&lt;img src="https://1.bp.blogspot.com/-afxkcNzOwnE/WSX8k7CrGAI/AAAAAAAABH0/X_da0EDYIlAW8l8Tc9IPEqvTbz_4OASuQCLcB/s1600/image3.png" /&gt;&lt;/a&gt; &lt;/div&gt; &lt;div class="child-1r"&gt;  &lt;h2&gt;The Sign In Screen&lt;/h2&gt;  &lt;p&gt;Here's an example of an app that supports phone auth as well as federated   identity via Google and Facebook, and basic email/password authentication.&lt;/p&gt;  &lt;p&gt;It has been built using &lt;a   href="https://opensource.google.com/projects/firebaseui"&gt;FirebaseUI&lt;/a&gt;, so many   of the flows that you see in this article are automatically implemented for you   when you integrate it.&lt;/p&gt;  &lt;p&gt;As you can see at the bottom of the screen, there's a 'Sign in with Phone'   option.&lt;/p&gt;  &lt;p&gt;Let's take a look at what happens when the user taps that.&lt;/p&gt; &lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Sign In Flow&lt;/h2&gt;&lt;p&gt;When the user first taps the Sign In with Phone button, they’ll enter the phone number for the device. When they press ‘Verify’, the number will be sent to Firebase, which will generate a 6-digit code that is sent via SMS to their device.&lt;/p&gt;&lt;div class="fullsize"&gt; &lt;a href="https://3.bp.blogspot.com/-z6urG04FmkA/WSX8qDiGmWI/AAAAAAAABH4/_EH8UABVq9A7fxQ9dg6AJZaTrx5gAKEggCLcB/s1600/image2.png" &gt;&lt;img src="https://3.bp.blogspot.com/-z6urG04FmkA/WSX8qDiGmWI/AAAAAAAABH4/_EH8UABVq9A7fxQ9dg6AJZaTrx5gAKEggCLcB/s1600/image2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;If the user enters the correct code, Firebase will validate them and add them as a recognized user. They’ll then stay signed in for future sessions. &lt;/p&gt;&lt;p&gt;You’ll see them as a verified user in the Firebase Console:&lt;/p&gt;&lt;div class="fullsize"&gt; &lt;a href="https://1.bp.blogspot.com/-ZHB291WRQFI/WSX8zbIw87I/AAAAAAAABH8/Z5EGqrTOdqgrr75gB62n8XUOVqDx8SygACLcB/s1600/image1.png" &gt;&lt;img src="https://1.bp.blogspot.com/-ZHB291WRQFI/WSX8zbIw87I/AAAAAAAABH8/Z5EGqrTOdqgrr75gB62n8XUOVqDx8SygACLcB/s1600/image1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;You can learn more about Firebase Authentication on the &lt;a href="https://firebase.google.com/products/auth/"&gt;Firebase Developers Site&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Firebase UI is an Open Source library that lets you quickly get up and running with best-practice  sign in and sign up  flows. Phone Auth with Firebase UI is presently available on&lt;a href="https://github.com/firebase/FirebaseUI-iOS"&gt;iOS&lt;/a&gt; and the &lt;a href="https://github.com/firebase/firebaseui-web"&gt;Web&lt;/a&gt;, and coming soon to &lt;a href="https://github.com/firebase/FirebaseUI-Android"&gt;Android&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;We're continuing to grow and build Firebase and Firebase Authentication, and we'd love to hear your feedback, so please reach out to us at &lt;a href="https://firebase.google.com/support"&gt;firebase.google.com/support&lt;/a&gt;. &lt;/p&gt; &lt;style&gt; .parent {   display: flex;   width: 100%;   justify-content: space-around;   align-items: center;   flex-wrap: wrap;  }  .child-1l {   min-width: 200px;   width: 40%;   padding: 10px 20px 10px 0;     }  .child-1r {   width: 60%;   padding: 10px 0;  }  .fullsize img{   width: 100%;   padding: 10px 0;  } &lt;/style&gt; &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/DTsMVxj98hA" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/3182415262423250878" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/3182415262423250878" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/DTsMVxj98hA/firebase-phone-auth.html" title="Firebase Phone Auth" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-yOoCTKrYcvA/V031rmLWzFI/AAAAAAAAABg/MWGeqAhYRdsnp-LARhhS7gTKIXPH2LwHQCLcB/s72-c/laurence-moroney.png" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/05/firebase-phone-auth.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-4801680335440881081</id><published>2017-05-23T12:03:00.001-07:00</published><updated>2017-05-25T15:22:40.743-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AdMob" /><category scheme="http://www.blogger.com/atom/ns#" term="analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Firebase Analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="io17" /><title type="text">What's new with Analytics?</title><content type="html">&lt;figure class="profile"&gt;  &lt;div class="profile-picture"&gt;&lt;img alt="Krista Seiden" src="https://1.bp.blogspot.com/-ZnruyWJamSk/WSRiQz3F9qI/AAAAAAAABHE/sDn_qbimY7QzhD3n3G_A_4T2QvpT6DfNwCLcB/s1600/KristaSeiden356.jpg" style="margin: 0px 0px 10px 0%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Krista Seiden&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Firebase Analytics&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;  &lt;p&gt;Here at Firebase, we know that the first step in making improvements in your app is knowing how your users are interacting with it: what parts they love, where they're having trouble, and what features are sadly underutilized. This is why we built Google Analytics for Firebase from the ground up to be a complete mobile analytics solution, with free and unlimited app analytics designed specifically for the way mobile apps are built. &lt;/p&gt;&lt;p&gt;Now, if you were paying close attention to the last paragraph, you may have noticed that the product formerly known as Firebase Analytics is now called "Google Analytics for Firebase." Don't worry; it's the same analytics product you know and love -- and we'll talk more about the name change in a bit. &lt;/p&gt;&lt;p&gt;Over the last year, we've made a number of improvements to Google Analytics for Firebase, including adding &lt;a href="https://firebase.googleblog.com/2017/03/realtime-analytics-for-everyone.html"&gt;StreamView&lt;/a&gt;, which gives you an impression of how users are interacting with your app at this very moment, and DebugView, which allows you to see in precise detail what analytics events (and errors!) might be happening on a test device. &lt;/p&gt;&lt;p&gt;This year at Google I/O, we were thrilled to &lt;a href="https://firebase.googleblog.com/2017/05/whats-new-from-firebase-at-google-io.html"&gt;announce&lt;/a&gt;a number of new improvements and enhancements that make using analytics even better. In case you missed those presentations (which you can also &lt;a href="https://www.youtube.com/playlist?list=PLl-K7zZEsYLma7gxYxtEwO1rsAPn7wkV_"&gt;watch on YouTube&lt;/a&gt;), let's give you a quick summary of what's new with Google Analytics for Firebase. &lt;/p&gt;  &lt;h2&gt;Custom Parameter Reporting&lt;/h2&gt;&lt;p&gt;With Google Analytics for Firebase, you're allowed to submit up to 25 custom parameters alongside any events that you record in your app. For instance, if you were submitting a &lt;code&gt;end_of_round&lt;/code&gt; event in a game, you could submit a &lt;code&gt;user_score&lt;/code&gt; or &lt;code&gt;premium_coins_earned &lt;/code&gt;parameter along with that event. By analyzing these different parameter values, you could then ensure that your game had the high score distribution or general payout rate that you were expecting. &lt;/p&gt;&lt;p&gt;But up until now, it's been impossible to see the results of most of these custom event parameters without first exporting your data to BigQuery and doing the analysis there. Being able to view summaries of these event parameters directly in the Firebase console has been our most common feature request since analytics first launched last year. So we're very pleased to announce that we've taken our first big steps in making these reports available to you. &lt;/p&gt;&lt;p&gt;To get started with custom event parameters in Firebase, you'll need to let Google Analytics for Firebase know what parameters you're interested in. You can do this by going to the specific event in the Firebase console and clicking the "Add event parameters" button in the interface. From there, you can specify a parameter, note whether it's a number or a string, and add units of measurement, if applicable. &lt;/p&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-pU0mDpmtJOQ/WSRkCBsIc0I/AAAAAAAABHQ/lB-jTDFIuEIjazdXX719Fd8nKjruNNnMACLcB/s1600/customParametersSetup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://4.bp.blogspot.com/-pU0mDpmtJOQ/WSRkCBsIc0I/AAAAAAAABHQ/lB-jTDFIuEIjazdXX719Fd8nKjruNNnMACLcB/s640/customParametersSetup.png" width="640" height="287" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Once you've done that, you'll start seeing these parameter summaries directly in the console. We'll show you sums and averages for numeric values, and a list of your most popular values for strings.  &lt;/p&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-76R3PX9ba4s/WSRkNYHFzbI/AAAAAAAABHU/6nJgJq-3JWwnJKiJW_vPbSau435tY2_ZACLcB/s1600/customParametersReport.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://1.bp.blogspot.com/-76R3PX9ba4s/WSRkNYHFzbI/AAAAAAAABHU/6nJgJq-3JWwnJKiJW_vPbSau435tY2_ZACLcB/s640/customParametersReport.png" width="640" height="320" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Like other analytics reports available in Google Analytics for Firebase, you can filter these reports by user properties or audiences to get a better sense of how different users are interacting with your app in different ways.  &lt;/p&gt;&lt;p&gt;  Currently, you can specify up to 50 different event parameters for which you'd like to generate summary reports.  &lt;/p&gt;  &lt;h2&gt;Free Storage Tier in BigQuery&lt;/h2&gt;&lt;p&gt;Of course, if you want to analyze a greater number of custom event parameters, or want to do  more sophisticated analysis than what's available from the Firebase console, you can export your Google Analytics data directly into BigQuery, Google's data warehouse in the cloud. Analyzing your data in BigQuery is a very powerful way of running all sorts of ad hoc queries or custom analysis on your data, and we want to encourage all our developers to try it out. &lt;p&gt;  To assist you on your journey, we've now added a free tier of storage in BigQuery -- 10 GB of data to be exact -- for every project using Google Analytics for Firebase. Combine this free storage tier with the 1 TB of free monthly query usage that you get from BigQuery, and you can do an awful lot of BigQuery analysis for a relatively little amount of money. And with the new analytics report templates in Data Studio, making stylish reports on custom parameters (or anything else you can measure in BigQuery) is a cinch. &lt;p&gt;&lt;h2&gt;Firebase and AdMob&lt;/h2&gt;&lt;p&gt;We've made some major enhancements in the way Firebase and AdMob communicate with each other. Much like milk and cookies&lt;sup&gt;&lt;a href="#fn1" id="ref1"&gt;1&lt;/a&gt;&lt;/sup&gt;, mixing Firebase and AdMob together results in an exciting new flavor combination that complements the strengths of both products! &lt;p&gt;By linking your AdMob account to Firebase, your app will automatically record analytics events associated with AdMob (along with &lt;a href="https://support.google.com/admob/answer/3063564?hl=en"&gt;mediated ad units&lt;/a&gt;) just like any other analytics event. This gives Google Analytics for Firebase the ability to create reports on ad impressions, clicks, and exposure time, broken down by important characteristics such as screen, ad format or ad unit. This makes it easier than ever before to see which ads are most effective in your app, where you're earning the most ad dollars, or which ads your users spend the most time viewing. &lt;/p&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-c_WDzDPTjio/WSRkmDf2tQI/AAAAAAAABHY/wyEb4WlQ9dg4AYcV_ddSIbno6A-oNq0WACLcB/s1600/AdMob%2Bin%2BFA%2BReport.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://3.bp.blogspot.com/-c_WDzDPTjio/WSRkmDf2tQI/AAAAAAAABHY/wyEb4WlQ9dg4AYcV_ddSIbno6A-oNq0WACLcB/s640/AdMob%2Bin%2BFA%2BReport.png" width="640" height="124" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Linking your AdMob and Firebase accounts together also gives you a more complete picture of where you're making money in your app. Both the APRU reports on the dashboard and the Lifetime Value metrics in the Attribution reports will now include revenue generated from AdMob advertising, as well as in-app purchases.  &lt;/p&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-ZppsUxAzusc/WSRkz9b7kII/AAAAAAAABHc/_34-YTRpU2YlOIF7aTgg4DHEmBYLUldkQCLcB/s1600/ARPU%2Band%2BLTV.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://3.bp.blogspot.com/-ZppsUxAzusc/WSRkz9b7kII/AAAAAAAABHc/_34-YTRpU2YlOIF7aTgg4DHEmBYLUldkQCLcB/s640/ARPU%2Band%2BLTV.png" width="640" height="320" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;This can help you gain a much more complete understanding of how your app is doing from a revenue standpoint, and help you more accurately gauge which growth campaigns are bringing you users who are earning you the most revenue. &lt;/p&gt;  &lt;h2&gt;Automatic Screen Tracking&lt;/h2&gt;&lt;p&gt;If, like me, you enjoy spending your free time reading the latest Firebase Release Notes, you might have noticed that a few months ago, Firebase started adding &lt;a href="https://firebase.google.com/support/release-notes/ios#3.8.0"&gt;screen tracking&lt;/a&gt; support to the events that it was recording. This month, we're taking the first steps towards adding screen tracking reports in Google Analytics for Firebase, by showing you the top three screens your users are spending time on. You can find this information in the User Engagement section of the Firebase Dashboard.  &lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-84Qj0VAzBGo/WSRlDfiYrnI/AAAAAAAABHg/WpfWQL9bAAchjsH3251Eof7z3URLulNsQCLcB/s1600/Top%2Bthree%2Bscreens.png" imageanchor="1" style="padding-top: 1em; margin-top: 1em; margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://2.bp.blogspot.com/-84Qj0VAzBGo/WSRlDfiYrnI/AAAAAAAABHg/WpfWQL9bAAchjsH3251Eof7z3URLulNsQCLcB/s640/Top%2Bthree%2Bscreens.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Screen tracking reporting works behind the scenes by automatically logging a &lt;code&gt;screen_view&lt;/code&gt; event whenever a screen transition occurs. These events are then combined on the server to paint a more complete picture of the user's journey throughout your app. And just like any other event, you can view them in StreamView or DebugView, or analyze them through BigQuery.  If you would like to customize these events -- for instance, you're a game developer who has multiple "screens" all within the same ViewController -- you can do so with by &lt;a href="http://firebase.google.com/docs/analytics/screenviews"&gt;setting these events manually&lt;/a&gt; on the client.  &lt;/p&gt;  &lt;h2&gt;More Attribution Partners!&lt;/h2&gt;&lt;p&gt;You can already use Google Analytics for Firebase for &lt;a href="https://firebase.googleblog.com/2017/04/understanding-attribution-in-firebase.html"&gt;attribution tracking&lt;/a&gt;, which helps you learn not just which ad networks are sending you users, but which ones are sending you valuable users that you care about the most. And we're pleased to announce a new integration with DoubleClick Digital Marketing that will include attribution tracking for DoubleClick Campaign Manager and Bid Manager. Add this to the 50+ &lt;a href="https://firebase.google.com/products/analytics/partners/"&gt;third-party advertising networks&lt;/a&gt; (and growing!) that we've integrated into our system, and Firebase can help you make better decisions around where to spend your advertising dollars with true cross-network attribution data.  &lt;p&gt;&lt;h2&gt;New Name, Same Great Product&lt;/h2&gt;We're rebranding Firebase Analytics as Google Analytics for Firebase to make it clear that this is our recommended apps analytics solution for all mobile apps moving forward. But under the hood, you'll still be using the Firebase Analytics SDK with its event-driven model to generate all of your analytics data. &lt;p&gt;  If you're using the old Google Analytics Services SDK in your existing apps, don't worry; it's not going anywhere. But we encourage you to start adding the Firebase SDK in future releases. Using the Firebase SDK will give you access to the latest reports in Google Analytics for Firebase and to new functionality as it becomes available. If you're a long-time Google Analytics fan, you can use Google Tag Manager to automatically send your events data to those reports as well. If you need more help on this topic, we wrote a blog post a few months back that covers a few strategies on how to get both these analytics libraries working together in your app. &lt;a href="https://firebase.googleblog.com/2017/02/how-do-i-add-firebase-analytics-to-app.html"&gt;Give it a read sometime&lt;/a&gt;! &lt;/p&gt;  &lt;h2&gt;Try it Today!&lt;/h2&gt;&lt;p&gt;We're thrilled to be bringing you these improvements to Google Analytics for Firebase -- they should be already available in the &lt;a href="https://firebase.googleblog.com/2017/02/how-do-i-add-firebase-analytics-to-app.html"&gt;Give it a read sometime&lt;/a&gt; today (check out the demo project for an example!). If you haven't yet added analytics to your product, you can find all the documentation you need &lt;a href="https://firebase.google.com/docs/analytics/"&gt;here&lt;/a&gt; to get started. Give it a try, and let us know what you think! &lt;p&gt; &lt;sup id="fn1"&gt;1. Or chili and mango, which Steve Ganem assures me is delicious, but sounds weird to me.&lt;a href="#ref1" title="Jump back to footnote 1 in the text."&gt;↩&lt;/a&gt;&lt;/sup&gt;       &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/Q9Z_3Y2IHr8" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/4801680335440881081" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/4801680335440881081" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/Q9Z_3Y2IHr8/whats-new-with-analytics.html" title="What's new with Analytics?" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-ZnruyWJamSk/WSRiQz3F9qI/AAAAAAAABHE/sDn_qbimY7QzhD3n3G_A_4T2QvpT6DfNwCLcB/s72-c/KristaSeiden356.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/05/whats-new-with-analytics.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-6571813037552291089</id><published>2017-05-19T10:00:00.000-07:00</published><updated>2017-05-19T10:00:12.055-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Admin SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase admin sdks" /><category scheme="http://www.blogger.com/atom/ns#" term="ios" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><title type="text">Open sourcing the Firebase SDKs</title><content type="html">&lt;figure class="profile"&gt;  &lt;div class="profile-picture"&gt;&lt;img alt="Salman Qadri" src="https://1.bp.blogspot.com/-CtjHvcnX6t4/WR3ftjeqHHI/AAAAAAAABGo/8v9dXgs2Xog-GZqtiyFSKrXDM5Tm7CbgQCLcB/s1600/headshot.jpg" style="margin: 0px 0px 10px 0%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Salman Qadri&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Firebase Product Manager&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;em&gt;Originally posted on the &lt;a href="https://opensource.googleblog.com/2017/05/open-sourcing-firebase-sdks.html"&gt;Google Open Source Blog.&lt;/a&gt;&lt;/em&gt;&lt;p&gt;We are pleased to announce that we are taking our first steps towards open sourcing our client libraries. By making our SDKs open, we're aiming to show our commitment to greater transparency and to building a stronger developer community. To help further that goal, we'll be using GitHub as a core part of our own toolchain to enable all of you to contribute as well. As you find issues in our code, from inconsistent style to bugs, you can file issues through the standard GitHub issue tracker. You can also find our project in the &lt;a href="https://opensource.google.com/projects/firebase-sdk"&gt;Google Open Source directory&lt;/a&gt;. We're really looking forward to your pull requests! &lt;/p&gt;&lt;h2&gt;What's open?&lt;/h2&gt;&lt;p&gt;We're starting by open sourcing several products in our &lt;a href="https://github.com/firebase/firebase-ios-sdk"&gt;iOS&lt;/a&gt;, &lt;a href="https://github.com/firebase/firebase-js-sdk"&gt;JavaScript&lt;/a&gt;, &lt;a href="https://github.com/firebase/firebase-admin-java"&gt;Java&lt;/a&gt;, &lt;a href="https://github.com/firebase/firebase-admin-node"&gt;Node.js&lt;/a&gt; and &lt;a href="https://github.com/firebase/firebase-admin-python"&gt;Python&lt;/a&gt; SDKs. We'll be looking at open sourcing our Android SDK as well. The SDKs are being licensed under &lt;a href="https://en.wikipedia.org/wiki/Apache_License"&gt;Apache 2.0,&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Apache_License"&gt;the same flexible license as existing&lt;/a&gt; Firebase open source projects like &lt;a href="https://github.com/firebase/FirebaseUI"&gt;FirebaseUI&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Let's take a look at each repo: &lt;/p&gt;&lt;h3&gt;Firebase iOS SDK 4.0&lt;/h3&gt;&lt;p&gt;&lt;a href="https://github.com/firebase/firebase-ios-sdk"&gt;https://github.com/firebase/firebase-ios-sdk&lt;/a&gt;&lt;/p&gt;&lt;p&gt;With the launch of the Firebase iOS 4.0 SDKs we have made several improvements to the developer experience, such as more idiomatic API names for our Swift users. By open sourcing our iOS SDKs we hope to provide an additional avenue for you to give us feedback on such features. For this first release we are open sourcing our Realtime Database, Auth, Cloud Storage and Cloud Messaging (FCM) SDKs, but going forward we intend to release more. &lt;/p&gt;&lt;p&gt;Because we aren't yet able to open source some of the Firebase components, the full product build process isn't available. While you can use this repo to build a FirebaseDev pod, our libraries distributed through &lt;a href="https://cocoapods.org/pods/Firebase"&gt;CocoaPods&lt;/a&gt; will continue to be static frameworks for the time being. We are continually looking for ways to improve the developer experience for developers, however you integrate. &lt;/p&gt;&lt;p&gt;Our &lt;a href="https://github.com/firebase/firebase-ios-sdk"&gt;GitHub README&lt;/a&gt;provides more details on how you build, test and contribute to our iOS SDKs. &lt;/p&gt;&lt;h3&gt;Firebase JavaScript SDK 4.0&lt;/h3&gt;&lt;p&gt;&lt;a href="https://github.com/firebase/firebase-js-sdk"&gt;https://github.com/firebase/firebase-js-sdk&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We are excited to announce that we are open sourcing our Realtime Database, Cloud Storage and Cloud Messaging (FCM) SDKs for JavaScript. We'll have a couple of improvements hot on the heels of this initial release, including open sourcing Firebase Authentication. We are also in the process of releasing the source maps for our components, which we expect would really improve the debuggability of your app. &lt;/p&gt;&lt;p&gt;Our &lt;a href="https://github.com/firebase/firebase-js-sdk"&gt;GitHub repo&lt;/a&gt;includes instructions on how you can build, test and contribute. &lt;/p&gt;&lt;h3&gt;Firebase Admin SDKs&lt;/h3&gt;&lt;p&gt;Node.js: &lt;a href="https://github.com/firebase/firebase-admin-node"&gt;https://github.com/firebase/firebase-admin-node&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Java: &lt;a href="https://github.com/firebase/firebase-admin-java"&gt;https://github.com/firebase/firebase-admin-java&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Python: &lt;a href="https://github.com/firebase/firebase-admin-python"&gt;https://github.com/firebase/firebase-admin-python&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We are happy to announce that all three of our Admin SDKs for accessing Firebase on privileged environments are now fully open source, including our recently-launched &lt;a href="https://firebase.googleblog.com/2017/04/bringing-firebase-admin-to-python.html"&gt;Python SDK&lt;/a&gt;. While we continue to explore supporting more languages, we encourage you to use our source as inspiration to enable Firebase for your environment. (And if you do, we'd love to hear about it!) &lt;/p&gt;&lt;p&gt;We're really excited to see what you do with the updated SDKs - as always reach out to us with feedback or questions in the &lt;a href="https://groups.google.com/forum/#!forum/firebase-talk"&gt;Firebase-Talk&lt;/a&gt;Google Group, on &lt;a href="http://stackoverflow.com/questions/tagged/firebase"&gt;Stack Overflow&lt;/a&gt;, via the Firebase &lt;a href="http://firebase.google.com/support/"&gt;Support team&lt;/a&gt;, or now on &lt;a href="https://opensource.google.com/projects/firebase-sdk"&gt;GitHub&lt;/a&gt; for SDK issues and pull requests! And to read about the other improvements to Firebase that launched at Google I/O, head over to the &lt;a href="http://firebase.googleblog.com/2017/05/whats-new-from-firebase-at-google-io.html"&gt;Firebase blog&lt;/a&gt;. &lt;/p&gt; &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/9KhM801ma_k" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/6571813037552291089" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/6571813037552291089" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/9KhM801ma_k/open-sourcing-firebase-sdks.html" title="Open sourcing the Firebase SDKs" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-CtjHvcnX6t4/WR3ftjeqHHI/AAAAAAAABGo/8v9dXgs2Xog-GZqtiyFSKrXDM5Tm7CbgQCLcB/s72-c/headshot.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/05/open-sourcing-firebase-sdks.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-8520658974465029013</id><published>2017-05-17T14:12:00.000-07:00</published><updated>2017-05-25T12:45:26.701-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud functions for firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Fabric" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Firebase Analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="I/O" /><category scheme="http://www.blogger.com/atom/ns#" term="io17" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="sdks" /><category scheme="http://www.blogger.com/atom/ns#" term="wattpad" /><title type="text">What’s new from Firebase at Google I/O 2017 </title><content type="html">&lt;figure class="profile"&gt;  &lt;div class="profile-picture"&gt;&lt;img alt="Francis Ma" src="https://1.bp.blogspot.com/-4tkGvAG2B14/WRvSV_eTc9I/AAAAAAAABF8/GMOSmNsmTZAyNWCY3GjDO7fbADJMmQfVgCLcB/s1600/fma.jpeg" style="margin: 0px 0px 10px 0%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Francis Ma&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Group Product Manager&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt; &lt;p&gt;It's been an exciting year! Last May, we expanded Firebase &lt;a href="https://firebase.googleblog.com/2016/05/firebase-expands-to-become-unified-app-platform.html"&gt;into our unified app platform&lt;/a&gt;, building on the original backend-as-a-service and adding products to help developers grow their user base, as well as test and monetize their apps. Hearing from developers like Wattpad, who built an app using Firebase in only 3 weeks, makes all the hard work worthwhile. &lt;/p&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/7E0kilyBByI" width="560"&gt;&lt;/iframe&gt; We're thrilled by the initial response from the community, but we believe our journey is just getting started. Let's talk about some of the enhancements coming to Firebase today. &lt;br /&gt;&lt;h2&gt;Integrating with Fabric&lt;/h2&gt;In January, &lt;a href="https://firebase.googleblog.com/2017/01/FabricJoinsGoogle17.html"&gt;we announced&lt;/a&gt; that we were welcoming the &lt;a href="https://get.fabric.io/"&gt;Fabric&lt;/a&gt; team to Firebase. Fabric initially grabbed our attention with their array of products, including the industry-leading crash reporting tool, Crashlytics. As we got to know the team better, we were even more impressed by how closely aligned our missions are: to help developers build better apps and grow successful businesses. Over the last several months, we've been working closely with the Fabric team to &lt;a href="https://fabric.io/blog/fabric-and-firebase-building-momentum-together"&gt;bring the best of our platforms together&lt;/a&gt;. &lt;br /&gt;We plan to make Crashlytics the primary crash reporting product in Firebase. If you don't already use a crash reporting tool, we recommend you take a look at Crashlytics and see what it can do for you. You can get started &lt;a href="https://fabric.io/kits/ios/crashlytics"&gt;by following the Fabric documentation&lt;/a&gt;. &lt;br /&gt;&lt;h2&gt;Phone authentication comes to Firebase&lt;/h2&gt;Phone number authentication has been the biggest request for Firebase Authentication, so we're excited to announce that we've worked with the Fabric Digits team to bring phone auth to our platform. You can now let your users sign in with their phone numbers, in addition to traditional email/password or identity providers like Google or Facebook. This gives you a comprehensive authentication solution no matter who your users are or how they like to log in. &lt;br /&gt;At the same time, the Fabric team will be retiring the Digits name and SDK. If you currently use Digits, over the next couple weeks we'll be rolling out the ability to link your existing Digits account with Firebase and swap in the Firebase SDK for the Digits SDK. Go to the &lt;a href="http://get.digits.com/blog/introducing-firebase-phone-authentication"&gt;Digits blog&lt;/a&gt; to learn more. &lt;br /&gt;&lt;h2&gt;Introducing Firebase Performance Monitoring&lt;/h2&gt;We recognize that poor app performance and stability are the top reasons for users to leave bad ratings on your app and possibly churn altogether. As part of our effort to help you build better apps, we're pleased to announce the beta launch of Performance Monitoring. &lt;br /&gt;Firebase Performance Monitoring is a new free tool that helps you understand when your user experience is being impacted by poorly performing code or challenging network conditions. You can learn more and get started with Performance Monitoring in &lt;a href="https://firebase.google.com/docs/perf-mon/"&gt;the Firebase documentation&lt;/a&gt;. &lt;br /&gt;&lt;h2&gt;More robust analytics&lt;/h2&gt;Analytics has been core to the Firebase platform since we launched last I/O. We know that understanding your users is the number one way to make your app successful, so we're continuing to invest in improving our analytics product. &lt;br /&gt;First off, you may notice that you're starting to see the name "Google Analytics for Firebase" around our documentation. Our analytics solution was built in conjunction with the Google Analytics team, and the reports are available both in the Firebase console and the Google Analytics interface. So, we're renaming Firebase Analytics to Google Analytics for Firebase, to reflect that your app analytics data are shared across both. &lt;br /&gt;For those of you who monetize your app with &lt;a href="https://www.google.com/admob/announcements.html"&gt;AdMob&lt;/a&gt;, we've started &lt;a href="https://support.google.com/firebase/answer/6387949"&gt;sharing data between the two platforms&lt;/a&gt;, helping you understand the true lifetime value (LTV) of your users, from both purchases and AdMob revenue. You'll see these new insights surfaced in the updated Analytics dashboard. &lt;br /&gt;Many of you have also asked for analytics insights into custom events and parameters. Starting today, you can register up to 50 custom event parameters and see their details in your Analytics reports. &lt;a href="https://support.google.com/firebase/answer/7397304"&gt;Learn more about custom parameter reporting&lt;/a&gt;. &lt;br /&gt;&lt;h2&gt;Firebase for all - iOS, games, and open source&lt;/h2&gt;Firebase's mission is to help all developers build better apps. In that spirit, today we're announcing expanded platform and vertical support for Firebase. &lt;br /&gt;First of all, as Swift has become the preferred language for many iOS developers, we've updated our SDK to handle Swift language nuances, making Swift development a native experience on Firebase. &lt;br /&gt;We've also improved Firebase Cloud Messaging by adding support for token-based authentication for APNs, and greatly simplifying the connection and registration logic in the client SDK. &lt;br /&gt;Second, we've heard from our game developer community that one of the most important stats you monitor is frames per second (FPS). So, we've built Game Loop support &amp;amp; FPS monitoring into Test Lab for Android, allowing you to evaluate your game's frame rate before you deploy. Coupled with the addition of Unity plugins and a C++ SDK, which &lt;a href="https://firebase.googleblog.com/2017/02/supercharge-your-games-with-firebase.html"&gt;we announced&lt;/a&gt; at GDC this year, we think that Firebase is a great option for game developers. To see an example of a game built on top of Firebase, check out our &lt;a href="https://google.github.io/mechahamster/"&gt;Mecha Hamster app on Github&lt;/a&gt;. &lt;br /&gt;Finally, we've taken a big first step towards open sourcing our SDKs. We believe in open source software, not only because transparency is an important goal, but also because we know that the greatest innovation happens when we all collaborate. You can view our new repos &lt;a href="https://opensource.google.com/projects/firebase-sdk"&gt;on our open sourceproject page&lt;/a&gt; and learn more about our decision in &lt;a href="http://opensource.googleblog.com/2017/05/open-sourcing-firebase-sdks.html"&gt;this blog post&lt;/a&gt;. &lt;br /&gt;&lt;h2&gt;Dynamic Hosting with Cloud Functions for Firebase&lt;/h2&gt;In March, &lt;a href="https://firebase.googleblog.com/2017/03/introducing-cloud-functions-for-firebase.html"&gt;we launched Cloud Functions for Firebase&lt;/a&gt;, which lets you run custom backend code in response to events triggered by Firebase features and HTTP requests. This lets you do things like send a notification when a user signs up or automatically create thumbnails when an image is uploaded to Cloud Storage. &lt;br /&gt;Today, in an effort to better serve our web developer community, we're expanding Firebase Hosting to integrate with Cloud Functions. This means that, in addition to serving static assets for your web app, you can now serve dynamic content, generated by Cloud Functions, through Firebase Hosting. For those of you building &lt;a href="https://developers.google.com/web/progressive-web-apps/"&gt;progressive web apps&lt;/a&gt;, Firebase Hosting + Cloud Functions allows you to go completely server-less. You can learn more by &lt;a href="https://firebase.google.com/docs/hosting/functions"&gt;visiting our documentation&lt;/a&gt;. &lt;br /&gt;&lt;h2&gt;Firebase Alpha program and what's next&lt;/h2&gt;Our goal is to build the best developer experience: easy-to-use products, great documentation, and intuitive APIs. And the best resource that we have for improving Firebase is you! Your questions and feedback continuously push us to make Firebase better. &lt;br /&gt;In light of that, we're excited to announce a Firebase Alpha program, where you will have the opportunity to test the cutting edge of our products. Things might not be perfect (in fact, we can almost guarantee they won't be), but by participating in the alpha community, you'll help define the future of Firebase. If you want to get involved, please register your interest in the &lt;a href="http://firebase.google.com/alpha"&gt;Firebase Alpha form&lt;/a&gt;. &lt;br /&gt;Thank you for your support, enthusiasm, and, most importantly, feedback. The Firebase community is the reason that we've been able to grow and improve our platform at such an incredible pace over the last year. We're excited to continue working with you to build simple, intuitive products for developing apps and growing mobile businesses. To get started with Firebase today, visit our &lt;a href="http://firebase.google.com/"&gt;newly redesigned website&lt;/a&gt;. We're excited to see what you build! &lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/IRk6n3M4d2E" width="560"&gt;&lt;/iframe&gt;&lt;br&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/VXF3BGQaq_Y" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/8520658974465029013" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/8520658974465029013" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/VXF3BGQaq_Y/whats-new-from-firebase-at-google-io.html" title="What’s new from Firebase at Google I/O 2017 " /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-4tkGvAG2B14/WRvSV_eTc9I/AAAAAAAABF8/GMOSmNsmTZAyNWCY3GjDO7fbADJMmQfVgCLcB/s72-c/fma.jpeg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/05/whats-new-from-firebase-at-google-io.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-952738168840227014</id><published>2017-05-11T12:03:00.001-07:00</published><updated>2017-05-11T12:03:12.773-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Fabric" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="party" /><category scheme="http://www.blogger.com/atom/ns#" term="WWDC" /><title type="text">Announcing the Firebase + Fabric party at WWDC17</title><content type="html">&lt;style&gt;.profile .profile-picture img { border-radius: 100%; position: absolute; top: 0; left: 0px; } .col-main-wrapper { margin-top:20px; } &lt;/style&gt; &lt;figure class="profile"&gt;  &lt;div class="profile-picture"&gt;&lt;img alt="Megan Krilanovich" src="https://2.bp.blogspot.com/-X8XPtcEbRMI/WRSQV7Y_F9I/AAAAAAAABFQ/RoOYQ-fq5n4HPlZIBvk5DbGd7xhoRCkogCLcB/s1600/Megan_4362_X.JPG" /&gt;  &lt;/div&gt;  &lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Megan Krilanovich&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Program Manager&lt;/em&gt;  &lt;/figcaption&gt;&lt;/figure&gt; &lt;a href="https://3.bp.blogspot.com/-YuqhgvFmUEw/WRS0NOs2JsI/AAAAAAAABFg/qa5xN6W09w8YsJY5OAz4gUKfdU0Xpf6dACLcB/s1600/firebase-fabric-wwdc-party-header.jpg" imageanchor="1" &gt;&lt;img border="0" src="https://3.bp.blogspot.com/-YuqhgvFmUEw/WRS0NOs2JsI/AAAAAAAABFg/qa5xN6W09w8YsJY5OAz4gUKfdU0Xpf6dACLcB/s1600/firebase-fabric-wwdc-party-header.jpg" /&gt;&lt;/a&gt; &lt;p&gt;Heading to WWDC this year? Join us at the Firebase + Fabric party on June 5th as we celebrate with the top iOS developers from around the world. &lt;/p&gt;&lt;p&gt;We’re excited to throw our very first iOS developers party at this year’s conference - co-hosting with our teammates at Fabric who’re also deeply passionate about mobile development. If you’re going to be in town, join us for a night to mingle with other developers, meet engineers and PMs from the Firebase and Fabric team, showcase your latest app, or whatever strikes your mood.  &lt;/p&gt;&lt;p&gt;We look forward to hearing about all the cool stuff you’ve been working on.   &lt;ul&gt;    &lt;li&gt;&lt;b&gt;When:&lt;/b&gt; June 5th, 2017&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Time:&lt;/b&gt; 8:00-11:00 p.m.&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Where:&lt;/b&gt; Forager Tasting Room &amp; Eatery&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Price:&lt;/b&gt; Free (!)&lt;/li&gt;  &lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Tickets are limited so &lt;a href="https://www.google.com/url?q=http://g.co/FirebaseParty&amp;sa=D&amp;usg=AFQjCNEwMyT3wrijIgAS44XLZG7oD-Qfdg" &gt;request your invite&lt;/a&gt; today! &lt;/p&gt; &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/e9wXJovjnRg" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/952738168840227014" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/952738168840227014" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/e9wXJovjnRg/announcing-firebase-fabric-party-at.html" title="Announcing the Firebase + Fabric party at WWDC17" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-X8XPtcEbRMI/WRSQV7Y_F9I/AAAAAAAABFQ/RoOYQ-fq5n4HPlZIBvk5DbGd7xhoRCkogCLcB/s72-c/Megan_4362_X.JPG" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/05/announcing-firebase-fabric-party-at.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-9016979249416029930</id><published>2017-05-09T14:00:00.000-07:00</published><updated>2017-05-16T13:04:59.197-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#io17" /><category scheme="http://www.blogger.com/atom/ns#" term="Fabric" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="I/O" /><category scheme="http://www.blogger.com/atom/ns#" term="I/O 2017" /><category scheme="http://www.blogger.com/atom/ns#" term="Pirate Metrics" /><category scheme="http://www.blogger.com/atom/ns#" term="zero to app" /><title type="text">Seven MORE Sessions I Don't Want to Miss at Google I/O </title><content type="html">&lt;figure class="profile"&gt;  &lt;div class="profile-picture"&gt;&lt;img alt="Frank van Puffelen" src="https://3.bp.blogspot.com/-5x5tvtsSz98/VxfJYoUYPWI/AAAAAAAABLg/_wqjW4FuMVEPoK0XA_2Ls7r9H6t51ukawCLcB/s1600/frank_puffelen.jpg" /&gt;  &lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Frank van Puffelen&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Engineer&lt;/em&gt;  &lt;/figcaption&gt;&lt;/figure&gt; &lt;p&gt;Google I/O is rapidly sneaking up on us. I hope those of you attending have your bags packed by now, and those joining on the &lt;a href="https://events.google.com/io/"&gt;live stream&lt;/a&gt; have started marking the sessions you want to see. It's quite a lineup. &lt;/p&gt;Personally, I'm looking forward to all the new great Firebase content that we're going to be sharing. I know Todd shared the &lt;a href="https://firebase.googleblog.com/2017/05/five-firebase-io-sessions-im-excited.html"&gt;five I/O sessions&lt;/a&gt; he was most looking forward to, but here's a list of some of the sessions that you'll find me at: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-17&amp;amp;sid=b6b35971-bd45-47a2-a595-afa5fb2c03fc"&gt;What's new in Firebase&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;I have been calling this our "Firebase keynote" internally. I've been following the rehearsals closely and it's shaping up to be a great overview of everything new that we're announcing for Firebase. It'll also be your essential starting point for all things Firebase at I/O; go to this talk and you'll have a good idea of what other sessions you might want to attend. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-18&amp;amp;sid=310200a5-b0fd-432d-b704-d772e2cec4b3"&gt;The future of Fabric: gaining momentum at Google&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;What is is like for a startup that joins Google? How do you maintain what made your startup unique, but also make optimal use of the resources available at Google? Will Google keep investing in Fabric and Firebase? And what on earth is Bring Your Pineapple To Work Day? Come to this talk and find out from the folks that started Fabric and Firebase, and the Googler who convinced them to join. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-19&amp;amp;sid=f03069db-1dbd-49a5-916c-fa23602ef7fc"&gt;Rewarding for engagement&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Building a great app is one thing. But convincing your users to keep using your app is another. Gus and Damien have great experience in this area, and together with some developers using Firebase in their app, they'll show you one approach that was very successful. Then they'll show you how to implement that very same approach yourself using Firebase. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-18&amp;amp;sid=a780833d-60cf-4249-9125-aa84984b6682"&gt;Using Firebase to accelerate app growth&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;There are many ways to use Firebase to get more users on your app. Firebase's product managers Jumana and Jon are the perfect teachers for this topic. I'll be going to their great session to get a fresh overview of the Firebase features that help with growing your app's user base. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-18&amp;amp;sid=a5d6b9c9-cef4-45d1-b499-49931e49b03c&amp;amp;track=firebase"&gt;Using Pirate Metrics to grow your user base&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Ahoy matey! Who can resist a session about Firebase that's centered around Pirates? I certainly can't. I expect buccaneers, swashbucklers and pirate ships! Or, at the very least, an analytics-focused discussion on how to best acquire and retain users through best practices. It might be less pirate-y, but it's easier to put into a business plan. AARRR….! &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-19&amp;amp;sid=496d01fb-2139-4fd6-84b2-e585d1a20e61&amp;amp;track=firebase"&gt;Single Codebase, Two Apps with Flutter and Firebase&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Sure, maybe you've seen live-coding demos where we've built Android and iOS apps on top of Firebase before. But have you ever seen us do it with one codebase? Using Flutter makes it easy -- and maybe even fun -- to build cross-platform apps, and Emily and Emily will show you how in this session. I'm a sucker for live-coding talks and this is one that won't disappoint. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-18&amp;amp;sid=24f359da-3cb9-4121-96fb-f121f401e870"&gt;Great app performance with Firebase&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Having a smoothly running, well performing app is critical to ensuring your app's success. With Firebase, this is easy to do, not only during development, but also in production. I've seen Nalin and Ali running around the hallways of the Googleplex all excited about the great things that they'll be sharing in this session. So not only will it be an exciting session, but it's done wonders for their metabolism! &lt;br /&gt;&lt;br /&gt;And of course there's one more talk that I won't want to miss: &lt;a href="https://events.google.com/io/schedule/?section=may-18&amp;amp;sid=a553cfd3-5deb-43f7-8e88-1e6a63df2919&amp;amp;track=firebase"&gt;Zero to App&lt;/a&gt;. Because missing your own I/O talk would be un-Googley. :-) &lt;br /&gt;&lt;br /&gt;These are seven (well, okay, eight) Firebase sessions that I will definitely be attending. If you're not at I/O or just missed them, you can find them on the &lt;a href="https://www.youtube.com/firebase"&gt;Firebase YouTube&lt;/a&gt; channel at the end of each day! &lt;br /&gt;&lt;br /&gt;See you at I/O! &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/yAprV1dPLwQ" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/9016979249416029930" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/9016979249416029930" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/yAprV1dPLwQ/seven-more-sessions-i-dont-want-to-miss.html" title="Seven MORE Sessions I Don't Want to Miss at Google I/O " /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-5x5tvtsSz98/VxfJYoUYPWI/AAAAAAAABLg/_wqjW4FuMVEPoK0XA_2Ls7r9H6t51ukawCLcB/s72-c/frank_puffelen.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/05/seven-more-sessions-i-dont-want-to-miss.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-1463882452410266326</id><published>2017-05-03T12:07:00.000-07:00</published><updated>2017-05-16T13:05:07.861-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#io17" /><category scheme="http://www.blogger.com/atom/ns#" term="AdMob" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud functions for firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="I/O" /><category scheme="http://www.blogger.com/atom/ns#" term="I/O 2017" /><category scheme="http://www.blogger.com/atom/ns#" term="io17" /><category scheme="http://www.blogger.com/atom/ns#" term="io2017" /><category scheme="http://www.blogger.com/atom/ns#" term="machine learning" /><category scheme="http://www.blogger.com/atom/ns#" term="Santa Tracker" /><category scheme="http://www.blogger.com/atom/ns#" term="zero to app" /><title type="text">Five Firebase I/O Sessions I'm Excited About</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Todd Kerpleman" src="https://1.bp.blogspot.com/-9CDTW1fXx0U/V5JD5MgfXtI/AAAAAAAAAJA/EenTdZJxTrwAB94Ha7uFq7b5JZDU2OgxACLcB/s1600/todd.jpg" style="margin: 0px 0px 10px 0%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Todd Kerpelman&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Developer Advocate&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt; &lt;br /&gt;Over the last few weeks, I've had many of you approach me with questions like, "Hey Todd! I'm super excited to be going to I/O this year! What sessions should I go to?" And my answer has always been the same: "Who are you, and how did you get into my apartment?" &lt;br /&gt;&lt;br /&gt;But yeah, I can understand that picking sessions at I/O can feel overwhelming. Between the VR awesomeness and the new Android O stuff, Google I/O has a lot to offer. And while the Firebase VR Data Viewer is still a work-in-progress, there's still plenty of great Firebase content for you to check out this year. &lt;br /&gt;&lt;br /&gt;Of course, asking me to pick my favorites among all the sessions is like asking me to pick my favorite child -- I love all of them equally&lt;sup id="fnref1"&gt;&lt;a href="https://firebase.googleblog.com/2017/05/five-firebase-io-sessions-im-excited.html#fn1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;. But with that said, here's a few Firebase sessions that I'm certainly looking forward to next month: &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-19&amp;amp;sid=0a044b95-2404-45c7-aa18-11e0e78dc4b0"&gt;Supercharging Firebase Apps with Machine Learning and Cloud Functions &lt;/a&gt;&lt;/strong&gt;-- This combines two of the most intriguing (for me, anyway) technologies happening in cloud-land. First, you've got Cloud Functions for Firebase, which essentially allows you to run server-side code based on events happening within your app, and then there's Machine Learning, which is still basically, "We're living in the future" kind of wizardry as far as I'm concerned. Combine them together, and you can pull off some really cool features to enhance your mobile app. Or, in this case, a giant crowdsourced game. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-17&amp;amp;sid=4a422c6f-89bb-47bc-a3f2-c4dc37d50672&amp;amp;track=firebase"&gt;Firebase Analytics: Overview and Updates&lt;/a&gt; -- &lt;/strong&gt;Apparently, launching StreamView wasn't enough for the Analytics team. They've got a whole bunch of other new features popping up, including what might be the most commonly-requested feature since they launched last year. (No, it's not changing all the fonts to Papyrus. That's just &lt;em&gt;my&lt;/em&gt; most-requested feature.) What is it? You'll just have to swing by the session to find out. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-18&amp;amp;sid=a553cfd3-5deb-43f7-8e88-1e6a63df2919"&gt;Zero to App: Develop with Firebase&lt;/a&gt; -- &lt;/strong&gt;This is one of our most popular sessions from last year, and it's been brought back for 2017! We're gonna bring up four Firebase engineers for a realtime cross-platform app development deathmatch! But… uhhh... without the "death" part. HR wouldn't allow it. I've been told this year, there will be some Cloud Functions involved and possibly some other new twists and turns to keep things interesting. Will they end up with a real app by the end of the session? Or will Mike be unable to compile his code because he forgot a semicolon? Only time will tell! &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-19&amp;amp;sid=1a8d61e4-d19b-4837-bbb4-0cb4ae2ff5f9"&gt;AdMob and Firebase Analytics: Better Together&lt;/a&gt; -- &lt;/strong&gt;Remember those Reese's commercials from the 80's, when people apparently walked around with open jars of peanut butter all the time? Well, this talk is a little like that, but instead of resulting in a delicious candy, you end up with some solid ad-driven analytics-backed monetization strategies for your app. Which you can then use to go and buy your own peanut-butter cups. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="https://events.google.com/io/schedule/?section=may-18&amp;amp;sid=3b74833f-759f-459b-8e30-4e42951526e4"&gt;Shipping Santa Tracker: Carefully Rolling Out a Feature to a Million Users&lt;/a&gt; -- &lt;/strong&gt;What happens when you've essentially got one day to launch an app to millions of people around the world with a whole slew of features that you've never really tested before in front of a large audience? You would think "mass chaos and hysteria", but in Santa Tracker land, things were as smooth a baby elf's bottom. Come by and listen to Sam and Dan tell you how they were able to pull it off. I know it's an early session, but they promised me there'd be costumes. So that might be worth rolling out of bed for. &lt;br /&gt;&lt;br /&gt;So there ya go! Five Firebase sessions you should definitely keep an eye on. Not able to make it to I/O in person? Don't worry! All of our presentations will be available either in the livestream that day, or in the &lt;a href="https://www.youtube.com/firebase"&gt;Firebase YouTube&lt;/a&gt; channel a few days later. &lt;br /&gt;&lt;!-- Footnotes themselves at the bottom. --&gt;  &lt;br /&gt;&lt;div class="footnotes"&gt;&lt;hr /&gt;&lt;ol&gt;&lt;li id="fn1"&gt;Well, except you, Janice. Are you really going to use emacs over vim? You're breaking your mother's heart.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/lI2pzq4iC5c" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/1463882452410266326" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/1463882452410266326" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/lI2pzq4iC5c/five-firebase-io-sessions-im-excited.html" title="Five Firebase I/O Sessions I'm Excited About" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-9CDTW1fXx0U/V5JD5MgfXtI/AAAAAAAAAJA/EenTdZJxTrwAB94Ha7uFq7b5JZDU2OgxACLcB/s72-c/todd.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/05/five-firebase-io-sessions-im-excited.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-1376973122198831959</id><published>2017-04-27T14:53:00.001-07:00</published><updated>2017-05-16T13:05:38.176-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ads" /><category scheme="http://www.blogger.com/atom/ns#" term="advertisers" /><category scheme="http://www.blogger.com/atom/ns#" term="attribution" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Firebase Analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="IDFA" /><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><title type="text">Understanding Attribution in Firebase Analytics</title><content type="html"> &lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Todd Kerpleman" src="https://1.bp.blogspot.com/-9CDTW1fXx0U/V5JD5MgfXtI/AAAAAAAAAJA/EenTdZJxTrwAB94Ha7uFq7b5JZDU2OgxACLcB/s1600/todd.jpg" style="margin: 0px 0px 10px 0%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Todd Kerpelman&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Developer Advocate&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;  Pop quiz, hot-shot! Let's say you've spent some money on two different ad campaigns to bring users into your app. After a few weeks, you discover: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ad campaign #1 resulted in 500 clicks. &lt;/li&gt;&lt;li&gt;Ad campaign #2 resulted in 300 clicks. &lt;/li&gt;&lt;/ul&gt;So, which ad campaign performed better? Seems like a no-brainer, right? Should you double-down on ad campaign #1? &lt;br /&gt;&lt;br /&gt;Well, hang on. What if you were to then discover... &lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Ad campaign #1 resulted in 500 clicks &lt;ul&gt;&lt;li&gt;But only 80 users installed and opened your app  &lt;/li&gt;&lt;li&gt;...and they spent an average of $1.20 each&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ad campaign #2 resulted in 300 clicks...&lt;/li&gt;&lt;ul&gt;&lt;li&gt;But 230 of those users installed and opened your app&lt;/li&gt;&lt;li&gt;...and they spent an average of $6 each  &lt;/li&gt;&lt;li&gt;...and over 100 of them signed up for your newsletter?&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;Well, suddenly, that second ad campaign seems like a much better deal, doesn't it? &lt;br /&gt;&lt;br /&gt;That's the idea behind &lt;em&gt;attribution&lt;/em&gt;. It's a powerful form of app analytics that not only determines which campaigns are bringing you users, but also which campaigns are bringing you valuable users that you care most about. &lt;br /&gt;&lt;br /&gt;While attribution is a complex topic that can be studied for many months by people with marketing degrees, let's give you a brief overview of how it works and what it can mean for your business. &lt;br /&gt;&lt;br /&gt;Typically, when an app requests any kind of banner ad or video ad, the network that delivers this ad makes a note of the user's ID For Advertisers (on iOS devices), also known as the IDFA, or your Advertising ID (on Android devices). These are unique device IDs that serve as a way for an in-app advertiser to remember information about the individual user, while doing so in a way that respects the user's privacy. They're not tied to any personally identifiable information, and users have the ability to hide or reset these identifiers if they'd like.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-LNdWaSCQzpI/WQJc_46GOuI/AAAAAAAABEU/2SRDOhAq7eQRNCeh_fp9Lt0APCrH6zJNACLcB/s1600/image4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://2.bp.blogspot.com/-LNdWaSCQzpI/WQJc_46GOuI/AAAAAAAABEU/2SRDOhAq7eQRNCeh_fp9Lt0APCrH6zJNACLcB/s640/image4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If a user clicks on that advertisement, the network that was serving the ad makes a note on its servers that the user (as identified by this IDFA / Advertising ID) has clicked on it.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-kns1ZR8IvHc/WQJdNj3QMCI/AAAAAAAABEY/4yKx9XQBYPwzEG3skzqoS6MxAZzVM-SpQCLcB/s1600/image7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://3.bp.blogspot.com/-kns1ZR8IvHc/WQJdNj3QMCI/AAAAAAAABEY/4yKx9XQBYPwzEG3skzqoS6MxAZzVM-SpQCLcB/s640/image7.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Then it sends your user to the appropriate app store so that they can check out your app. Assuming all goes well from here, this user will then install your app from the App Store or Play Store, and open it. Hooray! &lt;br /&gt;&lt;br /&gt;Now, let's say you want to use Firebase Analytics to help track how successful this particular ad campaign is in bringing you valuable users. The way this would work is, on the Firebase Analytics "Attribution" panel, you select what ad networks you're working with -- right now there are about 50 networks that we partner with, and we're adding more every month. &lt;br /&gt;&lt;br /&gt;By filling in some details about your ad campaign, you get back a Campaign URL, which you can then send on to the original advertiser.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-BU3_kOmOg9U/WQJdhdJn4VI/AAAAAAAABEc/6jeoPBK8Qq8HAEJ0aK1s8EKwArK1IyWCQCLcB/s1600/image6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="https://3.bp.blogspot.com/-BU3_kOmOg9U/WQJdhdJn4VI/AAAAAAAABEc/6jeoPBK8Qq8HAEJ0aK1s8EKwArK1IyWCQCLcB/s640/image6.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The information shared about the ad network is generally broken up into three parts -- the source, the medium, and the campaign. Different networks like to record this information in slightly different ways, but you can think of them as generally hierarchical categories. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;The source is typically the ad network itself. (Vungle, AdWords, etc.) &lt;/li&gt;&lt;li&gt;The medium generally records the type of ad that was shown. (In game banner, full-screen interstitial video, etc.) &lt;/li&gt;&lt;li&gt;The campaign usually identifies the specific ad campaign that  was being run. (Elevator fight, Swimsuit model on a horse, etc.)&lt;/li&gt;&lt;/ul&gt;With this new URL, the advertising network can let Firebase know that the user clicked on one of their ads before redirecting them to the App / Play Store.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-EyJRFfia1vs/WQJdqhba3yI/AAAAAAAABEg/1QcbdXqb_HAeIdyb87WIT5hsFe8WAJ6rQCLcB/s1600/image5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://2.bp.blogspot.com/-EyJRFfia1vs/WQJdqhba3yI/AAAAAAAABEg/1QcbdXqb_HAeIdyb87WIT5hsFe8WAJ6rQCLcB/s640/image5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;From that point on, when a user performs important events in the app that you have designated as Conversion Events -- things like opening the app for the first time, making a purchase, or sharing the app with their friends -- Firebase Analytics will also note what ad campaign was responsible for bringing you this user.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-X0bf9svV0w0/WQJdyTFlNxI/AAAAAAAABEk/cMWRXDPuAsUpma-HeiGd7yqacqK37CB3ACLcB/s1600/image8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://2.bp.blogspot.com/-X0bf9svV0w0/WQJdyTFlNxI/AAAAAAAABEk/cMWRXDPuAsUpma-HeiGd7yqacqK37CB3ACLcB/s640/image8.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You'll then be able to filter those events within Firebase Analytics by any of these ad campaign parameters. For instance, you can see what ad network is responsible for giving you the most overall users, by looking at the attribution reports for your &lt;code&gt;first_open&lt;/code&gt; event.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-bxZ9V5uwBos/WQJd6JUD2tI/AAAAAAAABEo/kH3moXLKLecSWn1TzEIq3ctlf5CK6xK9QCLcB/s1600/image2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="https://1.bp.blogspot.com/-bxZ9V5uwBos/WQJd6JUD2tI/AAAAAAAABEo/kH3moXLKLecSWn1TzEIq3ctlf5CK6xK9QCLcB/s640/image2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can also see what particular ad campaign is responsible for giving you the most money in an &lt;code&gt;in_app_purchase&lt;/code&gt; event, or which ad network gives you users who have clicked your "Yes, I'll review your app!" button. Whatever you can track in a Firebase Analytics event, you can designate as a conversion event. &lt;br /&gt;&lt;dl&gt;  &lt;h4 style="text-align: left;"&gt;&lt;strong&gt;Postbacks&lt;/strong&gt;&lt;/h4&gt;&lt;div id="gdcalert7"&gt;In addition to receiving attribution information from these ad networks, Firebase Analytics can report back information to these ad networks, in a concept known to most marketing professionals as "completing the circle of life". Actually, nobody calls it that; I just made it up. (But it sounds good, right?) You can ask Firebase to tell these ad networks that a user has completed an important conversion event within your app, which is done via a call known as a Postback.&lt;/div&gt;&lt;/dl&gt;&lt;br /&gt;For instance, if your app were to report back to an ad network that a particular user (as identified by their IDFA / Advertising ID) has gone ahead and opened your app for the first time, that ad network could take advantage of this information to improve its own offerings in a couple of ways. For starters, it now knows that this user has installed your app, so it can stop showing them ads for an app they've already installed. It might also use this information to determine what kinds of apps this user might enjoy in the future.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-4KbZ6R793hI/WQJeIedwxgI/AAAAAAAABEs/xf2Ome6U9M8MZpPnL1bH3vKK_ZbJPEs4ACLcB/s1600/image9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://1.bp.blogspot.com/-4KbZ6R793hI/WQJeIedwxgI/AAAAAAAABEs/xf2Ome6U9M8MZpPnL1bH3vKK_ZbJPEs4ACLcB/s640/image9.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Setting up a postback in Firebase Analytics is fairly easy. You'll use the Firebase console to determine which conversion events you want to post back to the network, and usually add a little information specific to that advertising network.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-Ci5usvMgwX0/WQJeTYn7bSI/AAAAAAAABEw/I_sOV5WE_NYqCnX-EUtOnEHqqYO8mV6xQCLcB/s1600/image3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="https://2.bp.blogspot.com/-Ci5usvMgwX0/WQJeTYn7bSI/AAAAAAAABEw/I_sOV5WE_NYqCnX-EUtOnEHqqYO8mV6xQCLcB/s640/image3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You'll also have the option of posting all of your conversion events back to this network, or just the ones that came from this original network. Posting back all conversion events means you'll be doing a better job of training all of your ad networks, and Firebase takes some time to anonymize the other ad networks involved before sending it over. So an ad network might find out that a particular user completed a conversion event in your app, but it won't know &lt;em&gt;which&lt;/em&gt; competing ad network was responsible for it. &lt;br /&gt;&lt;h4 style="text-align: left;"&gt;&lt;strong&gt;What about Dynamic Links?&lt;/strong&gt;&lt;/h4&gt;So you might have noticed that when you use Firebase Dynamic Links, there's also a space for you to set up tracking parameters with a source, medium, and campaign name. Gosh, sounds awfully familiar, right?&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-j3qE_-wKwOY/WQJeb_KEHVI/AAAAAAAABE0/vPFg2wQOjT44YaA1UNjl6Fp6trmRrx-gACLcB/s1600/image1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="https://2.bp.blogspot.com/-j3qE_-wKwOY/WQJeb_KEHVI/AAAAAAAABE0/vPFg2wQOjT44YaA1UNjl6Fp6trmRrx-gACLcB/s640/image1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Well, in the same way you can measure the effectiveness of ad campaigns with Firebase Analytics, you can also measure the effectiveness of Firebase Dynamic Links. By adding these tracking parameters to your Dynamic Links, Firebase Analytics can treat them like any other campaign it's measuring attribution reporting for, and you can view conversion events not just by the ad campaigns responsible for bringing in those users, but also by which Dynamic Links might have brought them in. &lt;br /&gt;&lt;br /&gt;It's worth noting, however, that Firebase Dynamic Links works best when used in non-marketing contexts -- actions like user-to-user sharing, directing users to your app from your website, or linking to your app in social media posts. If you want to measure the effectiveness of an advertising campaign, you should stick with the traditional methods that these ad networks have already set up and use the Campaign URLs that Firebase provides for you. &lt;br /&gt;&lt;h4 style="text-align: left;"&gt;&lt;strong&gt;Give it a try!&lt;/strong&gt;&lt;/h4&gt;So that's the general overview of attribution information in Firebase Analytics. If you haven't yet tried it within your app, I encourage you to give it a try. You might learn something surprising about those ad networks you've been spending your money on. &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/yPT5-BewO2w" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/1376973122198831959" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/1376973122198831959" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/yPT5-BewO2w/understanding-attribution-in-firebase.html" title="Understanding Attribution in Firebase Analytics" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-9CDTW1fXx0U/V5JD5MgfXtI/AAAAAAAAAJA/EenTdZJxTrwAB94Ha7uFq7b5JZDU2OgxACLcB/s72-c/todd.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/04/understanding-attribution-in-firebase.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-430666929428339040</id><published>2017-04-12T13:59:00.001-07:00</published><updated>2017-05-16T13:06:12.051-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="android development" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="ios" /><category scheme="http://www.blogger.com/atom/ns#" term="ios development" /><category scheme="http://www.blogger.com/atom/ns#" term="learn firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Udacity" /><title type="text">Brand new course from Udacity and Google </title><content type="html"> &lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Jen Person" src="https://3.bp.blogspot.com/-4hMOJIbqlD4/WO0VtXY6-HI/AAAAAAAABDA/IEpdOxDK4rgLPW9E05sl0hN5sq6550LnwCLcB/s1600/2017-04-11.png" style="margin: 0px 0px 0px -1%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Jen Person&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Course Developer&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt; What separates apps that are good ideas from apps that are really &lt;em&gt;great&lt;/em&gt;? Analytics! Successful app developers rely on analytics to determine how users are really interacting with their app. Analytics are at the core of Firebase, helping you make actionable decisions to build products that people love. &lt;br /&gt;&lt;br /&gt;We partnered with Udacity to offer a free 2-day interactive course that will help you learn how to use Firebase Analytics to grow your userbase on &lt;a href="https://www.udacity.com/course/ud353"&gt;iOS&lt;/a&gt; and &lt;a href="https://www.udacity.com/course/ud354"&gt;Android&lt;/a&gt;. Specifically, you'll see how to set goals and how to log users' interactions with an app. You'll even analyze real data from an app that's live in the Google Play Store and in the App Store! And you'll learn from people who live and breathe Firebase: experts Steve Ganem and Todd Kerpelman from Google, as well as Android and iOS developers from Google and Udacity. &lt;br /&gt;&lt;br /&gt;&lt;div id="gdcalert1"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-V_zKAEtXOXM/WO6S2lbKUSI/AAAAAAAABDg/TlidU5MH_yIX-W95ESj1HJcBWN9qdnFPACLcB/s1600/image01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="https://2.bp.blogspot.com/-V_zKAEtXOXM/WO6S2lbKUSI/AAAAAAAABDg/TlidU5MH_yIX-W95ESj1HJcBWN9qdnFPACLcB/s640/image01.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The new course will include a combination of short videos, quizzes, code snippets, and a robust online community to help you learn. Check out the course on &lt;a href="https://www.udacity.com/course/ud354"&gt;Android&lt;/a&gt; or &lt;a href="https://www.udacity.com/course/ud353"&gt;iOS&lt;/a&gt; for free, and see all of our courses at &lt;a href="https://www.udacity.com/google"&gt;udacity.com/google&lt;/a&gt;. &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/pXvYhhhjwbs" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/430666929428339040" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/430666929428339040" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/pXvYhhhjwbs/brand-new-course-from-udacity-and-google.html" title="Brand new course from Udacity and Google " /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-4hMOJIbqlD4/WO0VtXY6-HI/AAAAAAAABDA/IEpdOxDK4rgLPW9E05sl0hN5sq6550LnwCLcB/s72-c/2017-04-11.png" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/04/brand-new-course-from-udacity-and-google.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-5668965664003361627</id><published>2017-04-07T11:01:00.000-07:00</published><updated>2017-05-16T13:06:38.310-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blaze" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrent connections" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Firebase Realtime Database" /><category scheme="http://www.blogger.com/atom/ns#" term="flame" /><title type="text">Increasing the Realtime Database concurrency limits</title><content type="html">&lt;style type="text/css"&gt; tr { background-color: transparent; border: none } td { background-color: transparent; border: none } &lt;/style&gt;    &lt;table&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td&gt;&lt;br /&gt;&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Tony Meng" height="320" src="https://1.bp.blogspot.com/-eQq5YV6q1uY/WObg4ca-i1I/AAAAAAAABCk/OeJES_LmH-gErlp_SazecPUkbEOCH9ZqgCLcB/s320/Screen%2BShot%2B2017-04-06%2Bat%2B5.43.38%2BPM.png" style="margin: 0px 0px 0px -4%;" width="150" /&gt;  &lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Tony Meng&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Software Engineer&lt;/em&gt;  &lt;/figcaption&gt;&lt;/figure&gt; &lt;/td&gt;   &lt;td&gt;&lt;br /&gt;&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Alex Dufetel" src="https://4.bp.blogspot.com/-8EXeJykiPV4/WObhzhJa97I/AAAAAAAABCo/p_sgFVEVKXE18J-R196onCDFXa7uLMzvQCLcB/s320/Screen%2BShot%2B2017-04-06%2Bat%2B5.47.53%2BPM.png" style="margin: 0 0 0 -2%;" /&gt;  &lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Alex Dufetel&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Product Manager&lt;/em&gt;  &lt;/figcaption&gt;&lt;/figure&gt;   &lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;We have some exciting news for Realtime Database developers on the &lt;a href="https://firebase.google.com/pricing/"&gt;Flame and Blaze plans&lt;/a&gt;: we're increasing your concurrent connections limit from 10,000 to 100,000!  &lt;br /&gt;&lt;br /&gt;Concurrent connections are the number of users simultaneously connected to your database. For context, it's useful to keep in mind that this number is generally one to three full orders of magnitude lower than your daily active users. To reach 100,000 concurrent users, you usually first need to accumulate tens of millions of daily actives. &lt;br /&gt;&lt;br /&gt;Historically, we limited the concurrent connections to 10,000 per database. We requested that you reach out to us to raise this limit, which allowed us to do a quick verification of your app's health. We looked for things like unindexed queries or very heavy reads to make sure your app was ready to scale. &lt;br /&gt;&lt;br /&gt;Recent improvements to our infrastructure have made it possible to increase that threshold to 100,000 concurrent connections (but you should still index your queries and never add listeners to the root path!). If you need to support even more concurrent connections, please contact us. &lt;br /&gt;&lt;br /&gt;We're excited to bring this change to the Firebase Realtime Database. We've been working hard on improving scalability, and we hope this increase will make scaling more seamless for you. As usual, let us know if you have any questions or feedback. We're always excited to hear from you! &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/TfVxt905_1g" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/5668965664003361627" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/5668965664003361627" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/TfVxt905_1g/increasing-realtime-database.html" title="Increasing the Realtime Database concurrency limits" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-eQq5YV6q1uY/WObg4ca-i1I/AAAAAAAABCk/OeJES_LmH-gErlp_SazecPUkbEOCH9ZqgCLcB/s72-c/Screen%2BShot%2B2017-04-06%2Bat%2B5.43.38%2BPM.png" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/04/increasing-realtime-database.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-5174792028842225406</id><published>2017-04-06T09:19:00.000-07:00</published><updated>2017-05-15T17:45:45.549-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase hosting" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title type="text">Easier configuration for Firebase on the web</title><content type="html">&lt;figure class="profile"&gt;  &lt;div class="profile-picture"&gt;&lt;img alt="Michael Bleigh" src="https://1.bp.blogspot.com/-MTGnHEPkrmo/V-LEf1CTtMI/AAAAAAAABwY/H9okWkyDthI74QthwGeuKtEBjdR-c49TwCLcB/s1600/bleigh-md.jpg" style="margin: 0 0 0 0%;" /&gt;  &lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Michael Bleigh&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Engineer, Firebase Hosting&lt;/em&gt;  &lt;/figcaption&gt;&lt;/figure&gt;    Mature applications separate configuration from code. Doing so lets you easily switch between staging and production, deploy an open-source code sample, or spin up a new QA environment (see also "&lt;a href="https://12factor.net/config"&gt;store config in the environment&lt;/a&gt;" from the 12 Factor App pattern).&lt;br /&gt;&lt;br /&gt;Historically, this has been difficult for Firebase projects on the web, because you needed to keep track of the configuration options for &lt;code&gt;firebase.initializeApp()&lt;/code&gt;. You might have had to write code that looked like this: &lt;br /&gt;&lt;pre class="prettyprint"&gt;// DON'T DO THIS ANYMORE!&lt;br /&gt;switch (location.hostname) {&lt;br /&gt;  case 'myapp.com': firebase.initializeApp(prodConfig); break;&lt;br /&gt;  case 'myapp-staging.com': firebase.initializeApp(stagingConfig); break;&lt;br /&gt;  default: firebase.initializeApp(devConfig); break;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Not the best experience, plus it exposes your various staging environments in public-facing code. Today we're excited to announce some new features of Firebase Hosting and the Firebase CLI that makes configuring Firebase on your Web app and working with multiple environments much simpler. &lt;br /&gt;&lt;h3&gt;On-Demand Firebase SDK Auto-configuration&lt;/h3&gt;We've introduced some new reserved URLs to Firebase Hosting that will let you load the Firebase SDK and automatically configure it &lt;strong&gt;for the current environment&lt;/strong&gt; without having to write any custom code. All you have to do is include the right &lt;code&gt;script&lt;/code&gt; tags: &lt;br /&gt;&lt;pre class="prettyprint"&gt;  &lt;br /&gt;&amp;lt;!doctype html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;    &amp;lt;!-- Import and initialize the Firebase SDK --&amp;gt;&lt;br /&gt;    &amp;lt;script src="/__/firebase/3.7.4/firebase-app.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;    &amp;lt;script src="/__/firebase/3.7.4/firebase-auth.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;    &amp;lt;script src="/__/firebase/init.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;    &amp;lt;script&amp;gt;&lt;br /&gt;      // The Firebase SDK is ready to rock!&lt;br /&gt;      firebase.auth().onAuthStateChange(function(user) { /* … */ });&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt; &lt;/pre&gt;This works on sites deployed to &lt;a href="https://firebase.google.com/docs/hosting/"&gt;Firebase Hosting&lt;/a&gt;, and also works locally when using &lt;code&gt;firebase serve&lt;/code&gt;! The new URLs available are: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;/__/firebase/{VERSION}/firebase-{app,auth,database,messaging,storage}.js&lt;/code&gt;- modular SDK files (recommended) &lt;/li&gt;&lt;li&gt;&lt;code&gt;/__/firebase/{VERSION}/firebase.js&lt;/code&gt; - the complete Firebase JS SDK &lt;/li&gt;&lt;li&gt;&lt;code&gt;/__/firebase/init.js&lt;/code&gt; - script that auto-initializes the SDK when included. Must be loaded after any Firebase SDKs. &lt;/li&gt;&lt;li&gt;&lt;code&gt;/__/firebase/init.json&lt;/code&gt; - JSON representation of the configuration for &lt;code&gt;firebase.initializeApp()&lt;/code&gt;. You can use this to fetch config and initialize Firebase SDKs asynchronously.&lt;/li&gt;&lt;/ul&gt;When serving locally, &lt;code&gt;init.js&lt;/code&gt; initializes the currently selected project for your project directory (see "&lt;a href="https://firebase.google.com/docs/cli/#using_project_aliases"&gt;Using Project Aliases&lt;/a&gt;" for more information). When deployed, it initializes for the deployed project. In addition, when deployed, the scripts are served over HTTP/2 and you can enjoy the benefits of loading the SDK from the same origin without having to manage your own dependencies. &lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;Note: &lt;/strong&gt;You will need at least version &lt;code&gt;3.6.0&lt;/code&gt; of the Firebase CLI to use these features, and may need to reauthenticate. If you see a warning message when running &lt;code&gt;firebase deploy&lt;/code&gt;, run &lt;code&gt;firebase login --reauth&lt;/code&gt; to enable &lt;code&gt;init.js&lt;/code&gt;. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Integrating into Existing Toolchains&lt;/h3&gt;What if you're not on Firebase Hosting or already bundle or otherwise build your JavaScript? You may want to have other ways to get the configuration for a given project. We've added the new &lt;code&gt;firebase setup:web&lt;/code&gt; command to version 3.6.0 of the Firebase CLI. This can serve as a handy reference for copy and paste. The command prints out config information, but can also be integrated with your existing Node.js build process by using the Firebase CLI as a module. &lt;br /&gt;To do so, first install &lt;code&gt;firebase-tools&lt;/code&gt; as a dependency: &lt;br /&gt;&lt;pre class="prettyprint"&gt;$ npm install --save firebase-tools@^3.6&lt;/pre&gt;Next, require it and call the command. For example: &lt;br /&gt;&lt;pre class="prettyprint"&gt;const fbcli = require('firebase-tools');&lt;br /&gt;const fs = require('fs');&lt;br /&gt;&lt;br /&gt;// by default, uses the current project and logged in user&lt;br /&gt;fbcli.setup.web().then(config =&amp;gt; {&lt;br /&gt;  fs.writeFileSync(&lt;br /&gt;    'build/initFirebase.js',&lt;br /&gt;    `firebase.initializeApp(${JSON.stringify(config)});`&lt;br /&gt;  );&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// alternatively, you can pass project or token information&lt;br /&gt;fbcli.setup.web({&lt;br /&gt;  project: 'my-custom-project',&lt;br /&gt;  token: process.env.FIREBASE_TOKEN&lt;br /&gt;});&lt;/pre&gt;We think these updates will make it much simpler to build mature, multi-environment web  applications on Firebase, and we're excited to see the creative ways you use them. Let us know what you think! &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/wnxdz1AMhCM" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/5174792028842225406" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/5174792028842225406" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/wnxdz1AMhCM/easier-configuration-for-firebase-on-web.html" title="Easier configuration for Firebase on the web" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-MTGnHEPkrmo/V-LEf1CTtMI/AAAAAAAABwY/H9okWkyDthI74QthwGeuKtEBjdR-c49TwCLcB/s72-c/bleigh-md.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/04/easier-configuration-for-firebase-on-web.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-5671833645931098373</id><published>2017-04-05T09:00:00.000-07:00</published><updated>2017-05-16T13:06:54.719-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Admin SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="API" /><category scheme="http://www.blogger.com/atom/ns#" term="custom token minting" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="ID token verification" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="node" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title type="text">Bringing Firebase Admin To Python</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Diego Giorgini" src="https://4.bp.blogspot.com/-EqP9baCyFdc/WOPlTuM17SI/AAAAAAAABB0/_ClLtzsJhf8crUpuh-Fp1vVOjRVzWUJDwCLcB/s1600/me.jpg" style="margin: 0px 0px 0px -7%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Hiranya Jayathilaka&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Software Engineer&lt;/em&gt;&lt;/figcaption&gt;&lt;figcaption&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/figcaption&gt;&lt;figcaption&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;After &lt;a href="https://firebase.googleblog.com/2016/11/bringing-firebase-to-your-server.html"&gt;announcing&lt;/a&gt; the Firebase Admin SDKs for Node.js and Java at the Firebase Dev Summit in Berlin last year, we received many feature requests to bring the platform to Python developers as well. Now, we're pleased to announce that first release of the Firebase Admin Python SDK, focusing on Firebase Auth token minting and verification.&amp;nbsp; &lt;br /&gt;&lt;h3&gt;&lt;strong&gt;What are the Admin SDKs?&lt;/strong&gt;&lt;/h3&gt;&lt;br /&gt;The Firebase Admin SDKs provide developers with programmatic, second-party auth access to Firebase services from trusted environments. Second-party here refers to the fact that the SDKs are granted elevated permissions that allow them to do more than a normal, untrusted client device can. The Admin SDKs get these elevated permissions since they are authenticated with a service account, a special Google account that can be used by applications to access Google services programmatically. The Admin SDKs are meant to complement the existing Firebase web and mobile clients which provide third-party, end-user access to Firebase services on client devices. &lt;br /&gt;&lt;h3&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;What is available in the Admin Python SDK?&lt;/strong&gt;&lt;/h3&gt;&lt;br /&gt;As with the other Firebase Admin SDKs, the Python SDK can be initialized using a variety of built-in credential types. The following code shows how to authenticate the SDK using your own service account key file: &lt;br /&gt;&lt;pre class="prettyprint"&gt;import firebase_admin&lt;br /&gt;from firebase_admin import credentials&lt;br /&gt;&lt;br /&gt;cred = credentials.Certificate("path/to/service.json")&lt;br /&gt;firebase_admin.initialize_app(cred)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you are running your code on Google infrastructure, such as Google App Engine or Google Compute Engine, the SDK can auto-discover the credential, allowing you to initialize the SDK with no arguments: &lt;br /&gt;&lt;pre class="prettyprint"&gt;firebase_admin.initialize_app()&lt;/pre&gt;&lt;br /&gt;The Python Admin SDK contains Firebase Auth &lt;a href="https://firebase.google.com/docs/auth/admin/create-custom-tokens"&gt;custom token minting&lt;/a&gt; and &lt;a href="https://firebase.google.com/docs/auth/admin/verify-id-tokens"&gt;ID token verification&lt;/a&gt;. The custom token minting gives you complete control over authentication by allowing you to authenticate users or devices using your own authentication system.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;uid = "some-uid"&lt;br /&gt;additional_claims = {&lt;br /&gt;  "premiumAccount": True&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;custom_token = auth.create_custom_token(uid, additional_claims)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ID token verification allows you to securely identify the currently signed-in user on your server. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;decoded_token = auth.verify_id_token(id_token)&lt;br /&gt;uid = decoded_token["uid"]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The best place to start is with our &lt;a href="https://firebase.google.com/docs/admin/setup"&gt;Admin SDKs setup guide&lt;/a&gt;. The guide will walk you through how to download the SDK, generate a service account key file, and use that key file to initialize the Admin SDK.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;h3&gt;&lt;strong&gt;What is coming next?&lt;/strong&gt;&lt;/h3&gt;We plan to continue to build out the Admin Python SDK to include features already available in the other Admin SDKs, such as a user management API and an FCM API to send messages. We also plan to bring these token minting and verification features to even more languages. To see what APIs are available in each of the Admin SDKs, see our &lt;a href="https://firebase.google.com/docs/admin/setup"&gt;new feature matrix&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To all those Python developers out there, happy hacking! &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/nWYWl816Ud0" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/5671833645931098373" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/5671833645931098373" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/nWYWl816Ud0/bringing-firebase-admin-to-python.html" title="Bringing Firebase Admin To Python" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-EqP9baCyFdc/WOPlTuM17SI/AAAAAAAABB0/_ClLtzsJhf8crUpuh-Fp1vVOjRVzWUJDwCLcB/s72-c/me.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/04/bringing-firebase-admin-to-python.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-7590967699268299019</id><published>2017-03-29T14:00:00.000-07:00</published><updated>2017-05-16T13:07:12.716-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Firebase Cloud Messaging" /><title type="text">Using Firebase Cloud Messaging with Android O</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Diego Giorgini" src="https://1.bp.blogspot.com/-U1jhPD1G4g8/WNwAuupgazI/AAAAAAAABAw/_ruA9pLCKKIOywXNP4zSEP2kooXBPtMOACLcB/s320/Screen%2BShot%2B2017-03-29%2Bat%2B11.44.59%2BAM.png" style="margin: 0px 0px 10px 0%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Diego Giorgini&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Software Engineer&lt;/em&gt;&lt;/figcaption&gt;&lt;figcaption&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/figcaption&gt;&lt;figcaption&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;a href="https://firebase.google.com/docs/cloud-messaging/"&gt;Firebase Cloud Messaging&lt;/a&gt; (FCM) is a cross-platform messaging solution that lets you reliably deliver messages to your apps and sites.  It provides two types of messages: &lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Notification Messages &lt;/strong&gt;display a simple notification popup, with optional data payload. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data Messages&lt;/strong&gt; deliver a JSON payload to your application and let your code handle it.&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;Data Messages&lt;/strong&gt; are a great way to build custom notifications, when the layout provided by notification messages is not enough, or to trigger background operations like a database sync or the download of additional content (image attachments, emails, etc.)&lt;br /&gt;&lt;h3&gt;How should &lt;strong&gt;Data Messages&lt;/strong&gt; trigger background operations?&lt;/h3&gt;The best way to trigger a background operation from a data message is by using &lt;a href="https://github.com/firebase/firebase-jobdispatcher-android"&gt;Firebase Job Dispatcher&lt;/a&gt; to take advantage of the Android JobScheduler and Google Play services API. &lt;br /&gt;&lt;br /&gt;By using Firebase Job Dispatcher you allow the operating system to schedule your operation when it's best for the user (like avoiding extra work when the battery is very low, or when the CPU is already heavily used by other foreground applications). Firebase Job Dispatcher also guarantees that your background task will be performed, and not killed by the system when foreground applications require more resources. &lt;br /&gt;&lt;dl&gt;  &lt;h3&gt;Background Process Optimizations in Android O&lt;/h3&gt;&lt;div style="color: black; font-weight: normal;"&gt;To get started, check out the &lt;a href="https://developer.android.com/preview/index.html"&gt;Android O Developer Preview site&lt;/a&gt; where you will find instructions on &lt;a href="https://developer.android.com/preview/migration.html#ptb"&gt;downloading and installing&lt;/a&gt; the required SDKs. For Firebase Development, you'll also need to &lt;a href="https://firebase.google.com/docs/android/setup"&gt;install the Firebase SDKs for Android&lt;/a&gt;. Be sure to use version 10.2.1 or later for Android O development.&lt;/div&gt;&lt;/dl&gt;&lt;br /&gt;Android O introduces&lt;a href="https://developer.android.com/preview/features/background.html"&gt; new background processes optimizations&lt;/a&gt;, which make the use of JobScheduler (or wrapper libraries like &lt;a href="https://github.com/firebase/firebase-jobdispatcher-android"&gt;Firebase Job Dispatcher&lt;/a&gt;) a requirement for long-running  background operations. Due to these optimizations, the FCM (hence GCM as well)  callbacks &lt;code&gt;onMessageReceived()&lt;/code&gt;and &lt;code&gt;onTokenRefresh()&lt;/code&gt; &lt;strong&gt;have a guaranteed life cycle limited to 10 seconds &lt;/strong&gt;(same as a &lt;a href="https://developer.android.com/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context,%20android.content.Intent)"&gt;Broadcast Receiver&lt;/a&gt;)&lt;strong&gt;.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;After the guaranteed period of 10 seconds, Android considers your process eligible for termination, even if your code is still executing inside the callback. &lt;br /&gt;&lt;br /&gt;To avoid your process being terminated before your callback is completed, be sure to perform only quick operations (like updating a local database, or displaying a custom notification) inside the callback, and use JobScheduler to schedule longer background processes (like downloading additional images or syncing the database with a remote source). &lt;br /&gt;&lt;pre class="prettyprint"&gt;@Override&lt;br /&gt;public void onMessageReceived(RemoteMessage remoteMessage) {&lt;br /&gt;  if (/* Check if data needs to be processed by long running job */ true) {&lt;br /&gt;    // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.&lt;br /&gt;    scheduleJob();&lt;br /&gt;  } else {&lt;br /&gt;    // Handle message within 10 seconds&lt;br /&gt;    handleNow();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt; * Schedule a job using FirebaseJobDispatcher.&lt;br /&gt; */&lt;br /&gt;private void scheduleJob() {&lt;br /&gt;  FirebaseJobDispatcher dispatcher =&lt;br /&gt;      new FirebaseJobDispatcher(new GooglePlayDriver(this));&lt;br /&gt;  Job myJob = dispatcher.newJobBuilder()&lt;br /&gt;      .setService(MyJobService.class)&lt;br /&gt;      .setTag("my-job-tag")&lt;br /&gt;      .build();&lt;br /&gt;  dispatcher.mustSchedule(myJob);&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt; * Perform and immediate, but quick, processing of the message.&lt;br /&gt; */&lt;br /&gt;private void handleNow() {&lt;br /&gt;   Log.d(TAG, "Short lived task is done.");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;We hope this helps you understand how to use FCM to schedule long-running background operations. This solution greatly helps Android to preserve battery life and ensures that your application works fine on Android O. In case you have any questions don't hesitate to ask us on our &lt;a href="https://firebase.google.com/support/"&gt;support channels&lt;/a&gt;. &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/6GzR56kS7yU" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/7590967699268299019" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/7590967699268299019" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/6GzR56kS7yU/using-firebase-cloud-messaging-with.html" title="Using Firebase Cloud Messaging with Android O" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-U1jhPD1G4g8/WNwAuupgazI/AAAAAAAABAw/_ruA9pLCKKIOywXNP4zSEP2kooXBPtMOACLcB/s72-c/Screen%2BShot%2B2017-03-29%2Bat%2B11.44.59%2BAM.png" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/using-firebase-cloud-messaging-with.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-9006984255762703616</id><published>2017-03-24T12:10:00.000-07:00</published><updated>2017-05-16T13:07:20.208-07:00</updated><title type="text">How to Schedule (Cron) Jobs with Cloud Functions for Firebase</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Abe Haskins" src="https://1.bp.blogspot.com/-JikpTZbB-Ak/WNVHGfhu8XI/AAAAAAAABAI/WtcCM7WxgfIcr6KkzqWWQAPVuzw_I2A8gCLcB/s200/AbeHaskins.png" style="margin-left: 0px; margin-right: 5px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;     &lt;strong&gt;&lt;div&gt;Abe Haskins&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Developer Programs Engineer&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt; &lt;br /&gt;Cloud Functions are a great solution for running backend code for your Firebase app. You can write a function which is triggered by many different actions like user sign-ups, writes to the Realtime Database, changes to a Cloud Storage bucket, or conversion events in Firebase Analytics. Cloud Functions can also be triggered by some external sources, for example you could tie a Cloud Function to an HTTPS endpoint or a &lt;a href="https://cloud.google.com/pubsub/"&gt;Cloud Pub/Sub&lt;/a&gt; topic.&lt;br /&gt;&lt;br /&gt;Reacting to these events is very powerful, but you may not always want to &lt;em&gt;react &lt;/em&gt;to an event - sometimes you may want to run a function based on a time interval. For example, you could &lt;a href="https://github.com/firebase/functions-samples/tree/master/delete-unused-accounts-cron"&gt;clean up extra data&lt;/a&gt; in your Realtime Database every night, or run analysis on your Analytics data every hour. If you have a task like this, you'll want to use App Engine Cron with Cloud Functions for Firebase to reliably trigger a function at a regular interval. &lt;br /&gt;&lt;h2&gt;How to Schedule Functions &lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="https://developer.android.com/preview/index.html" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" itemprop="image" src="https://1.bp.blogspot.com/-jBmtm41Wqa8/WNVLJho7KhI/AAAAAAAABAU/IHlzp8CdSDAU7qBPMnnuqtSGPr1pMF-MQCLcB/s1600/Firebase_FloatRight_AppEngine.png" style="padding-left: 24px;" /&gt;&lt;/a&gt;&lt;br /&gt;Cloud Functions for Firebase does not have any special support which allow us to utilize App Engine Cron to schedule events. In fact, the solution we'll implement is nearly identical to the solution we recommend for doing &lt;a href="https://cloud.google.com/solutions/reliable-task-scheduling-compute-engine"&gt;reliable task scheduling on Google Compute Engine&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The trick is to create a tiny App Engine shim that provides hooks for App Engine Cron. These hooks will then push to Cloud Pub/Sub topics for each scheduled job. &lt;br /&gt;&lt;br /&gt;We will then configure our Cloud Function to handle incoming messages on that Pub/Sub topic. &lt;br /&gt;Although this solution is the preferred option for scheduling functions, it isn't the &lt;em&gt;only &lt;/em&gt;way you achieve this goal. If you're interested in seeing an alternative method, you should check out the &lt;a href="https://github.com/firebase/functions-samples/tree/master/delete-unused-accounts-cron"&gt;functions-samples&lt;/a&gt;repository which explains how to achieve a similar result using an external scheduling service. &lt;br /&gt;&lt;h2&gt;Deploying the App Engine App&lt;/h2&gt;It just so happens that we've already written the App Engine app you'll need to set up scheduled functions. It's available in the &lt;a href="https://github.com/firebase/functions-cron"&gt;firebase/functions-cron&lt;/a&gt;repo on Github. &lt;br /&gt;&lt;br /&gt;By default this sample triggers hourly, daily, and weekly Cloud Pub/Sub ticks. If you want to customize this schedule for your app then you can modify the &lt;a href="https://github.com/firebase/functions-cron/blob/master/appengine/cron.yaml"&gt;cron.yaml&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;For details on configuring this, please see the &lt;a href="https://cloud.google.com/appengine/docs/standard/python/config/cronref"&gt;cron.yaml Reference&lt;/a&gt; in the App Engine documentation. &lt;br /&gt;&lt;br /&gt;Let's get started! &lt;br /&gt;&lt;h4&gt;1. Prerequisites&lt;/h4&gt;Install (or check that you have previously installed) the following tools. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://git-scm.com/downloads"&gt;git&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.python.org/download/releases/2.7/"&gt;Python 2.7&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://pip.pypa.io/en/latest/installing.html"&gt;Python pip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cloud.google.com/sdk/"&gt;Google Cloud SDK&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;2. Clone this repository&lt;/h4&gt;To clone the GitHub repository to your computer, run the following command: &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;git clone https://github.com/firebase/functions-cron&lt;/pre&gt;Change directories to the functions-cron directory. The exact path depends on where you placed the directory when you cloned the sample files from GitHub. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;cd functions-cron&lt;/pre&gt;&lt;h4&gt;3. Deploy to App Engine&lt;/h4&gt;Configure the gcloud command-line tool to use your Firebase project. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;gcloud config &lt;span style="color: purple;"&gt;set&lt;/span&gt; project &lt;your-firebase-id&gt;&lt;/your-firebase-id&gt;&lt;/pre&gt;Change directory to &lt;code&gt;&lt;span style="color: #38761d;"&gt;appengine/&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;cd appengine/&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Install the Python dependencies &lt;dl&gt;&lt;pre class="prettyprint"&gt;$ pip install -t lib -r requirements.txt&lt;/pre&gt;Create an App Engine App&lt;br /&gt;&lt;dt&gt;&lt;br /&gt;&lt;/dt&gt;&lt;pre class="prettyprint"&gt;gcloud app create&lt;/pre&gt;&lt;div style="color: black; font-weight: normal;"&gt;Deploy the application to App Engine.&lt;/div&gt;&lt;/dl&gt;&lt;pre class="prettyprint"&gt;gcloud app deploy app.yaml \ cron.yaml&lt;/pre&gt;Open &lt;a href="https://console.cloud.google.com/logs/viewer"&gt;Google Cloud Logging&lt;/a&gt; and in the right dropdown select "GAE Application". If you don't see this option, it may mean that App Engine is still in the process of deploying. &lt;br /&gt;&lt;br /&gt;Look for a log entry calling &lt;code&gt;&lt;span style="color: #38761d;"&gt;/_ah/start&lt;/span&gt;&lt;/code&gt;. If this entry isn't an error, then you're done deploying the App Engine app. &lt;br /&gt;&lt;h4&gt;4. Deploy to Google Cloud Functions for Firebase&lt;/h4&gt;Ensure you're back the root of the repository (&lt;code&gt;&lt;span style="color: #38761d;"&gt;cd ..&lt;/span&gt;&lt;/code&gt;  if you're coming from Step 2) &lt;br /&gt;&lt;dl&gt;Deploy the sample&amp;nbsp;&lt;span style="color: #38761d;"&gt;&lt;code&gt;hourly_job&lt;/code&gt;&amp;nbsp;&lt;/span&gt;function to Google Cloud Functions &lt;dt&gt;&lt;br /&gt;&lt;/dt&gt;&lt;pre class="prettyprint"&gt;firebase deploy --only functions --project &lt;firebase_project_id&gt;&lt;/firebase_project_id&gt;&lt;/pre&gt;&lt;div style="font-weight: normal;"&gt;&lt;strong style="color: black;"&gt;Warning:&lt;/strong&gt; This will remove any existing functions you have deployed. If you have existing functions, copy the example from &lt;a href="https://github.com/firebase/functions-cron/blob/master/functions/index.js" style="color: black;"&gt;functions/index.js&lt;/a&gt;into your project's &lt;code&gt;&lt;span style="color: #38761d;"&gt;index.js&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/dl&gt;&lt;h4&gt;5. Verify your Cron Jobs&lt;/h4&gt;We can verify that our function is wired up correctly by opening the &lt;a href="https://console.cloud.google.com/appengine/taskqueues"&gt;Task Queue&lt;/a&gt; tab in App Engine and clicking on Cron Jobs. Each of these jobs has a Run Now button next to it. &lt;br /&gt;&lt;br /&gt;The sample functions we deployed only has one function: &lt;code&gt;&lt;span style="color: #38761d;"&gt;hourly_job&lt;/span&gt;&lt;/code&gt;. To trigger this job, let's hit the Run Now button for the &lt;code&gt;&lt;span style="color: #38761d;"&gt;/publish/hourly-tick&lt;/span&gt;&lt;/code&gt; job. &lt;br /&gt;&lt;br /&gt;Then, go to your terminal and run... &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;firebase functions:log --project &lt;firebase_project_id&gt;&lt;/firebase_project_id&gt;&lt;/pre&gt;You should see a successful &lt;code&gt;&lt;span style="color: #38761d;"&gt;console.log&lt;/span&gt;&lt;/code&gt; from your &lt;code&gt;&lt;span style="color: #38761d;"&gt;hourly_job&lt;/span&gt;&lt;/code&gt;. &lt;br /&gt;&lt;h2&gt;You're Done!&lt;/h2&gt;Your cron jobs will now "tick" along forever. As we mentioned above, you're not limited to the &lt;code&gt;&lt;span style="color: #38761d;"&gt;hourly-tick&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span style="color: #38761d;"&gt;daily-tick&lt;/span&gt;&lt;/code&gt; and &lt;code&gt;&lt;span style="color: #38761d;"&gt;weekly-tick&lt;/span&gt;&lt;/code&gt; that are included in the App Engine app. &lt;br /&gt;&lt;br /&gt;You can add more scheduled functions by modifying the &lt;a href="https://github.com/firebase/functions-cron/blob/master/appengine/cron.yaml"&gt;cron.yaml&lt;/a&gt;file and re-deploying the app. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/Loti2-JCsJY" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/9006984255762703616" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/9006984255762703616" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/Loti2-JCsJY/how-to-schedule-cron-jobs-with-cloud.html" title="How to Schedule (Cron) Jobs with Cloud Functions for Firebase" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-JikpTZbB-Ak/WNVHGfhu8XI/AAAAAAAABAI/WtcCM7WxgfIcr6KkzqWWQAPVuzw_I2A8gCLcB/s72-c/AbeHaskins.png" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/how-to-schedule-cron-jobs-with-cloud.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-2876824516346194811</id><published>2017-03-22T14:00:00.000-07:00</published><updated>2017-05-16T13:07:33.007-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BigQuery" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Todd Kerpelman" /><title type="text">BigQuery Tip: The UNNEST Function</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Todd Kerpleman" src="https://1.bp.blogspot.com/-9CDTW1fXx0U/V5JD5MgfXtI/AAAAAAAAAJA/EenTdZJxTrwAB94Ha7uFq7b5JZDU2OgxACLcB/s1600/todd.jpg" style="margin: 0px 0px 10px 0%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Todd Kerpelman&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Developer Advocate&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;  By now, you probably already know that you can export your &lt;a href="https://www.youtube.com/watch?v=Ki_F6VCOtXU"&gt;Firebase Analytics data to BigQuery&lt;/a&gt;, which lets you run all sorts of sophisticated ad hoc queries against your analytics data.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At first, the data set in BigQuery might seem confusing to work with. If you've worked with any of our public BigQuery data sets in the past (like the &lt;a href="https://medium.com/@hoffa/hacker-news-on-bigquery-now-with-daily-updates-so-what-are-the-top-domains-963d3c68b2e2#.24gpimxj2"&gt;Hacker News post data&lt;/a&gt;, or the recent San Francisco public data that our Developer Advocate &lt;a href="https://tilwbq.com/exploring-san-franciscos-public-data-ccf21cb2bfc3#.tcl6vfh7y"&gt;Reto Meier had fun with&lt;/a&gt;), it probably looked a lot like a big ol' SQL table. Something like this: &lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-R3bK4f3nqx4/WNFdkqZppsI/AAAAAAAAA-M/X8NfU9XsDLsQ6gDswALjcjcI-utOAKYEACLcB/s1600/BigQuery1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="https://4.bp.blogspot.com/-R3bK4f3nqx4/WNFdkqZppsI/AAAAAAAAA-M/X8NfU9XsDLsQ6gDswALjcjcI-utOAKYEACLcB/s400/BigQuery1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/dl&gt;The truth of the matter is that BigQuery can get much more sophisticated than that. The rows of a BigQuery table don't just have to be straightforward key-value pairs. They can look more like rows of JSON objects, containing some simple data (like strings, integers, and floats), but also more complex data like arrays, structs, or even arrays of structs. Something a little more like this:&lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-vIcd25MlEUc/WNFdvxZv-zI/AAAAAAAAA-Q/e2WluxpXmbIn9lW_k_j0J49SOZhDkNkEgCLcB/s1600/BigQuery2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="223" src="https://1.bp.blogspot.com/-vIcd25MlEUc/WNFdvxZv-zI/AAAAAAAAA-Q/e2WluxpXmbIn9lW_k_j0J49SOZhDkNkEgCLcB/s400/BigQuery2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Firebase Analytics takes advantage of this format to bundle all of your users' user properties together in the same row. Rather than have you perform some kind of join against a separate user_properties table, all of your user properties are included in the same BigQuery row as an array of structs. &lt;/dl&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-3_f_ySw7d5M/WNFd5IvO7tI/AAAAAAAAA-U/7jHOawHwoZE230j4ytSDeUrTRvSxV8IAgCLcB/s1600/BigQuery3.png" imageanchor="1"&gt;&lt;img border="0" height="304" src="https://4.bp.blogspot.com/-3_f_ySw7d5M/WNFd5IvO7tI/AAAAAAAAA-U/7jHOawHwoZE230j4ytSDeUrTRvSxV8IAgCLcB/s640/BigQuery3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;A slightly simplified version of the user_properties struct in your BigQuery data&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/dl&gt;&lt;dl&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The same thing holds true for your events. Your event parameters are included inside your events as an array of structs. And it turns out these events themselves are stored inside of an array. One single row of data in BigQuery will often contain 2 or 3 Firebase Analytics events all bundled together. &lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-2z9lJsPJBUA/WNFd--eg1UI/AAAAAAAAA-Y/NIdYLmnJTcYwp8Pxu2l0_q3nrniRgKuFwCLcB/s1600/BigQuery4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="244" src="https://1.bp.blogspot.com/-2z9lJsPJBUA/WNFd--eg1UI/AAAAAAAAA-Y/NIdYLmnJTcYwp8Pxu2l0_q3nrniRgKuFwCLcB/s640/BigQuery4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/dl&gt;This means a single row in your BigQuery table can contain an array of user properties, as well as an array of events, which in turn also have their own arrays of event parameters. I know combining all of that information into a data structure like this seems confusing at first, but in the long run, it actually makes your life easier because there aren't any JOINs with other tables for you to worry about.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Important note: &lt;/strong&gt;For all of these examples, I'm going to be using standard SQL, which is what all the cool kids are doing this days&lt;a href="http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html#1" name="top1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;. If you want to follow along, &lt;a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql"&gt;turn off Legacy SQL&lt;/a&gt; in your BigQuery options. Also, you'll need to &lt;a href="https://bigquery.cloud.google.com/dataset/firebase-analytics-sample-data:android_dataset"&gt;follow this link&lt;/a&gt; to access the sample Firebase Analytics data we'll be using. &lt;br /&gt;&lt;br /&gt;For example, I can see all of my event data at once just by calling &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;SELECT event_dim &lt;br /&gt;FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607` &lt;br /&gt;LIMIT 50&lt;br /&gt;&lt;/pre&gt;&lt;figure class="profile"&gt;&lt;/figure&gt;and I'll get back all of my event data, along with all of the event parameters, in one nice little table &lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-LkdHeqRDF0E/WNFeL4HTC0I/AAAAAAAAA-c/icf8Aq6Ju-cAqiVKEnEYVNM5yBqVsxN-QCLcB/s1600/BigQuery5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="https://4.bp.blogspot.com/-LkdHeqRDF0E/WNFeL4HTC0I/AAAAAAAAA-c/icf8Aq6Ju-cAqiVKEnEYVNM5yBqVsxN-QCLcB/s640/BigQuery5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/dl&gt;And then if we want to get a list of all of my "Round completed" events, I can just write some SQL like this… &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;SELECT event_dim &lt;br /&gt;FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607` &lt;br /&gt;WHERE event_dim.name = "round_completed"&lt;br /&gt;&lt;/pre&gt;...which gives me a nice result of... &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;Error: Cannot access field name on a value with type ARRAY&amp;lt;STRUCT&amp;lt;date STRING, name STRING, params ARRAY&amp;lt;STRUCT&amp;lt;key STRING, value STRUCT&amp;lt;string_value STRING, int_value INT64, float_value FLOAT64, ...&amp;gt;&amp;gt;&amp;gt;, ...&amp;gt;&amp;gt; at [2:17]&lt;/pre&gt;&lt;/dl&gt;&lt;br /&gt;&lt;dl&gt;Oh. Oh dear.&amp;nbsp;&lt;/dl&gt;&lt;dl&gt;&lt;br /&gt;Okay, so this won't win any awards for "Best Error Message of 2017"&lt;a href="http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html#2" name="top2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; , but if you think about it, the reason it's barfing makes sense. You're trying to compare a string value to "an element of a struct that's buried inside of an array". Sure, that element ends up being a string, but they're fairly different objects. &lt;br /&gt;&lt;br /&gt;So to fix this, you can use the &lt;strong&gt;&lt;code&gt;UNNEST&lt;/code&gt;&lt;/strong&gt; function. The &lt;strong&gt;&lt;code&gt;UNNEST&lt;/code&gt;&lt;/strong&gt; function will take an array and break it out into each of its individual elements. Let's start with a simple example.&lt;br /&gt;&lt;br /&gt;Calling:  &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;WITH data AS (&lt;br /&gt;  SELECT "primes under 15" AS description,&lt;br /&gt;  [1,2,3,5,7,11,13] AS primes_array)&lt;br /&gt;SELECT * &lt;br /&gt;FROM data &lt;br /&gt;&lt;/pre&gt;will give you back a single row consisting of a string, and that array of data. &lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-16r9V0amtZA/WNFeUNkGMsI/AAAAAAAAA-g/rRin6XEUJeQUapRpftQ_g-L7FmLbOmsfwCLcB/s1600/BigQuery6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="https://4.bp.blogspot.com/-16r9V0amtZA/WNFeUNkGMsI/AAAAAAAAA-g/rRin6XEUJeQUapRpftQ_g-L7FmLbOmsfwCLcB/s400/BigQuery6.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; &lt;/dl&gt;Instead, try something like this: &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;WITH data AS (&lt;br /&gt;  SELECT "primes under 15" AS description,&lt;br /&gt;  [1,2,3,5,7,11,13] AS primes_array)&lt;br /&gt;SELECT description, prime &lt;br /&gt;FROM data CROSS JOIN UNNEST (primes_array) as prime&lt;br /&gt;&lt;/pre&gt;What you're basically saying is, "Hey, BigQuery, please break up that &lt;strong&gt;&lt;code&gt;primes_array&lt;/code&gt;&lt;/strong&gt; into its individual members. Then join each of these members with a clone of the original row." So you end up with a data structure that looks more like this:  &lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-lVsaB1VnCSw/WNFebWJXH5I/AAAAAAAAA-o/rJOr4JDqT3YigB3I1qHCsvY3slNDbBkyACLcB/s1600/BigQuery7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="https://4.bp.blogspot.com/-lVsaB1VnCSw/WNFebWJXH5I/AAAAAAAAA-o/rJOr4JDqT3YigB3I1qHCsvY3slNDbBkyACLcB/s400/BigQuery7.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/dl&gt;The results are similar as before, but now each prime is in its own row: &lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-Yfq3sIEwABU/WNFeja6Y_EI/AAAAAAAAA-s/84qtGiUp47oQrgbYrYwH2QCJ9V-M4ygWgCLcB/s1600/BigQuery8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="269" src="https://2.bp.blogspot.com/-Yfq3sIEwABU/WNFeja6Y_EI/AAAAAAAAA-s/84qtGiUp47oQrgbYrYwH2QCJ9V-M4ygWgCLcB/s320/BigQuery8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/dl&gt;You'll notice that the original &lt;strong&gt;&lt;code&gt;primes_array&lt;/code&gt;&lt;/strong&gt; is still included in the data structure. In some cases (as you'll see below), this can be useful. In this particular case, I found it was a little confusing, which is why I only asked for the individual fields of &lt;strong&gt;&lt;code&gt;description&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;prime&lt;/code&gt;&lt;/strong&gt; instead of  &lt;strong&gt;&lt;code&gt;SELECT *.&lt;/code&gt;&lt;/strong&gt;&lt;a href="http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html#3" name="top3"&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;It's also common convention to replace that &lt;strong&gt;&lt;code&gt;CROSS JOIN&lt;/code&gt;&lt;/strong&gt; syntax with a comma, so you get a query that looks like this.   &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;WITH data AS (&lt;br /&gt;  SELECT "primes under 15" AS description,&lt;br /&gt;  [1,2,3,5,7,11,13] AS primes_array)&lt;br /&gt;SELECT description, prime &lt;br /&gt;FROM data, UNNEST (primes_array) as prime&lt;/pre&gt;It's the exact same query as the previous one; it's just a little more readable. Plus, I can now stand by my original statement that this data format means you don't have perform any JOINs. :) &lt;br /&gt;&lt;br /&gt;And the nice thing here is that I now have one piece of "prime" data per column that I can interact with. So I can start to do comparisons like this: &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;WITH data AS (&lt;br /&gt;  SELECT "primes under 15" AS description,&lt;br /&gt;  [1,2,3,5,7,11,13] AS primes_array)&lt;br /&gt;SELECT description, prime &lt;br /&gt;FROM data, UNNEST (primes_array) as prime&lt;br /&gt;WHERE prime &amp;gt; 8&lt;br /&gt;&lt;/pre&gt;To get just that list of prime numbers between 8 and 15. &lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-s1M-x8Ihw68/WNFesw0fP_I/AAAAAAAAA-w/wiqALN7KLBUF0SXtbo2rCUwE6h_LJEfDQCLcB/s1600/BigQuery9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="https://1.bp.blogspot.com/-s1M-x8Ihw68/WNFesw0fP_I/AAAAAAAAA-w/wiqALN7KLBUF0SXtbo2rCUwE6h_LJEfDQCLcB/s320/BigQuery9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;So going back to our Firebase Analytics data, I can now use the&amp;nbsp;&lt;strong&gt;&lt;code&gt;UNNEST&lt;/code&gt;&lt;/strong&gt;&amp;nbsp;function to look for events that have a specific name.&amp;nbsp; &lt;/dl&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;SELECT event.name, event.timestamp_micros&lt;br /&gt;FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607`, &lt;br /&gt;  UNNEST(event_dim) as event&lt;br /&gt;WHERE event.name = "round_completed"&lt;br /&gt;&lt;/pre&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-rX4ZApFP3zw/WNFg_7Bf5CI/AAAAAAAAA_Q/1PlSZoCP9HgZW2FOAzD362DqCZHWDLWjwCLcB/s1600/BigQuery10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="https://2.bp.blogspot.com/-rX4ZApFP3zw/WNFg_7Bf5CI/AAAAAAAAA_Q/1PlSZoCP9HgZW2FOAzD362DqCZHWDLWjwCLcB/s400/BigQuery10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/dl&gt;As you'll recall, events have their own &lt;strong&gt;&lt;code&gt;params&lt;/code&gt;&lt;/strong&gt;array, which contains all of the event parameters. If I were to &lt;strong&gt;&lt;code&gt;UNNEST&lt;/code&gt;&lt;/strong&gt; those as well, I'd be able to query for specific events that contain specific event parameter values:  &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;SELECT event, event.name, event.timestamp_micros&lt;br /&gt;FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607`, &lt;br /&gt;  UNNEST(event_dim) as event,&lt;br /&gt;  UNNEST(event.params) as event_param&lt;br /&gt;WHERE event.name = "round_completed"&lt;br /&gt;AND event_param.key = "score"&lt;br /&gt;AND event_param.value.int_value &amp;gt; 10000&lt;br /&gt;&lt;/pre&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-q9pk2wAm9kE/WNGjYlg-a9I/AAAAAAAAA_w/oXZFRH7D3gUmQHIgNiW7_9u_BaTGKmEqQCLcB/s1600/event%2Bparam%2B1000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="https://2.bp.blogspot.com/-q9pk2wAm9kE/WNGjYlg-a9I/AAAAAAAAA_w/oXZFRH7D3gUmQHIgNiW7_9u_BaTGKmEqQCLcB/s640/event%2Bparam%2B1000.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Note that in this case, I am selecting "event" as one of the fields in my query, which gives me the original array of all my event parameters nicely grouped together in my table results.&lt;/dl&gt;&lt;br /&gt;Querying against user properties works in a similar manner. Let's say I'm curious as to what language my users prefer using for my app, something our app is tracking in a "language" user property. First, I'll use the &lt;strong&gt;&lt;code&gt;UNNEST&lt;/code&gt;&lt;/strong&gt; query to get just a list of each user and their preferred language.   &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;SELECT&lt;br /&gt; user_dim.app_info.app_instance_id as unique_id,&lt;br /&gt;  MAX(user_prop.key) as keyname,&lt;br /&gt;  MAX(user_prop.value.value.string_value) as keyvalue&lt;br /&gt;FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607`,&lt;br /&gt;  UNNEST(user_dim.user_properties) AS user_prop&lt;br /&gt;WHERE user_prop.key = "language"&lt;br /&gt;GROUP BY unique_id&lt;br /&gt;&lt;/pre&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-QKlZ5lLYIs8/WNFh6vCefcI/AAAAAAAAA_Y/Q4DFJWQ5ul0gQrTEtEuP--bAO267st3eQCLcB/s1600/BigQuery12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" src="https://1.bp.blogspot.com/-QKlZ5lLYIs8/WNFh6vCefcI/AAAAAAAAA_Y/Q4DFJWQ5ul0gQrTEtEuP--bAO267st3eQCLcB/s640/BigQuery12.png" width="535" /&gt;&lt;/a&gt;&lt;/div&gt;And then I can use that as my inner selection to grab the total number of users&lt;a href="http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html#4" name="top4"&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt;&amp;nbsp;that fits into that group.&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;SELECT keyvalue, count(*) as count&lt;br /&gt;FROM (&lt;br /&gt;  SELECT&lt;br /&gt;   user_dim.app_info.app_instance_id as unique_id,&lt;br /&gt;    MAX(user_prop.key) as keyname,&lt;br /&gt;    MAX(user_prop.value.value.string_value) as keyvalue&lt;br /&gt;  FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607`,&lt;br /&gt;    UNNEST(user_dim.user_properties) AS user_prop&lt;br /&gt;  WHERE user_prop.key = "language"&lt;br /&gt;  GROUP BY unique_id&lt;br /&gt;) &lt;br /&gt;GROUP BY keyvalue&lt;br /&gt;ORDER BY count DESC&lt;br /&gt;&lt;/pre&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-NG-hp6GJWmk/WNFiAQ7S48I/AAAAAAAAA_c/IA_GlJXFJlwTo65m1qv-W9Os09cAKX8gQCLcB/s1600/BigQuery13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="207" src="https://2.bp.blogspot.com/-NG-hp6GJWmk/WNFiAQ7S48I/AAAAAAAAA_c/IA_GlJXFJlwTo65m1qv-W9Os09cAKX8gQCLcB/s400/BigQuery13.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;dt&gt;&lt;/dt&gt;&lt;/dl&gt;I can also &lt;strong&gt;&lt;code&gt;UNNEST&lt;/code&gt;&lt;/strong&gt; both my event parameters and my user properties if I want to create one great big query (no pun intended) where I want to look at events of a specific name where an event parameter matches a particular criteria, while also filtering by users who meet a certain criteria:  &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#standardSQL&lt;br /&gt;SELECT user_dim, event, event.name, event.timestamp_micros&lt;br /&gt;FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607`,&lt;br /&gt;  UNNEST(event_dim) as event,&lt;br /&gt;  UNNEST(event.params) as event_param,&lt;br /&gt;  UNNEST(user_dim.user_properties) as user_prop&lt;br /&gt;WHERE event.name = "round_completed"&lt;br /&gt;  AND event_param.key = "squares_daubed"&lt;br /&gt;  AND event_param.value.int_value &amp;gt; 20&lt;br /&gt;  AND user_prop.key = "elite_powers"&lt;br /&gt;  AND (CAST(user_prop.value.value.string_value as int64)) &amp;gt; 1&lt;br /&gt;&lt;/pre&gt;Once you start playing around with the &lt;strong&gt;&lt;code&gt;UNNEST&lt;/code&gt;&lt;/strong&gt;function, you'll find that it's really powerful and it can make working with Firebase Analytics data a lot more fun. If you want to find out more, you can check out the &lt;a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays"&gt;Working with Arrays&lt;/a&gt; section of BigQuery's standard SQL documentation.  &lt;br /&gt;&lt;br /&gt;And don't forget, you get 1 terabyte of usage data for free every month with BigQuery, so don't be afraid to play around with it. Go crazy, you array expander, you! &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;hr width="80%" /&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="https://www.blogger.com/null" name="1"&gt;&lt;b&gt;1 &lt;/b&gt;&lt;/a&gt; &lt;a href="http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html#top1"&gt;&lt;sup&gt;↩&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt; The BigQuery team has asked me to inform you that this is really because standard SQL is the preferred SQL dialect for querying data stored in BigQuery. But I'm pretty sure they're just saying that so they get invited to all the good parties. &lt;br /&gt;&lt;hr width="80%" /&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="https://www.blogger.com/null" name="2"&gt;&lt;b&gt;2 &lt;/b&gt;&lt;/a&gt;&lt;a href="http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html#top2"&gt;&lt;sup&gt;↩&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt; Yet another year the Messies have slipped from our grasp! &lt;br /&gt;&lt;hr width="80%" /&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="https://www.blogger.com/null" name="3"&gt;&lt;b&gt;3 &lt;/b&gt;&lt;/a&gt;&lt;a href="http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html#top3"&gt;&lt;sup&gt;↩&lt;/sup&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&lt;/span&gt;I could have also done this by saying "SELECT * EXCEPT (primes_array)", which can be pretty convenient sometimes.&lt;br /&gt;&lt;hr width="80%" /&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="https://www.blogger.com/null" name="4"&gt;&lt;b&gt;4 &lt;/b&gt;&lt;/a&gt;&lt;a href="http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html#top4"&gt;&lt;sup&gt;↩&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt; Okay, technically, each "App Instance" -- a user interacting with my app from multiple devices would get counted multiple times here. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/dl&gt;&lt;/dl&gt;&lt;/div&gt;&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/-vX1q9gNdis" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/2876824516346194811" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/2876824516346194811" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/-vX1q9gNdis/bigquery-tip-unnest-function.html" title="BigQuery Tip: The UNNEST Function" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-9CDTW1fXx0U/V5JD5MgfXtI/AAAAAAAAAJA/EenTdZJxTrwAB94Ha7uFq7b5JZDU2OgxACLcB/s72-c/todd.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/bigquery-tip-unnest-function.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-5700256133889630315</id><published>2017-03-18T10:00:00.000-07:00</published><updated>2017-05-16T13:07:44.032-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><title type="text">Take Control of Your Firebase Init on Android</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Doug Stevenson" src="https://1.bp.blogspot.com/-vj3mi8cF41o/WO6Ww2Qw4EI/AAAAAAAABDs/CWWy1QHu6KoG85rrkCbKHpjljmKCg3TtwCLcB/s320/dougstevenson_web.jpg" style="margin-left: 0;" /&gt;  &lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Doug Stevenson&lt;/div&gt;&lt;/strong&gt;      &lt;em&gt;Developer Advocate&lt;/em&gt;  &lt;/figcaption&gt;&lt;/figure&gt; A while back, we discussed &lt;a href="https://firebase.googleblog.com/2016/12/how-does-firebase-initialize-on-android.html"&gt;how Firebase initializes on Android&lt;/a&gt;.  There was a lot of great discussion around that, and it sounded like some of you experimented with the same technique for getting your own Android libraries initialized.  Many of you also noted that there were a few situations when you couldn't use the normal automatic init procedure. &lt;br /&gt;&lt;h2&gt;What if you have a customized build system?&lt;/h2&gt;Normally, Android apps using Firebase are built with Gradle and the &lt;a href="https://developers.google.com/android/guides/google-services-plugin"&gt;Google Services Gradle Plugin&lt;/a&gt;.  This plugin pulls your Firebase project data out of google-services.json, and adds it to your app's resources.  Once the resources are added to your project, there is a component called FirebaseInitProvider that automatically picks up those values and initializes Firebase with them. &lt;br /&gt;However, if you have a different build system, such as &lt;a href="https://bazel.build/"&gt;Bazel&lt;/a&gt;, or you're otherwise unable to use the Gradle plugin, you need to find another way to get those resources into your app.  The solution could be as simple as creating your own resource XML file and adding the correct values to it.  The &lt;a href="https://developers.google.com/android/guides/google-services-plugin"&gt;documentation for the plugin&lt;/a&gt; gives the details of how to get those values out of your google-services.json file and into your resources. &lt;br /&gt;&lt;h2&gt;What if you need to select your app's Firebase project at runtime?&lt;/h2&gt;It's very rare, but sometimes an app must be able to &lt;a href="http://stackoverflow.com/questions/42522034/switching-between-different-firebase-projects-runtime-in-one-single-apk-file/"&gt;select its Firebase project at runtime&lt;/a&gt;.  This means your app can't use the automatic init provided by the FirebaseInitProvider that's merged into your app.  In that case, the solution has two tasks. &lt;br /&gt;&lt;h3&gt;1. Disabling FirebaseInitProvider&lt;/h3&gt;FirebaseInitProvider is normally automatically merged into your app build by the Android build tools when doing a build with Gradle.  If you're doing your own init, however, you'll to make sure it doesn't get merged at all.  The way to do that is to use your own app's manifest to override that behavior.  In your manifest, add an entry for FirebaseInitProvider, and make sure to use a &lt;a href="https://developer.android.com/studio/build/manifest-merge.html#node_markers"&gt;node marker&lt;/a&gt; to set its &lt;code&gt;tools:node&lt;/code&gt; attribute to the value &lt;code&gt;"remove"&lt;/code&gt;.  This tells the Android build tools not to include this component in your app: &lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;provider&lt;br /&gt;    android:name="com.google.firebase.provider.FirebaseInitProvider"&lt;br /&gt;    android:authorities="${applicationId}.firebaseinitprovider"&lt;br /&gt;    tools:node="remove"&lt;br /&gt;    /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you don't have the "tools" namespace added to your manifest root tag, you'll have to add that as well:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;manifest&lt;br /&gt;    xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    xmlns:tools="http://schemas.android.com/tools"&lt;br /&gt;    package="your.package"&lt;br /&gt;    &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;  2. Calling FirebaseApp.initializeApp() to initialize&lt;/h3&gt;Because you removed FirebaseInitProvider, you'll need to perform the same init somewhere in your app (in your own ContentProvider during its onCreate, to ensure Analytics can measure your app correctly).  The method you'll need to call is &lt;a href="https://firebase.google.com/docs/reference/android/com/google/firebase/FirebaseApp.html#initializeApp(android.content.Context,%20com.google.firebase.FirebaseOptions)"&gt;FirebaseApp.initializeApp(Context, FirebaseOptions)&lt;/a&gt;.  If you click through to the javadoc, you'll see a few varieties of that method.  The one you want takes both a Context and &lt;a href="https://firebase.google.com/docs/reference/android/com/google/firebase/FirebaseOptions"&gt;FirebaseOptions&lt;/a&gt;to initialize the default FirebaseApp instance.  You can create a FirebaseOptions object using its &lt;a href="https://firebase.google.com/docs/reference/android/com/google/firebase/FirebaseOptions.Builder"&gt;Builder&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;FirebaseOptions.Builder builder = new FirebaseOptions.Builder()&lt;br /&gt;    .setApplicationId("1:0123456789012:android:0123456789abcdef")&lt;br /&gt;    .setApiKey("your_api_key")&lt;br /&gt;    .setDatabaseUrl("https://your-app.firebaseio.com")&lt;br /&gt;    .setStorageBucket("your-app.appspot.com");&lt;br /&gt;FirebaseApp.initializeApp(this, builder.build());&lt;br /&gt;&lt;/pre&gt;The &lt;a href="https://developers.google.com/android/guides/google-services-plugin"&gt;documentation for the plugin&lt;/a&gt; will help you locate the correct strings for your project in your google-services.json file. &lt;br /&gt;&lt;br /&gt;With these changes in place, you no longer need the Google services plugin and its JSON config file in your project. &lt;br /&gt;&lt;br /&gt;Again, if you're happy with the way your Android app builds, you shouldn't need to implement any of the changes here. Otherwise, if your situation requires it, the information here should be all you need to do to take control of your Firebase init. &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/WeelfBClwck" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/5700256133889630315" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/5700256133889630315" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/WeelfBClwck/take-control-of-your-firebase-init-on.html" title="Take Control of Your Firebase Init on Android" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-vj3mi8cF41o/WO6Ww2Qw4EI/AAAAAAAABDs/CWWy1QHu6KoG85rrkCbKHpjljmKCg3TtwCLcB/s72-c/dougstevenson_web.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/take-control-of-your-firebase-init-on.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-3257578137092641603</id><published>2017-03-14T12:00:00.000-07:00</published><updated>2017-05-16T13:07:55.866-07:00</updated><title type="text">Profiling your Realtime Database Performance</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Tyler Rockwood" src="https://2.bp.blogspot.com/-qkjsWmYnOY4/WMf_ig8RGZI/AAAAAAAAA9k/PmNEGJ6c0rwwWnzKJeNeUEYdwJxNkfagQCLcB/s1600/tylerrockwood.jpeg" style="margin-left: 0px; margin-right: 5px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;     &lt;strong&gt;&lt;div&gt;Tyler Rockwood&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Software Engineer&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;The Firebase Realtime Database has traditionally been a black box that doesn't really give you a lot of insight into its performance. We're changing that. Today, you'll be able to get insights into how your database instance is performing by using the &lt;a href="https://firebase.google.com/docs/database/admin/profile"&gt;profiler built into the Firebase CLI&lt;/a&gt;. You can now easily monitor your database writes and reads at the path level, collecting granular data on bandwidth usage and speed. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To start, make sure you have the latest version of the &lt;a href="https://firebase.google.com/docs/cli/"&gt;Firebase CLI&lt;/a&gt; installed and initialized. Start profiling using the database:profile command. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;firebase database:profile &lt;/pre class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This will start streaming operations from your Realtime Database. When you press enter, the CLI aggregates the collected data into a summary table broken down into three main categories: speed, bandwidth and unindexed queries. Speed and bandwidth reports are further broken down by the operation type (write or read) and the path in your Realtime Database. If you have a location with more than 25 children (for example, if you're using .push in the SDKs), the summary table collapses those paths into a single entry and replaces the push ids with $wildcard. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;strong&gt;Speed*&lt;/strong&gt;&lt;/dt&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;This table displays 4 items: the path, the number of times that location has been hit, the number of milliseconds it took for the server to process the request, and the number of times that the path has been denied by rules.&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-YQeFDL5O7BE/WMgAhK5aVJI/AAAAAAAAA9o/rh_-v_hQ1jwgytK0SzU2A-bvnvgl3mKnACLcB/s1600/Screen%2BShot%2B2017-03-14%2Bat%2B7.32.23%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="392" src="https://2.bp.blogspot.com/-YQeFDL5O7BE/WMgAhK5aVJI/AAAAAAAAA9o/rh_-v_hQ1jwgytK0SzU2A-bvnvgl3mKnACLcB/s640/Screen%2BShot%2B2017-03-14%2Bat%2B7.32.23%2BAM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;strong&gt;Bandwidth**&lt;/strong&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;The table displays 3 items: the path, the total amount of bandwidth for the path, and the average bandwidth per operation.&lt;/div&gt;&lt;/dl&gt;&lt;dl&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-HDt4qJ7bMFs/WMgAqWPVgUI/AAAAAAAAA9s/rvmE-9VO29s55UpvaM1tq65ndLPUs6v3ACLcB/s1600/Screen%2BShot%2B2017-03-14%2Bat%2B7.32.41%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="https://3.bp.blogspot.com/-HDt4qJ7bMFs/WMgAqWPVgUI/AAAAAAAAA9s/rvmE-9VO29s55UpvaM1tq65ndLPUs6v3ACLcB/s640/Screen%2BShot%2B2017-03-14%2Bat%2B7.32.41%2BAM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/dl&gt;&lt;dl&gt;&lt;dt&gt;&lt;strong&gt;Unindexed Queries&lt;/strong&gt;&lt;/dt&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/dl&gt;This shows 3 things: the path, the index rule that should be added to your rules, and the number of times the location has been queried. Warnings for these queries also show up in the SDK logs. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-dodbuNZrH2U/WMgAzNbilHI/AAAAAAAAA9w/zDf_19iNibMP05IK8KeXgB7oTHS76Q51gCLcB/s1600/Screen%2BShot%2B2017-03-14%2Bat%2B7.32.53%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="194" src="https://3.bp.blogspot.com/-dodbuNZrH2U/WMgAzNbilHI/AAAAAAAAA9w/zDf_19iNibMP05IK8KeXgB7oTHS76Q51gCLcB/s640/Screen%2BShot%2B2017-03-14%2Bat%2B7.32.53%2BAM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What if this isn't enough?&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;You can also collect the raw operations from your server by using the --raw flag (you'll probably also want to specify an output file with --output), to get more detailed information like ip addresses and user agent strings for connected applications. See the &lt;a href="https://firebase.google.com/docs/cli/database-profile"&gt;profiler reference page&lt;/a&gt; for a complete list of possible operations you can collect information about and what they show. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Speeds are reported at millisecond resolution and refers to the time it takes for the database to process an operation. However, you may see vastly different latencies depending on network conditions and numerous other factors. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** Bandwidth is an estimate based on the data payload and is not a valid measure of the billable amount. Values here could be over or under your actual billed bandwidth, and the stats sent by the profiler also count towards your bandwidth bill. &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/uhYJUN43Yg8" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/3257578137092641603" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/3257578137092641603" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/uhYJUN43Yg8/profiling-your-realtime-database.html" title="Profiling your Realtime Database Performance" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-qkjsWmYnOY4/WMf_ig8RGZI/AAAAAAAAA9k/PmNEGJ6c0rwwWnzKJeNeUEYdwJxNkfagQCLcB/s72-c/tylerrockwood.jpeg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/profiling-your-realtime-database.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-2843055628038105067</id><published>2017-03-10T09:12:00.001-08:00</published><updated>2017-05-16T13:13:35.999-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><category scheme="http://www.blogger.com/atom/ns#" term="Storage" /><title type="text">Multiplying the Power of Firebase Storage</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Mike McDonald" src="https://1.bp.blogspot.com/-5DI2W9hlP48/VxfJh9GdTCI/AAAAAAAABMw/rN1W5FJKtR0salxVNgNHJ3U4z6pngV9SgCLcB/s1600/mike_mcdonald.jpg" style="margin-left: -40px; margin-right: 5px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;     &lt;strong&gt;&lt;div&gt;Mike McDonald&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Product Manager&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;    Since the initial release of Firebase Storage at Google I/O 2016, we've been happy to see mobile app developers make use of its scalable, secure, and robust file storage to power their apps.  Hundreds of thousands of developers have created buckets, and we serve hundreds of millions of requests for photos, videos, audio, and other rich media every day. &lt;br /&gt;&lt;br /&gt;But we're not done yet: we have a few more features lined up that will make it faster and easier to store and share your app's content. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;strong&gt;Use multiple buckets in your projects&lt;/strong&gt;&lt;/h2&gt;After our launch at I/O '16, Firebase projects were limited to a single bucket, located in the United States. With our announcement at Google Cloud Next '17, any Firebase project on the &lt;a href="https://firebase.google.com/pricing/"&gt;Blaze payment plan&lt;/a&gt; can now create buckets in any of the regions and storage classes supported by Google Cloud Storage. This enables some powerful use cases: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Logically separate different types of data (e.g. user data from developer data). &lt;/li&gt;&lt;li&gt;Store data in a &lt;a href="https://cloud.google.com/storage/docs/bucket-locations"&gt;location&lt;/a&gt;closer to users, either to optimize performance or support regulatory compliance. &lt;/li&gt;&lt;li&gt;Reduce cost by storing infrequently accessed data (e.g. backups) in a different &lt;a href="https://cloud.google.com/storage/docs/storage-classes"&gt;storage class&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Creating new buckets in the Firebase Console is easy: just select the location and storage class and give it an easy-to-remember name! &lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-p_1c3NXWLE4/WMCYJzkHEgI/AAAAAAAAA9M/U7mfEvdOS70EQ0Z034vID7kPQfxRbaoQQCLcB/s1600/GIF1_20170308.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="380" src="https://4.bp.blogspot.com/-p_1c3NXWLE4/WMCYJzkHEgI/AAAAAAAAA9M/U7mfEvdOS70EQ0Z034vID7kPQfxRbaoQQCLcB/s640/GIF1_20170308.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;dt&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;h2&gt;&lt;strong&gt;Link existing buckets to your projects&lt;/strong&gt;&lt;/h2&gt;Because every Firebase project is also a Google Cloud Platform project, you can easily use any existing Cloud Storage buckets directly with Firebase SDKs for Cloud Storage. This means your mobile and web apps can access data in your buckets without having to do an expensive data migration. This is a useful feature for existing apps looking to modernize by integrating Firebase. &lt;br /&gt;&lt;br /&gt;Linking your existing bucket to Firebase is easier than creating a new one: just select the bucket you want to import, &lt;a href="http://firebase.google.com/docs/storage/security/start"&gt;configure your security rules to allow access&lt;/a&gt;, and start using the bucket directly from your app. &lt;br /&gt;&lt;dl&gt;  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-W0gOlo4LtSw/WMCJ5635t0I/AAAAAAAAA88/ccHtc-h0dxke1VwSmF8P2K07oJ8BL82QQCLcB/s1600/SecondGIF.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="380" src="https://1.bp.blogspot.com/-W0gOlo4LtSw/WMCJ5635t0I/AAAAAAAAA88/ccHtc-h0dxke1VwSmF8P2K07oJ8BL82QQCLcB/s640/SecondGIF.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;dt&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/dt&gt;&lt;dt&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/dt&gt;&lt;h2&gt;&lt;strong&gt;Integrate with Google Cloud Functions&lt;/strong&gt;&lt;/h2&gt;&lt;/dl&gt;At Google Cloud Next '17 we also announced &lt;a href="https://firebase.google.com/features/functions"&gt;Cloud Functions for Firebase&lt;/a&gt;, which enables developers to write code that responds to events in Cloud or Firebase features.  Cloud Storage for Firebase integrates well with that, allowing you to trigger code when a file is uploaded, changed, or deleted from a storage bucket.  This powerful mechanism enables developers to build new functionality on top of their project storage, such as automatically &lt;a href="https://github.com/firebase/functions-samples/tree/master/convert-images"&gt;converting images&lt;/a&gt;, &lt;a href="https://github.com/firebase/functions-samples/tree/master/generate-thumbnail"&gt;generating thumbnails&lt;/a&gt;, &lt;a href="https://github.com/firebase/functions-samples/tree/master/moderate-images"&gt;moderating images&lt;/a&gt; with the Google Cloud Vision API, and &lt;a href="https://github.com/firebase/functions-samples/tree/master/exif-images"&gt;extracting metadata&lt;/a&gt;.  Previously, these tasks would have required maintenance of a custom backend, but now, Cloud Functions makes it easy to automate by deploying code with a single command line. &lt;br /&gt;&lt;h2&gt;&lt;strong&gt;Same feature, new name&lt;/strong&gt;&lt;/h2&gt;With these new features and integrations with Cloud Storage,  we're proud to announce Firebase Storage is now &lt;b&gt;Cloud Storage for Firebase&lt;/b&gt;. We want to highlight the fact that Firebase Storage is Google Cloud Storage, and that using Firebase means that you're getting the ease of use of an SDK tailored for mobile and web developers, plus the full scale and performance of Google's infrastructure. &lt;br /&gt;&lt;br /&gt;You can continue to use the existing &lt;a href="https://firebase.google.com/docs/storage/"&gt;Firebase SDKs for Cloud Storage&lt;/a&gt; on iOS, Android, JavaScript, C++, and Unity, knowing that your data is stored on the same infrastructure that powers Snapchat, Spotify, and Google Photos. And if you want to access data from Cloud Functions or your own server, you can always use the &lt;a href="https://cloud.google.com/storage/docs/reference/libraries"&gt;Cloud Storage server SDKs&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;We think you're going to love the expanded Cloud Storage for Firebase. When you're building your next app with us, reach out on &lt;a href="http://twitter.com/firebase"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.facebook.com/Firebase/"&gt;Facebook&lt;/a&gt;, &lt;a href="http://firebase.community/"&gt;Slack&lt;/a&gt;, or our &lt;a href="http://groups.google.com/forum/#!forum/firebase-talk"&gt;Google Group&lt;/a&gt; and let us know how it's going. We can't wait to see what you build! &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/DAr4vfcjhOI" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/2843055628038105067" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/2843055628038105067" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/DAr4vfcjhOI/multiplying-power-firebase-storage.html" title="Multiplying the Power of Firebase Storage" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-5DI2W9hlP48/VxfJh9GdTCI/AAAAAAAABMw/rN1W5FJKtR0salxVNgNHJ3U4z6pngV9SgCLcB/s72-c/mike_mcdonald.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/multiplying-power-firebase-storage.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-8461954010207114142</id><published>2017-03-09T10:26:00.000-08:00</published><updated>2017-05-16T13:14:21.276-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="Firebase Analytics" /><title type="text">Introducing Cloud Functions for Firebase</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Brendan Lim" src="https://3.bp.blogspot.com/-qkZYVT_0tn8/WMBYWoGkSkI/AAAAAAAAA8o/PgHJlpWzZycOQgtlTSWRUr3kks8n_wZagCLcB/s200/brendanlim.png" style="margin-left: 0px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;     &lt;strong&gt;&lt;div&gt;Brendan Lim&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Product Manager&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;    Firebase started with the belief that apps could be built with mostly client code since it was, in many instances, easier and faster. However, there are still some cases where server code is needed, such as executing trusted code, authenticating to a third party API, or running battery intensive operations. In these instances, you had to stand up your own server — &amp;nbsp;until now.&lt;br /&gt;&lt;br /&gt;Today we are excited to announce the beta launch of &lt;a href="https://firebase.google.com/features/functions"&gt;&lt;b&gt;Cloud Functions for Firebase&lt;/b&gt;&lt;/a&gt;. It lets you write small pieces of JavaScript, deploy them to Google's Cloud infrastructure, and execute them in response to events from throughout the Firebase ecosystem. This has been the most requested feature since Firebase launched. The ability to extend and connect Firebase features using Cloud Functions makes Firebase more powerful, allowing you to do even more with your app without having to think about servers. &lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/vr0Gfvp5v1A" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Cloud Functions is a versatile tool for building your mobile app.  Here are a just a few of the many tasks you can perform with the integrations available at launch: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;Firebase Analytics &lt;/b&gt;integration lets you trigger a function when a specific conversion event is fired. You can create functions to automate growth and retention workflows for your mobile apps, all without ever needing to update your client code. &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/tree/master/coupon-on-purchase"&gt;Send a notification with a coupon code&lt;/a&gt; to users who have just completed a purchase &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/tree/master/survey-app-update"&gt;Send a survey request to users&lt;/a&gt; after they upgrade their app&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;Firebase Authentication&lt;/b&gt; integration lets you trigger a function when a new user is created or deleted. &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/blob/master/quickstarts/email-users"&gt;Send an email to welcome new users&lt;/a&gt; immediately after they sign up &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/blob/master/user-data-cleanup"&gt;Clean up user associated data&lt;/a&gt; from your Realtime Database when a user account is deleted&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;Firebase Realtime Database &lt;/b&gt;integration lets you trigger a function when data is created, updated, or deleted at a specific path in the database. &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/tree/master/fcm-notifications"&gt;Send a notification using FCM&lt;/a&gt; when data is written to the database &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/blob/master/text-moderation"&gt;Moderate and remove abusive language&lt;/a&gt; from data written to the database &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;Cloud Storage&lt;/b&gt; integration lets you trigger a function when an object is written, updated, or deleted within a particular storage bucket. &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/blob/master/quickstarts/thumbnails"&gt;Resize and convert images&lt;/a&gt; when a new image has been uploaded to your Cloud Storage bucket &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/blob/master/moderate-images"&gt;Moderate abusive images&lt;/a&gt; uploaded to Cloud Storage using the Cloud Vision API&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;HTTP endpoint &lt;/b&gt;integration gives your Cloud Function a URL that can be used as a &lt;a href="https://github.com/firebase/functions-samples/tree/master/minimal-webhook"&gt;webhook&lt;/a&gt;. These functions are triggered when a request is made to their own unique, secure URLs. &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/tree/master/github-to-slack"&gt;Post new GitHub commits&lt;/a&gt; to a Slack channel &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://github.com/firebase/functions-samples/tree/master/stripe"&gt;Process in-app payments&lt;/a&gt; using Stripe&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: inherit;"&gt;We'll continue to add more integrations in the future.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq" style="text-align: center;"&gt;&lt;i&gt;"We were early testers of Cloud Functions for Firebase and were excited to see how easy it was to extend the Realtime Database to export data and integrate with other services."&lt;/i&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;i&gt;- Erling Mårtensson, Master Architect, Sony&lt;/i&gt;&lt;/blockquote&gt;&lt;dl&gt;&lt;h3&gt;&lt;span style="font-family: inherit;"&gt;Firebase SDK and tooling&lt;/span&gt;&lt;/h3&gt;&lt;/dl&gt;&lt;span style="font-family: inherit;"&gt;Cloud Functions for Firebase provides a first-class experience for Firebase developers, built on top of &lt;a href="https://cloud.google.com/functions"&gt;Google Cloud Functions&lt;/a&gt;. Cloud Functions are single-purpose JavaScript functions that are executed in a secure, managed Node.js environment. The Firebase SDK for Cloud Functions gives you an API that allows you to choose an event source (such as writes to Firebase Realtime Database at a specific data location) and implement a function that triggers on every matching event. Our SDK also works with TypeScript to support code completion and help you catch syntax errors early. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;The SDK works in tandem with the &lt;a href="https://firebase.google.com/docs/cli/"&gt;Firebase CLI&lt;/a&gt; to provide a seamless experience when deploying your functions. This tight integration allows you to deploy all of your functions using only a single command. &lt;/span&gt;&lt;br /&gt;&lt;dl&gt;&lt;h3&gt;&lt;span style="font-family: inherit;"&gt;Pricing&lt;/span&gt;&lt;/h3&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;span style="font-family: inherit;"&gt;Cloud Functions is available on all Firebase &lt;/span&gt;&lt;a href="https://firebase.google.com/pricing/" style="font-family: inherit;"&gt;pricing plans&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;, including our free tier. The free tier allows you to quickly experiment and try out integration with other Firebase products. For our Blaze plan, you only pay for what you use. Blaze customers also receive a monthly allotment of free usage for Cloud Functions.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/dl&gt;&lt;blockquote class="tr_bq" style="text-align: center;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;"Thanks to Cloud Functions for Firebase, I built a company with no permanent employees but myself (so far), with no serious scaling concerns, and no major costs maintaining or upgrading the backend as the app grows. It's something of a miracle."&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;- Paul Budnitz, Founder/CEO, &lt;a href="http://wuu.co/"&gt;Wuu&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;dl&gt;&lt;h3&gt;&lt;span style="font-family: inherit;"&gt;Create and deploy your first Cloud Function today&lt;/span&gt;&lt;/h3&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;span style="font-family: inherit;"&gt;Getting started is easy! Walk through our &lt;/span&gt;&lt;a href="https://codelabs.developers.google.com/codelabs/firebase-cloud-functions/" style="font-family: inherit;"&gt;step-by-step codelab&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;, which takes you through setting up your first Cloud Function. You can refer to our &lt;/span&gt;&lt;a href="http://firebase.google.com/docs/functions" style="font-family: inherit;"&gt;full documentation&lt;/a&gt;&lt;span style="font-family: inherit;"&gt; for all the details.&lt;/span&gt;&lt;/div&gt;&lt;/dl&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;We can't wait to see what you build! &lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/WpQnnuPi7t8" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/8461954010207114142" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/8461954010207114142" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/WpQnnuPi7t8/introducing-cloud-functions-for-firebase.html" title="Introducing Cloud Functions for Firebase" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-qkZYVT_0tn8/WMBYWoGkSkI/AAAAAAAAA8o/PgHJlpWzZycOQgtlTSWRUr3kks8n_wZagCLcB/s72-c/brendanlim.png" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/introducing-cloud-functions-for-firebase.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-259274188533899457</id><published>2017-03-09T10:25:00.000-08:00</published><updated>2017-05-16T13:16:36.404-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AdMob" /><category scheme="http://www.blogger.com/atom/ns#" term="AdWords" /><category scheme="http://www.blogger.com/atom/ns#" term="BigQuery" /><category scheme="http://www.blogger.com/atom/ns#" term="Cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="firebase" /><title type="text">Working Closer with Google Cloud Platform</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="James Tamplin" src="https://4.bp.blogspot.com/-vx1fWNeAVs4/VxfJY04OaPI/AAAAAAAABLo/jk7fHTRjf2YWiHmVt7OlhSkUcVIv9sb_wCLcB/s1600/james_tamplin.jpg" style="margin-left: -40px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;strong&gt;&lt;div&gt;&lt;span style="font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;"&gt;James Tamplin&lt;/span&gt;&lt;/div&gt;&lt;/strong&gt;&lt;span style="font-family: &amp;quot;helvetica neue&amp;quot; , &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;"&gt;      &lt;em&gt;Product Manager&lt;/em&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;Since &lt;a href="https://firebase.googleblog.com/2016/05/firebase-expands-to-become-unified-app-platform.html"&gt;expanding Firebase&lt;/a&gt; to become Google's mobile application development platform at Google I/O last year, our amazing community of developers has created over 1 million Firebase projects.&lt;br /&gt;&lt;br /&gt;We're thrilled so many of you use and trust us. While Firebase is a full suite of products for building and growing apps, we know that some apps need more than we offer out-of-the-box. That's why we're bringing Firebase much closer to &lt;a href="http://cloud.google.com/"&gt;Google Cloud Platform&lt;/a&gt; (GCP) to serve even the most demanding applications, whether you're a new startup or a large enterprise. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;b&gt;&lt;span style="font-size: x-large;"&gt;Product Integrations&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; &lt;div style="color: black; font-weight: normal;"&gt;Firebase already shares the same account and billing system as GCP, so you can attach Firebase services to your GCP project and vice-versa. This makes for powerful combinations, such as exporting raw event data from &lt;a href="https://cloud.google.com/solutions/mobile/mobile-firebase-analytics-big-query"&gt;Firebase Analytics into BigQuery&lt;/a&gt; for ad-hoc analysis. Starting today, we're beginning to share products too.&lt;/div&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;First, Firebase developers have been asking for ways to extend their app's functionality without spinning up a server, and &lt;strong&gt;Cloud Functions for Firebase&lt;/strong&gt;lets you do just that. Cloud Functions is our new event-driven serverless compute offering that enters public beta today. The infrastructure is shared between Cloud and Firebase, allowing you to invoke a function or access resources from throughout the Cloud/Firebase ecosystem. For more information, read the announcement on the &lt;a href="https://firebase.googleblog.com/2017/03/introducing-cloud-functions-for-firebase.html"&gt;Firebase blog&lt;/a&gt; and &lt;a href="https://cloudplatform.googleblog.com/2017/03/Google-Cloud-Platform-your-Next-home-in-the-cloud.html"&gt;Cloud blog&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next, we're bringing Firebase Storage closer to &lt;a href="https://cloud.google.com/storage"&gt;Cloud Storage&lt;/a&gt;. Firebase Storage launched 10 months ago, and lets you easily upload and download files from your device directly to Cloud Storage. Previously we gave you a single bucket for your files. Now we're fully aligning the two products and letting you use any Cloud Storage bucket, from any global region and from any &lt;a href="https://cloud.google.com/storage/docs/storage-classes"&gt;storage class&lt;/a&gt;, all straight from the Firebase SDK. To reflect this alignment we're renaming the product&lt;strong&gt;Cloud Storage for Firebase. &lt;/strong&gt;Read more in our &lt;a href="https://firebase.googleblog.com/2017/03/multiplying-power-firebase-storage.html"&gt;blog post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned for more product integrations in the future as Firebase continues to provide direct client-side access to GCP infrastructure through our iOS, Web, and Android SDKs. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;b&gt;&lt;span style="font-size: x-large;"&gt;Streamlined Terms of Service&lt;/span&gt;&lt;/b&gt;&lt;br /&gt; &lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;We love lawyers almost as much as developers, so we're extending GCP's Terms of Service to cover several Firebase products. This makes Firebase and Cloud simpler to evaluate and use together. Products to be covered include: Authentication, Hosting, Storage, Functions, and Test Lab. Our streamlined Terms of Service will take effect soon.&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/dl&gt;&lt;dl&gt;&lt;b&gt;&lt;span style="font-size: x-large;"&gt;The Big Picture&lt;/span&gt;&lt;/b&gt;&lt;br /&gt; &lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Firebase brings together the best of Google on mobile -- whether that's Google's flagship advertising solutions like AdMob and AdWords, or Google's analytics expertise in the form of Firebase Analytics.&lt;/div&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;Google Cloud Platform lets you to benefit from the institutional knowledge Google has developed from almost two decades of running global-scale computing infrastructure.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;By bringing together the ease-of-use of Firebase with the full-range of GCP infrastructure offerings, we're better able to serve you up and down the stack. If you're a startup using Firebase to quickly get to market, you can now easily scale into a full public cloud. If you're an existing business running on GCP who wants to ship a mobile app, we've got you covered too. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We can't wait to see what you build with Firebase and Google Cloud Platform!  &lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/9p63EtQV4ek" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/259274188533899457" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/259274188533899457" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/9p63EtQV4ek/working-closer-google-cloud-platform.html" title="Working Closer with Google Cloud Platform" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-vx1fWNeAVs4/VxfJY04OaPI/AAAAAAAABLo/jk7fHTRjf2YWiHmVt7OlhSkUcVIv9sb_wCLcB/s72-c/james_tamplin.jpg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/working-closer-google-cloud-platform.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-859747655458915361</id><published>2017-03-01T14:04:00.000-08:00</published><updated>2017-05-16T13:15:53.120-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Firebase Notifications" /><title type="text">Updates to Firebase Notifications: Reach your users with greater focus</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Laurence Moroney" src="https://4.bp.blogspot.com/-yOoCTKrYcvA/V031rmLWzFI/AAAAAAAAABg/MWGeqAhYRdsnp-LARhhS7gTKIXPH2LwHQCLcB/s1600/laurence-moroney.png" style="margin-left: 0px;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;strong&gt;&lt;div&gt;Laurence Moroney&lt;/div&gt;&lt;/strong&gt;&lt;em&gt;Developer Advocate&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt; Firebase Notifications is a free service that enables targeted user notifications for mobile app developers. It is based on Firebase Cloud Messaging (FCM), and provides an option if you need a flexible notification platform that requires minimal effort to get started. It includes a graphical console for sending messages, so no programming is needed when picking your target segment and creating the message they’ll receive.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;We’ve now expanded the way that you can target your notifications. With the first release of Firebase Notifications, we provided the facility for you to target users in a particular app, optionally filtering on Firebase Analytics Audience membership, language, or specific app version. &amp;nbsp;. Today we’re releasing a new set of enhancements to the Firebase Notifications console that will allow you to select a much more granular audience to receive your notification -- and as you know, accurately targeted notifications give a far greater chance of user engagement.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;First of all, the user audience filter has more granular control. Now, if you choose to filter on &amp;nbsp;User Audience, you’ll see a set of tools that let you flexibly target users by their membership in multiple different audiences.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-nlbeq3q8GrE/WLdUn2EjMNI/AAAAAAAAA8M/GlYHdZIdhysy3n182OTtx-SuPuSeGJmUwCLcB/s1600/Screen%2BShot%2B2017-03-01%2Bat%2B3.08.31%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="https://3.bp.blogspot.com/-nlbeq3q8GrE/WLdUn2EjMNI/AAAAAAAAA8M/GlYHdZIdhysy3n182OTtx-SuPuSeGJmUwCLcB/s640/Screen%2BShot%2B2017-03-01%2Bat%2B3.08.31%2BPM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This allows you to target or exclude users who &amp;nbsp;are members of a particular set of audiences. . Using a combination of several targeting criteria, as well as user-defined audiences, you have great control over which users will &amp;nbsp;receive your notification.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Also new is the facility to filter your desired target segment based on user property. Firebase &lt;a href="https://firebase.google.com/docs/analytics/android/properties"&gt;User Properties&lt;/a&gt; are attributes that allow you to define segments of your user base, beyond the typical app level properties. So, for example, if you’re building a fitness app, and you want to track how many people have met their fitness goals, you could define a user property for that, and then send notifications to them accordingly.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Now, you can target a notification by selecting a user property to compare against a desired value. So, if the user property contains a string, you can check if it contains, does not contain, is in, or is not in a range of values, or you can target users with user properties that match a Regex using &lt;a href="https://github.com/google/re2/wiki/Syntax"&gt;RE2 syntax&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-epPI9M_JNRs/WLdU1EmEf7I/AAAAAAAAA8Q/B9m0IcrsojQ1RWLKb_xYGaoa8mhLvURzwCLcB/s1600/Screen%2BShot%2B2017-03-01%2Bat%2B3.09.52%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="326" src="https://2.bp.blogspot.com/-epPI9M_JNRs/WLdU1EmEf7I/AAAAAAAAA8Q/B9m0IcrsojQ1RWLKb_xYGaoa8mhLvURzwCLcB/s640/Screen%2BShot%2B2017-03-01%2Bat%2B3.09.52%2BPM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;And of course if the user property contains a numeric value, there are several operators that you can use to compare it to a value -- such as equals, greater than, less than and more.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;With these tools you’re equipped to more accurately target your notifications, to improve response rates while avoiding notification spam. We’re continuing to improve all of Firebase, including Firebase Notifications, and would love to hear your &lt;a href="https://firebase.google.com/support/"&gt;feedback&lt;/a&gt; on this or any other features.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;To learn more, check out the &lt;a href="https://firebase.google.com/docs/notifications/"&gt;Firebase Notifications documentation site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/XfgdvTeNyh0" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/859747655458915361" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/859747655458915361" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/XfgdvTeNyh0/updates-to-firebase-notifications-reach.html" title="Updates to Firebase Notifications: Reach your users with greater focus" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-yOoCTKrYcvA/V031rmLWzFI/AAAAAAAAABg/MWGeqAhYRdsnp-LARhhS7gTKIXPH2LwHQCLcB/s72-c/laurence-moroney.png" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/updates-to-firebase-notifications-reach.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4191548740220130749.post-3300239787522898056</id><published>2017-03-01T10:00:00.000-08:00</published><updated>2017-05-16T13:16:52.888-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Firebase Analytics" /><title type="text">Realtime Analytics For Everyone</title><content type="html">&lt;figure class="profile"&gt;&lt;div class="profile-picture"&gt;&lt;img alt="Steve Ganem" src="https://1.bp.blogspot.com/-x4OAxCwVnXY/WLcFkRa_eyI/AAAAAAAAA78/jAhPoj-WjtMuoQNoX29Jhfq9MdGGU1B1ACLcB/s1600/sganem.jpeg" style="margin: 0px 0px 0px 0%;" /&gt;&lt;/div&gt;&lt;figcaption&gt;    &lt;div&gt;&lt;strong&gt;Steve Ganem&lt;/strong&gt;&lt;/div&gt;&lt;em&gt;Product Manager&lt;/em&gt;&lt;/figcaption&gt;&lt;/figure&gt;When it comes to analytics, the sooner you can see your data, the quicker you can react to it, and the more valuable it can be. This has been at the front of our mind since launching Firebase Analytics, and we've been working hard to get you closer to that goal. &lt;br /&gt;&lt;br /&gt;&lt;div&gt;Back in November we launched real-time conversions. This meant that your most important events were delivered immediately from end-user devices. Around the same time, we also launched real-time export to BigQuery, so that your client events could be analyzed within BigQuery as soon as they were sent to our servers. &lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;But for those of you not using BigQuery, you'd often have to wait several hours before you could start to see any meaningful results from Firebase Analytics. And when it comes to tasks like debugging analytics within your app, or just getting a quick snapshot of how your community is reacting to your latest changes, those hours can feel &lt;em&gt;realllly&lt;/em&gt; long.&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;To address those needs, we are pleased to announce that StreamView and DebugView from Firebase Analytics are being rolled out to the general public.&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;StreamView visualizes events as they flow into Firebase Analytics, &amp;nbsp;and gives you a general sense of how your users are interacting with your app. With StreamView you can find out if a brand new feature is as well-received as you were hoping, watch the roll-out of the latest version of your app, or gauge the response to your latest re-engagement efforts - all in real-time as events are received by Firebase Analytics.&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;StreamView can give you a sense of where in the world people are using your app, right down to the city level…&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-dDuU3qPrbhg/WN00mm0J4gI/AAAAAAAABBA/iNA0QdvzdqYXcAEyneZ2qq6F7C_ZnZNzgCLcB/s1600/image03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="368" src="https://2.bp.blogspot.com/-dDuU3qPrbhg/WN00mm0J4gI/AAAAAAAABBA/iNA0QdvzdqYXcAEyneZ2qq6F7C_ZnZNzgCLcB/s640/image03.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;...or what user properties are most common among your users….&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-yaWeZJxkFO8/WN00vZQvbsI/AAAAAAAABBE/cosX-MjXkvYYLl1JBnej_ToYjKJoLdckQCLcB/s1600/image01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="392" src="https://4.bp.blogspot.com/-yaWeZJxkFO8/WN00vZQvbsI/AAAAAAAABBE/cosX-MjXkvYYLl1JBnej_ToYjKJoLdckQCLcB/s640/image01.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;You can also get an overview of what kind of events are being triggered in your app, and for any of those events, you can see a breakdown of all the custom event parameters you've been recording...&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-dsPzkMTN_Go/WN0015Kg8CI/AAAAAAAABBI/jNy15rF_oxwStLhlGiZFAMYb1hTIXyeDwCLcB/s1600/image02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="https://1.bp.blogspot.com/-dsPzkMTN_Go/WN0015Kg8CI/AAAAAAAABBI/jNy15rF_oxwStLhlGiZFAMYb1hTIXyeDwCLcB/s640/image02.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;...and you can use all of these values as report filters to see where in the world certain events are occurring or certain products are popular, and you can see what user properties or events are common among users in certain countries or cities.&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;One unique feature available in StreamView is the User Snapshot. This will give you a live stream of the events from a random user. You can use the view to gain insight into the individual user journeys within your app.&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-yPwmD71ckPE/WN00-elMa7I/AAAAAAAABBM/i08k9GO5AS00EPaHlK3NdLVFO3xZ0ma4ACLcB/s1600/image04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="368" src="https://1.bp.blogspot.com/-yPwmD71ckPE/WN00-elMa7I/AAAAAAAABBM/i08k9GO5AS00EPaHlK3NdLVFO3xZ0ma4ACLcB/s640/image04.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;Within the User Snapshot view you can see the set user properties, the user's device and location, and drill into the parameters of the events they're sending. You can filter the users included by their location and app version.&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-N_An-wOd0GE/WN01DKAQduI/AAAAAAAABBQ/w3IBn4xkAhYXF0PdzoBvDS0Lwcgw9blTACLcB/s1600/image05.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="358" src="https://1.bp.blogspot.com/-N_An-wOd0GE/WN01DKAQduI/AAAAAAAABBQ/w3IBn4xkAhYXF0PdzoBvDS0Lwcgw9blTACLcB/s640/image05.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;While you may still need to use BigQuery to get full and complete reports, or cross-reference certain sets data against others, there's a surprising amount you can learn about your app just by following the events as they happen in StreamView. The Santa Tracker team was an early customer of StreamView and they've assured me that it's (and this is a direct quote), "Pretty bad-ass." &lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;You can can check out StreamView right away in our &lt;a href="https://support.google.com/firebase/answer/7157552?hl=en"&gt;Demo Project&lt;/a&gt;! &lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;While StreamView is a great real-time picture of your app once it's gone out to the general public, event delivery from device is still batched. This is great for users and battery optimization, but difficult when you're developing your app and need to check right away if your analytics setup is correct!&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;With DebugView, you can immediately see which events are being reported to Firebase Analytics. This will be activated for any device for which you've turned on Analytics Debugging, and is great for making sure you're logging the right events with the right parameters while you're building your app. &lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-atg5szY3EHI/WN01JbW4-HI/AAAAAAAABBU/ZIomdErFuFg_yTH91Hs2C2q9WfFEU5MCwCLcB/s1600/image06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="386" src="https://3.bp.blogspot.com/-atg5szY3EHI/WN01JbW4-HI/AAAAAAAABBU/ZIomdErFuFg_yTH91Hs2C2q9WfFEU5MCwCLcB/s640/image06.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;DebugView shows you events, parameters and user properties for any individual development device. It can also highlight any events that contain invalid parameters, so that you can get those fixed before you publish your app.&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-xEXNgmahtQ0/WN01NxqCTgI/AAAAAAAABBY/JTHfv0AYvDgOyGKEKaVfoYuvbBke_VolgCLcB/s1600/image00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="254" src="https://2.bp.blogspot.com/-xEXNgmahtQ0/WN01NxqCTgI/AAAAAAAABBY/JTHfv0AYvDgOyGKEKaVfoYuvbBke_VolgCLcB/s640/image00.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;b style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;To get started yourself, take a look at our &lt;a href="https://firebase.google.com/docs/analytics/debugview"&gt;documentation on DebugView&lt;/a&gt;, or just look for these features in your own &lt;a href="https://console.firebase.google.com/project/_/analytics"&gt;project console&lt;/a&gt; in the coming days and try them out!&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FirebaseBlog/~4/p4WqWfnKUik" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/3300239787522898056" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4191548740220130749/posts/default/3300239787522898056" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FirebaseBlog/~3/p4WqWfnKUik/realtime-analytics-for-everyone.html" title="Realtime Analytics For Everyone" /><author><name>Firebase</name><uri>http://www.blogger.com/profile/14824009575640850018</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-x4OAxCwVnXY/WLcFkRa_eyI/AAAAAAAAA78/jAhPoj-WjtMuoQNoX29Jhfq9MdGGU1B1ACLcB/s72-c/sganem.jpeg" height="72" width="72" /><feedburner:origLink>http://firebase.googleblog.com/2017/03/realtime-analytics-for-everyone.html</feedburner:origLink></entry></feed>
