



<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
        <meta name="author" content="Salesforce" />
        <meta name="theme-color" content="#ffffff" />

        
            <title>Inside a React Native Mobile App with Tableau Embedded | Salesforce Developers Blog</title>
            
                <meta property="og:title" content="Inside a React Native Mobile App with Tableau Embedded"/>
            
                <meta property="og:type" content="article"/>
            
                <meta property="og:url" content="https://developer.salesforce.com/blogs/2022/05/inside-a-react-native-mobile-app-with-tableau-embedded"/>
            
                <meta property="og:image" content="https://d259t2jj6zp7qm.cloudfront.net/images/20220503125229/Inside-a-React-Native-Mobile-App-with-Tableau-Embedded.png"/>
            
                <meta property="og:description" content="As discussed in a previous blog post, developers are increasingly seeking native options to extend and customize their line-of-business applications. At the same time, data-driven approaches are key to effective decision-making and driving businesses forward."/>
            
                <meta property="twitter:card" content="summary_large_image"/>
            
                <meta property="twitter:description" content="As discussed in a previous blog post, developers are increasingly seeking native options to extend and customize their line-of-business applications. At the same time, data-driven approaches are key to effective decision-making and driving businesses forward."/>
            
                <meta property="twitter:title" content="Inside a React Native Mobile App with Tableau Embedded"/>
            
                <meta property="twitter:image" content="https://d259t2jj6zp7qm.cloudfront.net/images/20220503125229/Inside-a-React-Native-Mobile-App-with-Tableau-Embedded.png"/>
            
                <meta property="article:section" content="Blog"/>
            
                <meta property="article:published_time" content="2022-05-03T19:00:08"/>
            
            
                <meta name="title" content="Inside a React Native Mobile App with Tableau Embedded | Salesforce Developers Blog"/>
            
                <meta name="description" content="As discussed in a previous blog post, developers are increasingly seeking native options to extend and customize their line-of-business applications. At the same time, data-driven approaches are key to effective decision-making and driving businesses forward."/>
            
                <meta name="google-site-verification" content="9nBLHedRs97kceoTtOMsUGrVIhNfsJHbExzaKVARgAM"/>
            
        

        <link rel="stylesheet" type="text/css" href="https://developer.salesforce.com/resources2/stylesheets/dsc-default-font.css?sv=18"/>
        <link rel="stylesheet" href="/1/unknown/immutable/s/54446dd/app/theme/dist/assets/css/main.css" />

        

        
            <link rel="stylesheet" type="text/css" href="https://developer.salesforce.com/resource/one_trust/css/onetrust.min.css" />
            <!-- Load OneTrust script only for DSC Prod app -->
            <!-- OneTrust Cookies Consent Notice start -->
            <!--This script is manually downloaded from OneTrust and uploaded to the DSC S3 bucket-->
            <!--Changes made and published through the online admin system will then require you to download and install a new copy of this package each time.-->
            <!--Read more here: https://developer.salesforce.com/resources2/onetrust/Readme.txt-->
            <script src="https://developer.salesforce.com/resource/one_trust/js/dscBase.min.js" type="text/javascript" charset="UTF-8"></script>

            
                <script src="https://developer.salesforce.com/resource/one_trust/oneTrust_production/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="b439fd74-1d4a-48a0-b3ee-6a86cdf4a4b8"></script>
            
        

        <!-- OptanonWrapper() runs on page load and every time user updates cookie preferences -->
        <script type="text/javascript">
        function OptanonWrapper() {
            // Push a oneTrust group update event to dataLayer
            window.dataLayer = window.dataLayer || [];
            window.dataLayer.push({
            event: 'OneTrustGroupsUpdated'
            });
        }
        </script>
        <!-- OneTrust Cookies Consent Notice end -->

        
        <!-- Google Tag Manager -->
        <script>
            (function (w, d, s, l, i) {
                w[l] = w[l] || [];
                w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" });
                var f = d.getElementsByTagName(s)[0],
                    j = d.createElement(s),
                    dl = l != "dataLayer" ? "&l=" + l : "";
                j.async = true;
                j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
                f.parentNode.insertBefore(j, f);
            })(window, document, "script", "dataLayer", "GTM-MWZCN8");
        </script>
        <!-- End Google Tag Manager -->
        

        
        
        <link rel="icon" href="/1/unknown/immutable/s/fdb507e/app/theme/dist/assets/images/favicon.ico" />
    </head>

    <body>
        
        <!-- Google Tag Manager (noscript) -->
        <noscript>
            <iframe
                src="https://www.googletagmanager.com/ns.html?id=GTM-MWZCN8"
                height="0"
                width="0"
                style="display: none; visibility: hidden"
            ></iframe>
        </noscript>
        <!-- End Google Tag Manager (noscript) -->
        

        <div class="slds-grid slds-grid_vertical">

            
                
                    




    
    





    


<dx-header
    coveo-organization-id="org62salesforce"
    coveo-public-access-token="xx3923a585-7093-42ee-b6c9-d72d841d64d0"
    coveo-search-pipeline="salesforcedevdoc"
    coveo-search-hub="salesforcedevdoc"
    nav-items='[{&quot;id&quot;:&quot;home&quot;,&quot;label&quot;:&quot;Home&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/&quot;}},{&quot;id&quot;:&quot;docs&quot;,&quot;label&quot;:&quot;Documentation&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/docs&quot;}},{&quot;id&quot;:&quot;apis&quot;,&quot;label&quot;:&quot;APIs&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/docs/apis&quot;}},{&quot;id&quot;:&quot;discover&quot;,&quot;label&quot;:&quot;Discover&quot;,&quot;options&quot;:[{&quot;id&quot;:&quot;product&quot;,&quot;label&quot;:&quot;Developer Centers&quot;,&quot;calloutLink&quot;:{&quot;href&quot;:&quot;/developer-centers&quot;,&quot;label&quot;:&quot;View All&quot;},&quot;options&quot;:[{&quot;id&quot;:&quot;Platform&quot;,&quot;label&quot;:&quot;Platform&quot;,&quot;iconSymbol&quot;:&quot;platform&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers#platform&quot;}},{&quot;id&quot;:&quot;Commerce Cloud&quot;,&quot;label&quot;:&quot;Commerce Cloud&quot;,&quot;iconSymbol&quot;:&quot;commerce&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/commerce-cloud&quot;}},{&quot;id&quot;:&quot;Experience Cloud&quot;,&quot;label&quot;:&quot;Experience Cloud&quot;,&quot;iconSymbol&quot;:&quot;experience&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/experience-cloud&quot;}},{&quot;id&quot;:&quot;Marketing Cloud&quot;,&quot;label&quot;:&quot;Marketing Cloud&quot;,&quot;iconSymbol&quot;:&quot;marketing&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/marketing-cloud&quot;}},{&quot;id&quot;:&quot;Service Cloud&quot;,&quot;label&quot;:&quot;Service Cloud&quot;,&quot;iconSymbol&quot;:&quot;service&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/service-cloud&quot;}},{&quot;id&quot;:&quot;Sales Cloud&quot;,&quot;label&quot;:&quot;Sales Cloud&quot;,&quot;iconSymbol&quot;:&quot;sales&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers#platform&quot;}},{&quot;id&quot;:&quot;Integration&quot;,&quot;label&quot;:&quot;MuleSoft&quot;,&quot;iconSymbol&quot;:&quot;integration&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://developer.mulesoft.com/&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;Slack&quot;,&quot;label&quot;:&quot;Slack&quot;,&quot;iconSymbol&quot;:&quot;slack&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://api.slack.com&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;Analytics&quot;,&quot;label&quot;:&quot;Tableau&quot;,&quot;iconSymbol&quot;:&quot;analytics&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://www.tableau.com/developer&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;CRM Analytics&quot;,&quot;label&quot;:&quot;CRM Analytics&quot;,&quot;iconSymbol&quot;:&quot;analytics&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/crm-analytics&quot;}},{&quot;id&quot;:&quot;Quip&quot;,&quot;label&quot;:&quot;Quip&quot;,&quot;iconSymbol&quot;:&quot;collaboration&quot;,&quot;iconSprite&quot;:&quot;salesforcebrand&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://quip.com/dev&quot;,&quot;target&quot;:&quot;_blank&quot;}}]},{&quot;id&quot;:&quot;platform&quot;,&quot;label&quot;:&quot;Salesforce Platform&quot;,&quot;options&quot;:[{&quot;id&quot;:&quot;Apex&quot;,&quot;label&quot;:&quot;Apex&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/apex&quot;}},{&quot;id&quot;:&quot;Lightning Web Components&quot;,&quot;label&quot;:&quot;Lightning Web Components&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/lightning-web-components&quot;}},{&quot;id&quot;:&quot;Salesforce Flow&quot;,&quot;label&quot;:&quot;Salesforce Flow&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/flow&quot;}},{&quot;id&quot;:&quot;Developer Experience&quot;,&quot;label&quot;:&quot;Developer Experience&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/developer-experience&quot;}},{&quot;id&quot;:&quot;APIs and Integration&quot;,&quot;label&quot;:&quot;APIs and Integration&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/integration-apis&quot;}},{&quot;id&quot;:&quot;Heroku&quot;,&quot;label&quot;:&quot;Heroku&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://devcenter.heroku.com/&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;Mobile SDK&quot;,&quot;label&quot;:&quot;Mobile SDK&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/mobile&quot;}},{&quot;id&quot;:&quot;LWC for Mobile&quot;,&quot;label&quot;:&quot;LWC for Mobile&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/lwc-for-mobile&quot;}},{&quot;id&quot;:&quot;Embedded Service SDK&quot;,&quot;label&quot;:&quot;Embedded Service SDK&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/service-sdk&quot;}},{&quot;id&quot;:&quot;DevOps&quot;,&quot;label&quot;:&quot;DevOps&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/devops&quot;}},{&quot;id&quot;:&quot;Security&quot;,&quot;label&quot;:&quot;Security&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/security&quot;}},{&quot;id&quot;:&quot;Identity&quot;,&quot;label&quot;:&quot;Identity&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/identity&quot;}},{&quot;id&quot;:&quot;Functions&quot;,&quot;label&quot;:&quot;Salesforce Functions&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/developer-centers/functions&quot;}},{&quot;id&quot;:&quot;Einstein&quot;,&quot;label&quot;:&quot;Einstein&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://metamind.readme.io/&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;Lightning Design System&quot;,&quot;label&quot;:&quot;Lightning Design System&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://lightningdesignsystem.com/&quot;,&quot;target&quot;:&quot;_blank&quot;}}]}]},{&quot;id&quot;:&quot;build&quot;,&quot;label&quot;:&quot;Build&quot;,&quot;options&quot;:[{&quot;id&quot;:&quot;resources-for-building&quot;,&quot;label&quot;:&quot;Resources&quot;,&quot;options&quot;:[{&quot;description&quot;:&quot;Explore open-source code samples, SDKs, and tools&quot;,&quot;id&quot;:&quot;code-samples&quot;,&quot;label&quot;:&quot;Code Samples and SDKs&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/code-samples-and-sdks&quot;}},{&quot;description&quot;:&quot;Reference information, developer guide, and Lightning Locker tools&quot;,&quot;id&quot;:&quot;component-library&quot;,&quot;label&quot;:&quot;Lightning Component Library&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://developer.salesforce.com/docs/component-library&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;description&quot;:&quot;Your best source for metadata coverage information&quot;,&quot;id&quot;:&quot;coverage-report&quot;,&quot;label&quot;:&quot;Metadata Coverage Report&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://developer.salesforce.com/docs/metadata-coverage&quot;,&quot;target&quot;:&quot;_blank&quot;}}]},{&quot;id&quot;:&quot;devtools&quot;,&quot;label&quot;:&quot;Developer Tools&quot;,&quot;options&quot;:[{&quot;description&quot;:&quot;Tools for developing with Salesforce in the lightweight, extensible VS Code editor&quot;,&quot;id&quot;:&quot;vs-code-extensions&quot;,&quot;label&quot;:&quot;VS Code Extensions&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://developer.salesforce.com/tools/vscode&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;description&quot;:&quot;Command-line interface that simplifies development and build automation&quot;,&quot;id&quot;:&quot;salesforce-cli&quot;,&quot;label&quot;:&quot;Salesforce CLI&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://developer.salesforce.com/tools/sfdxcli&quot;,&quot;target&quot;:&quot;_blank&quot;}}]},{&quot;id&quot;:&quot;skill-up&quot;,&quot;label&quot;:&quot;Build Skills&quot;,&quot;options&quot;:[{&quot;description&quot;:&quot;Get hands-on with step-by-step instructions, the fun way to learn&quot;,&quot;id&quot;:&quot;trailhead&quot;,&quot;label&quot;:&quot;Trailhead&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://trailhead.salesforce.com&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;description&quot;:&quot;Watch live and on-demand videos&quot;,&quot;id&quot;:&quot;trailhead-live&quot;,&quot;label&quot;:&quot;Trailhead Live&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://trailhead.salesforce.com/live&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;description&quot;:&quot;Earn globally-recognized credentials&quot;,&quot;id&quot;:&quot;certifications&quot;,&quot;label&quot;:&quot;Certifications&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://trailhead.salesforce.com/credentials/developeroverview&quot;,&quot;target&quot;:&quot;_blank&quot;}}]},{&quot;id&quot;:&quot;extend&quot;,&quot;label&quot;:&quot;Extend Salesforce&quot;,&quot;options&quot;:[{&quot;id&quot;:&quot;app-exchange&quot;,&quot;label&quot;:&quot;AppExchange&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://appexchange.salesforce.com/&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;heroku-elements-marketplace&quot;,&quot;label&quot;:&quot;Heroku Elements Marketplace&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://elements.heroku.com/&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;mulesoft-marketplace&quot;,&quot;label&quot;:&quot;MuleSoft Anypoint Exchange&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://www.mulesoft.com/exchange/&quot;,&quot;target&quot;:&quot;_blank&quot;}}]}]},{&quot;id&quot;:&quot;connect&quot;,&quot;label&quot;:&quot;Connect&quot;,&quot;options&quot;:[{&quot;id&quot;:&quot;stay-up-to-date&quot;,&quot;label&quot;:&quot;Stay Up To Date&quot;,&quot;options&quot;:[{&quot;id&quot;:&quot;blog&quot;,&quot;label&quot;:&quot;Blog&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/blogs&quot;}},{&quot;id&quot;:&quot;podcast&quot;,&quot;label&quot;:&quot;Salesforce Developer Podcast&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/podcast&quot;}},{&quot;id&quot;:&quot;events&quot;,&quot;label&quot;:&quot;Events&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;/events&quot;}},{&quot;id&quot;:&quot;youtube-videos&quot;,&quot;label&quot;:&quot;YouTube Videos&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://www.youtube.com/c/SalesforceDevelopers&quot;,&quot;target&quot;:&quot;_blank&quot;}}]},{&quot;id&quot;:&quot;community&quot;,&quot;label&quot;:&quot;Community&quot;,&quot;options&quot;:[{&quot;id&quot;:&quot;forum&quot;,&quot;label&quot;:&quot;Developer Forums&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://developer.salesforce.com/forums&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;trailblazer-community&quot;,&quot;label&quot;:&quot;Trailblazer Community&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://trailhead.salesforce.com/trailblazer-community/feed&quot;,&quot;target&quot;:&quot;_blank&quot;}},{&quot;id&quot;:&quot;parter-community&quot;,&quot;label&quot;:&quot;Partner Community&quot;,&quot;link&quot;:{&quot;href&quot;:&quot;https://partners.salesforce.com/&quot;,&quot;target&quot;:&quot;_blank&quot;}}]}]}]'
    
    subtitle="Developers"
    signup-link="/signup"
    brand=""
    
    
    

></dx-header>

                
            

            <div class="slds-col">
                <div class="slds-is-relative">
                    <main role="main" class="main-content" id="maincontent">
                        
                        <link rel="stylesheet" href="/1/unknown/immutable/s/9829b7d/app/theme/dist/assets/css/pages/blogs-post.css"/>
<link rel="stylesheet" href="/1/unknown/immutable/s/cc5e0bb/app/theme/dist/assets/css/components/subscribe.css"/>

<div class="post-page-container blog-page-container">
    <dx-featured-content-header
        class="featured-content-header-padding-lg"
        title="Inside a React Native Mobile App with Tableau Embedded"
        body="As discussed in a previous blog post, developers are increasingly seeking native options to extend and customize their line-of-business applications. At the same time, data-driven approaches are key to effective decision-making and driving businesses forward."
        img-src="https://d259t2jj6zp7qm.cloudfront.net/images/20220503125229/Inside-a-React-Native-Mobile-App-with-Tableau-Embedded.png"
        img-alt="Inside a React Native Mobile App with Tableau Embedded"
        authors=""
        label="Developers' Blog"
        img-placement="below"
    >
    </dx-featured-content-header>

    <dx-section class="section-padding-lg">
        <dx-socials details="&quot;May 03, 2022&quot;" class='post-socials'></dx-socials>
        <article class="prose">
            <p>As discussed in a previous <a href="https://developer.salesforce.com/blogs/2022/02/inside-a-react-native-mobile-app-with-salesforce-data">blog post</a>, developers are increasingly seeking native options to extend and customize their line-of-business applications. At the same time, data-driven approaches are key to effective decision-making and driving businesses forward.</p>
<p>In this post, we’ll share how we developed a React Native + Expo mobile app using open source tools with a focus on embedded interactive charts and dashboards. We’ll use Tableau Embedded Analytics, a solution that’s easy to customize, integrate, and deploy into applications, products, and even web portals.</p>
<h2>Meet Eureka Finance — a React Native app for executives</h2>
<p>This mobile app demo (which we branded “Eureka Finance”) aims to showcase a simple use case: the senior leadership of a business seeks to access crucial business data to facilitate the making of executive decisions. While we crafted our example for a finance business, this use case is applicable to any industry. We hope that our experience will show you the “art of the possible” when creating your own custom mobile apps using React Native and bringing in useful datasets for your own business apps.</p>
<p>
			  <span >
			    <img src="https://d259t2jj6zp7qm.cloudfront.net/images/20220503124136/eureka-fins-screenshot-1440x1000.png" width="987" heigh="685" />
			  </span>
			<br />
In our demo Eureka Finance app, we have included a few key features. The Home screen provides a dashboard view of the most important metrics that can help senior leaders understand the health of their business. The Customers screen is centered around the most important metrics of their customers, and the Trends screen provides business leaders with some critical insights.</p>
<h2>The power of Tableau Embedded Analytics</h2>
<p>The Eureka Finance app utilizes Tableau Embedded Analytics, which gives users the option to deploy and integrate Tableau into their infrastructure — on-premises or in the cloud, on Windows or Linux, and in a web or mobile app, and bring analytics experiences into their own products and applications. This also empowers the data developer community to unleash its creativity with a flexible platform to help even more people see and understand data.</p>
<p>Combining Tableau with a custom-built mobile app like Eureka Finance can be great for both internal and external stakeholders. For internal stakeholders, it can help employees and teams focus on delivering products and services with data driven insights. For apps intended for customers and external audiences, those with analytics can build user stickiness and decrease the likelihood of users switching to a competitor app.</p>
<p>The Tableau Embedded Analytics platform allows you to focus on building your product, saving you time, resources, and money. Learn how you can empower your customers and drive product engagement with integrated, interactive, and visual analytics in the following video here:</p>
<p><a href="https://www.tableau.com/embedded-analytics#content-210267">WATCH THE VIDEO</a></p>
<p>The diagram below shows an integration between the Eureka Finance app and Tableau Online with <a href="https://help.tableau.com/current/online/en-us/connected_apps.htm#step-2-generate-a-secret">JWT</a> authentication (aka token-based authentication) features to support most business cases in web and mobile app integrations.</p>
<p>
			  <span >
			    <img src="https://d259t2jj6zp7qm.cloudfront.net/images/20220503124218/tableau-jwt.png" width="991" heigh="547" />
			  </span>
			</p>
<h2>Embedding Tableau in React Native</h2>
<p>As specifically designed, it is fairly simple to embed Tableau content into React Native. Let’s discuss this in more details. The first step we’ll need to do is to configure Tableau Connected Apps to enable SSO for embedded content. To do this, create a Connected App from Tableau Online’s Settings page. You’ll need to be a site admin to have access to the Connected Apps feature.<br />

			  <span >
			    <img src="https://d259t2jj6zp7qm.cloudfront.net/images/20220503124324/tableau-connectedapp-2000x502.png" width="989" heigh="248" />
			  </span>
			<br />
In the Create Connected App dialog box, follow these steps:</p>
<ol>
<li>In the Connected App Name text box, enter a name for the Connected App.</li>
<li>From the Applies To drop-down menu, select <b>All project</b> or <b>Only one project</b> to control which views or metrics can be embedded. If you select the &#8220;Only one project&#8221; option, select the specific project.</li>
<li>In the Domain allowlist, specify the domains using the rules described in <a href="https://help.tableau.com/current/online/en-us/connected_apps.htm#domain_formatting">Domain formatting</a> to control where views or metrics can be embedded.</li>
<li>When finished, click <b>Create</b>.</li>
</ol>
<p>Once you have created the Connected App, do note that you will need to enable it because a new Connected App is set to “Disabled” by default (for security purposes). Next to the Connected App&#8217;s name, click the Actions menu and select <b>Enable</b>.</p>
<p>
			  <span >
			    <img src="https://d259t2jj6zp7qm.cloudfront.net/images/20220503124346/tableau-enable.png" width="980" heigh="422" />
			  </span>
			<br />
For more details, refer to the <a href="https://help.tableau.com/current/online/en-us/connected_apps.htm#step-1-create-a-connected-app">Creating a Connected App article</a> on the Tableau website.</p>
<h2>React Native sample code</h2>
<p>Once you have retrieved your Connected App Secret ID, Client ID, and Secret Key, you may proceed to sign the JWT token, which will be used to authenticate to Tableau. You may set it using a variable as follows.</p>
<p>We used the <code>react-native-uuid</code> library which will generate a Universally Unique Identifier (UUID) that we can supplement into the <code>jti</code> (JWT ID) claim in the payload. We also imported the <code>jwt-encode</code> library, which we will use to sign the JWT token, and the <code>moment</code> library for time management.</p>
<pre>import uuid from "react-native-uuid";
const sign <b><i>=</i></b> require("jwt-encode");
const moment <b><i>=</i></b> require("moment");

export const connectedAppSecretId <b><i>=</i></b> "&lt;YOUR SECRET ID&gt;";
export const connectedAppClientId <b><i>=</i></b> "&lt;YOUR CONNECTED APP CLIENT ID&gt;";
export const connectedAppSecretKey <b><i>=</i></b><b><i> </i></b>"&lt;YOUR CONNECTED APP SECRET KEY&gt;";</pre>
<p>Next, create a payload object that will contain the claims of the JWT token. If you are keen to understand more about the properties of these claims, check out <a href="https://jwt.io/introduction">Introduction to JSON Web Tokens</a>.</p>
<p>Do note that for <code>exp</code> (expiration time), we will utilize the <code>moment</code> library, and it has to be in Unix epoch time. Also, the <code>jti</code> (JWT ID) is generated using the <code>react-native-uuid</code> library, and <code>sub</code><i><b> </b></i>(subject) will be the email address/user ID of the tableau user who is authenticating to the dashboard.<i> </i>The dashboards and content that are presented within the WebView will be based on the permissions assigned to this user by the Tableau Administrator.</p>
<pre> // setting up JWT details and signing token
  const payload = {
    iss: connectedAppClientId,
    exp: moment.utc().add(3, "minutes").unix(),
    jti: uuid.v4(),
    aud: "tableau",
    sub: "&lt;EMAIL ADDRESS&gt;",
    scp: ["tableau:views:embed", "tableau:metrics:embed"],
  };</pre>
<p>Create a Headers object which will contain the <code>kid</code><i><b> </b></i>(key identifier) and <code>iss</code><i><b> </b></i>(issuer) that are referenced with the Connected App Secret ID and Connected App Client ID respectively, which you have obtained from the Tableau Administration console earlier.</p>
<pre> const headers = {
    kid: connectedAppSecretId,
    iss: connectedAppClientId,
  };</pre>
<p>Once you have the respective payload and headers objects, proceed to sign the token using the <code>jwt-encode</code> library. If it is more in line with your strategy, you may assign the JWT Token as a state for your app. For me, I used the <code>useState</code> hook in React Native to update the state of the token when it is signed.</p>
<pre>JwtToken = sign(payload, connectedAppSecretKey, headers));</pre>
<p>With the token, here’s the sample code which you can use for the WebView. Note that one of the <code>tableau-viz</code> properties would contain the JWT Token (in bold), which will support the authentication of the Tableau dashboards. Finally, you may return the WebView and include the HTML code in a JSX as follows.</p>
<pre>  let htmlCode =
    "&lt;html&gt;&lt;head&gt;" +
    "&lt;title&gt;Tableau Embedded Integration Demo&lt;/title&gt;" +
    '&lt;script type="module" 
             src="https://embedding.tableauusercontent.com/tableau.embedding.3.0.0.min.js"&gt;
     &lt;/script&gt;' +
    `&lt;body&gt;
        &lt;tableau-viz id="tableauViz" 
            src=${customer_dashboard_url} toolbar="false" 
            iframeSizedToWindow="true" 
            <b>token="${JwtToken}"</b>&gt;
         &lt;/tableau-viz&gt;
      &lt;/body&gt;` +
    "&lt;/head&gt;&lt;/html&gt;";</pre>
<pre>  return (
    &lt;View style={styles.container}&gt;
      &lt;WebView
        originWhitelist={["*"]}
        source={{
          html: htmlCode,
        }}
        cacheEnabled={false}
      /&gt;
    &lt;/View&gt;
  );
};</pre>
<p>To learn more about how we built the demo app, see the <a href="https://github.com/terlim-sfdc/eureka-fins">full source code of the Eureka Finance app</a> on Github.</p>
<p>If you are building an app using Python, you may check out <a href="https://github.com/vkadervel/generateticket/blob/main/genjwt.py">this code sample to generate JWT token with Python</a> on GitHub.</p>
<h2>Differences between the Tableau Mobile app and Eureka Finance</h2>
<p>A common question is: An out-of-the-box <a href="https://www.tableau.com/products/mobile">Tableau Mobile app</a> is also available from the Apple or Google Play app store, so how is Eureka Finance different?</p>
<p>Great question! The Tableau Mobile app is provided by the Tableau team to allow you to check your data at a moment’s notice in order to understand what’s going on around you and make better decisions. While the Tableau Mobile app can be a great window into your organization&#8217;s <a href="https://www.tableau.com/products/server">Tableau Server</a> or <a href="https://www.tableau.com/products/cloud-bi">Tableau Online</a> site, Eureka Finance is an app that&#8217;s custom-built from the ground up, which provides more flexibility. You have the option to build other components and screens within the app, as well as integrate multiple services, including payment and financial transaction processing. This effectively becomes an all-encompassing, self-contained commerce and communication app platform that embraces many aspects of personal and commercial life.</p>
<h2>Conclusion and additional resources</h2>
<p>With the power of the Salesforce Platform and Tableau Embedded Analytics, it is fairly effortless to integrate Tableau into a custom mobile app like Eureka Finance. This is an amazing way to bring data-driven insights into your business apps.</p>
<p>For more guidance with embedded Tableau visualization into mobile apps, refer to the resources below. They include links to demonstrating how to get started, connect, and stay signed in to Tableau Online, how to embed visualization, and how to utilize the Embedded API v3.X to embed Tableau content inside the Eureka Finance app.</p>
<p><a href="https://www.tableau.com/products/cloud-bi">Tableau Online</a><br />
<a href="https://www.tableau.com/embedded-analytics">Tableau Embedded Analytics </a><br />
<a href="https://github.com/terlim-sfdc/eureka-fins">Github code for Eureka Finance app </a><br />
<a href="https://github.com/vkadervel/generateticket/blob/main/genjwt.py">Github sample codes for generating JWT Tokens</a></p>
<h2>About the authors</h2>
<p>Terence Lim is a Salesforce Developer Evangelist with a focus on mobile app development and the Salesforce Platform. Known for his highly-energetic nature, he loves working with people, and nothing excites him more than to be able to inspire and empower others through technology. He has frequently spoken at conferences around the world. He loves meeting new people and learning new things, and he has lots of amazing stories from his travels to share. He’d absolutely love to hear your story too! Check out his GitHub projects @terlim-sfdc.</p>
<p>
			  <span >
			    <img src="https://d259t2jj6zp7qm.cloudfront.net/images/20220217121443/Terence-Lim.png" width="310" heigh="310" />
			  </span>
			<br />
Vijay Kadervel is a Salesforce Solution Engineer with a focus on embedded analytics, API integrations, data analysis, and outlier detection. He has an extensive background as a technical solution architect supporting sales teams from a pre-sales perspective, including demos, presentations, proofs of concept, RFI/RFP assistance, and customer care initiatives. In his current role, Vijay supports customers with embedded analytics initiatives across the APAC region.</p>
<p>
			  <span >
			    <img src="https://d259t2jj6zp7qm.cloudfront.net/images/20220503124448/virtualbooth3.jpg" width="325" heigh="325" />
			  </span>
			</p>

        </article>
    </dx-section>

    <dx-hr spacing="2xl"></dx-hr>

    <dx-section class="section-padding-lg section-reduced-padding">
        <div class="subscription-box">
            <div class="box">
                <div class="content">
                    <h2 class="title">
                        Stay up to date with the latest news from the Salesforce Developers Blog
                    </h2>
                    <dx-button
                        size="small"
                        icon-symbol="rss"
                        icon-sprite="general"
                        href="https://developer.salesforce.com/blogs/feed"
                        class="button"
                    >
                        Subscribe
                    </dx-button>
                </div>
          </div>
        </div>
    </dx-section>

    

    
        <dx-hr spacing="2xl" text="More Blog Posts"></dx-hr>

        <dx-section class="section-reduced-padding">
            <dx-grid columns="three">
                
                    
                        
                        <dx-card-blog-post
                            author-img-src="https://secure.gravatar.com/avatar/8b10a61cdc3c48a5d5f234b263e06475?s=24&amp;d=mm&amp;r=g"
                            author-label="Terence Lim"
                            body="With the rise of modern app development, developers have increasingly demanded native ways to extend and customize their line-of-business applications. In this post, I’ll share how I developed a React Native + Expo mobile app using open source tools with a focus on how to easily interact with Salesforce Objects data via the mobile app."
                            datetime="2022-02-21 15:00:01"
                            title="Inside a React Native Mobile App with Salesforce Data"
                            img-src="https://d259t2jj6zp7qm.cloudfront.net/images/20220217123531/Inside-a-React-Native-Mobile-App-with-Salesforce-Data.png"
                            img-alt="Inside a React Native Mobile App with Salesforce Data"
                            href="/blogs/2022/02/inside-a-react-native-mobile-app-with-salesforce-data"
                        ></dx-card-blog-post>
                    
                
                    
                        
                        <dx-card-blog-post
                            author-img-src="https://secure.gravatar.com/avatar/a2f052721cafaa2bb49720c0e5769db7?s=24&amp;d=mm&amp;r=g"
                            author-label="Raja Rao DV"
                            body="This video blog shows how to add native iOS Salesforce authentication for 1. a new iOS app, 2. an existing iOS app and 3. an app with Salesforce communities or custom login.  This contains 3 short (two 5 minutes and one 10 minutes long) videos, so you can pick and choose which ever works for you."
                            datetime="2014-04-02 17:06:33"
                            title="3 Ways to Configure Salesforce OAuth Authentication in Native iOS Apps"
                            img-src="https://d259t2jj6zp7qm.cloudfront.net/images/v1396460858-Unknown_ki7xrk.jpg"
                            img-alt="3 Ways to Configure Salesforce OAuth Authentication in Native iOS Apps"
                            href="/blogs/2014/04/3-ways-to-configure-salesforce-oauth-authentication-in-native-ios-apps"
                        ></dx-card-blog-post>
                    
                
                    
                        
                        <dx-card-blog-post
                            author-img-src="https://secure.gravatar.com/avatar/7741b7b74bc43ee0c09a5d75593ab5ac?s=24&amp;d=mm&amp;r=g"
                            author-label="Philippe Ozil"
                            body="Did you know that Lightning Web Components lets you retrieve picklist values for any object field without writing a single line of Apex? In this blog post, you’ll learn how you can combine an App Builder custom property, the component runtime context and the User Interface API to retrieve picklist values."
                            datetime="2019-12-12 18:00:43"
                            title="Retrieving Picklist Values Without Using Apex"
                            img-src="https://d259t2jj6zp7qm.cloudfront.net/images/v1533857787-trailhead_module_lightning_app_builder_tmzp0c.png"
                            img-alt="Retrieving Picklist Values Without Using Apex"
                            href="/blogs/2019/12/retrieving-picklist-values-without-using-apex"
                        ></dx-card-blog-post>
                    
                
                    
                
            </dx-grid>
        </dx-section>
    
</div>

                        
                    </main>
                </div>
            </div>
        </div>

        
        <div class="footer-container">
            <dx-footer variant="large-signup"></dx-footer>
        </div>
        
    </body>

    

    <script type="application/javascript">/* This script is generated */
/* Client Bootstrap configuration */
globalThis.LWR = globalThis.LWR || {};
Object.assign(globalThis.LWR, {"bootstrapModule":"@lwrjs/app-service/wordpress_route_/blogs/module/esm/v/0_5_11","autoBoot":true,"importMappings":{"imports":{"dx/header/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fheader%2Fv%2F0_54_2/s/2771fa5dc3c8d203018e84dc6ce5869f561888db/bundle_dx_header.js","dx/featuredContentHeader/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2FfeaturedContentHeader%2Fv%2F0_54_2/s/7afa3a08920dead8211977a1101cdab34fc74828/bundle_dx_featuredContentHeader.js","dx/section/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fsection%2Fv%2F0_54_2/s/7a926ca019cc80f2e3919868ecf613b3acdef0a7/bundle_dx_section.js","dx/socials/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fsocials%2Fv%2F0_54_2/s/3e9c9484286ef8c2c6d5bdf0b1e2f4248ae42386/bundle_dx_socials.js","dx/hr/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fhr%2Fv%2F0_54_2/s/c2277ca2d5704770afd63a22662f574793b93e48/bundle_dx_hr.js","dx/button/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fbutton%2Fv%2F0_54_2/s/426dc26ba79132a543e6694a8c66da24b107b9d6/bundle_dx_button.js","dx/grid/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fgrid%2Fv%2F0_54_2/s/91435c62811f2b15afb809c9007ca4513dc56f22/bundle_dx_grid.js","dx/cardBlogPost/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2FcardBlogPost%2Fv%2F0_54_2/s/7fc05848e636a0e7b395eed9ded26529d471fdb2/bundle_dx_cardBlogPost.js","dx/footer/v/0_54_2":"/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Ffooter%2Fv%2F0_54_2/s/ccfd0f94982e0f759d008266286dcb72b3cb7782/bundle_dx_footer.js","dw/instrumentation/v/0_54_0":"/1/bundle/esm/l/en-US/bi/0/module/mi/dw%2Finstrumentation%2Fv%2F0_54_0/s/3c08fbd1ccdfb3edbefe7871a31562f353d6fd81/bundle_dw_instrumentation.js"},"default":"/1/bundle/esm/l/en-US/bi/0/module/mi/"},"rootComponents":["dx/header/v/0_54_2","dx/featuredContentHeader/v/0_54_2","dx/section/v/0_54_2","dx/socials/v/0_54_2","dx/hr/v/0_54_2","dx/button/v/0_54_2","dx/grid/v/0_54_2","dx/cardBlogPost/v/0_54_2","dx/footer/v/0_54_2","dw/instrumentation/v/0_54_0"],"endpoints":{"uris":{"mapping":"/1/mapping/esm/0/l/en-US/mp/","module":"/1/bundle/esm/l/en-US/bi/0/module/mi/"}}});
globalThis.process = { env: { NODE_ENV: "prod" } };</script>
<script type="module" src="/1/bundle/esm/l/en-US/bi/0/module/mi/%40lwrjs%2Fapp-service%2Fwordpress_route_%2Fblogs%2Fmodule%2Fesm%2Fv%2F0_5_11/s/510668d85bd34d6c8448a9c4511592de5c3cf2cd/bundle_@lwrjs_app-service_wordpress_route__blogs_module_esm.js"></script>
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fheader%2Fv%2F0_54_2/s/2771fa5dc3c8d203018e84dc6ce5869f561888db/bundle_dx_header.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2FfeaturedContentHeader%2Fv%2F0_54_2/s/7afa3a08920dead8211977a1101cdab34fc74828/bundle_dx_featuredContentHeader.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fsection%2Fv%2F0_54_2/s/7a926ca019cc80f2e3919868ecf613b3acdef0a7/bundle_dx_section.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fsocials%2Fv%2F0_54_2/s/3e9c9484286ef8c2c6d5bdf0b1e2f4248ae42386/bundle_dx_socials.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fhr%2Fv%2F0_54_2/s/c2277ca2d5704770afd63a22662f574793b93e48/bundle_dx_hr.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fbutton%2Fv%2F0_54_2/s/426dc26ba79132a543e6694a8c66da24b107b9d6/bundle_dx_button.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Fgrid%2Fv%2F0_54_2/s/91435c62811f2b15afb809c9007ca4513dc56f22/bundle_dx_grid.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2FcardBlogPost%2Fv%2F0_54_2/s/7fc05848e636a0e7b395eed9ded26529d471fdb2/bundle_dx_cardBlogPost.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dx%2Ffooter%2Fv%2F0_54_2/s/ccfd0f94982e0f759d008266286dcb72b3cb7782/bundle_dx_footer.js" />
<link rel="modulepreload" href="/1/bundle/esm/l/en-US/bi/0/module/mi/dw%2Finstrumentation%2Fv%2F0_54_0/s/3c08fbd1ccdfb3edbefe7871a31562f353d6fd81/bundle_dw_instrumentation.js" />

     
    <dw-instrumentation use-google-tag-manager="true"></dw-instrumentation>
    

    <script type="text/javascript">
        // Make all exposed ENV variables accessible on `process.env` in client modules. Note that
        // only ENV variables explicitly listed in .themerc.js will be exposed. Note also that this
        // has to come at the end of the HTML body, because otherwise LWR overwrites
        // `globalThis.process.env` completely.
        globalThis.process = globalThis.process || {};
        globalThis.process.env = Object.freeze({
            ...globalThis.process.env,
            ...JSON.parse('{"GTM_CONTAINER":"GTM-MWZCN8","BASE_URL":"https://developer.salesforce.com","MODE":"prod","COVEO_ORGANIZATION_ID":"org62salesforce","COVEO_PUBLIC_ACCESS_TOKEN":"xx3923a585-7093-42ee-b6c9-d72d841d64d0","COVEO_SEARCH_PIPELINE":"salesforcedevdoc","COVEO_SEARCH_HUB":"salesforcedevdoc"}'),
        });
    </script>

    
</html>
