<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vishnupriya Bhandaram</title>
    <description>The latest articles on DEV Community by Vishnupriya Bhandaram (@vishnupriyabh).</description>
    <link>https://dev.to/vishnupriyabh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F701544%2Fc8d12190-0bf2-4146-a12a-365f3ddd3070.jpeg</url>
      <title>DEV Community: Vishnupriya Bhandaram</title>
      <link>https://dev.to/vishnupriyabh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vishnupriyabh"/>
    <language>en</language>
    <item>
      <title>Hacktoberfest 2021: Let the Contributions Begin! </title>
      <dc:creator>Vishnupriya Bhandaram</dc:creator>
      <pubDate>Mon, 27 Sep 2021 08:56:49 +0000</pubDate>
      <link>https://dev.to/appsmith/hacktoberfest-2021-let-the-contributions-begin-3gal</link>
      <guid>https://dev.to/appsmith/hacktoberfest-2021-let-the-contributions-begin-3gal</guid>
      <description>&lt;p&gt;Time indeed does fly because it feels just like yesterday when we hosted our first ever Hacktoberfest last year! And what a year it has been. &lt;/p&gt;

&lt;p&gt;We started &lt;a href="https://www.appsmith.com/"&gt;Appsmith&lt;/a&gt; because we wanted to create a developer-first product to make an engineer’s life easy. From being a small, little-known project on &lt;a href="https://github.com/appsmithorg/appsmith"&gt;Github&lt;/a&gt;, we now have 5K stars. This wouldn’t have been possible without our community; apart from giving us incredible feedback, they also contributed immensely to our codebase, from contributing new integrations to helping solve bugs. &lt;/p&gt;

&lt;p&gt;We now have over 100 contributors, and we want to expand our community (that means you!), empowering them to contribute to a project that will always remain developer-first. And so, we’re back again this year for an exciting month-long virtual festival supporting open-source projects. We love it because it’s celebratory and community-oriented! At Appsmith, we genuinely believe open-source can take the way we build things to new heights. And our commitment to the community will never waver. &lt;/p&gt;

&lt;p&gt;In that spirit, we are kicking off the &lt;a href="https://hacktoberfest.appsmith.com/"&gt;Hacktoberfest 2021&lt;/a&gt;. In the run-up to the actual code-fest, there are going to be many talks! We will be bringing together folks from other awesome projects to talk about Hacktoberfest and Open Source. Be sure to check these out. You will definitely get to learn more about how to get involved in open-source projects. And yes! We’re ready to swag it out, too, for every valid PR! And contributors who submit more than 4 PRs and invite others to contribute to our repository will get a special prize. &lt;/p&gt;

&lt;p&gt;You are welcome to contribute to the issues on Appsmith’s repository on Github. Be sure to check contribution guidelines, review, and merge policies. Please note that not all pull requests will count towards Hacktoberfest 2021. &lt;/p&gt;

&lt;p&gt;Contributing to open-source projects is an excellent way for users to become contributors. And it’s both a fun and rewarding experience. Sure, it can be scary to begin, and many think that only code that implements significant features matters. Well, I am here to tell you that it’s not true. We believe that no contribution is too small. Bug fixes, documentation updates, submitting articles are all fantastic ways of participating. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hacktoberfest is open to all: Students, developers, anyone really. Background no bar. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To this end, this year, we’ve included several newbie-friendly issues in the challenge to give a warm welcome to first-timers. If you’ve still got some doubts about participating or need some queries answered, head over to our Hacktoberfest channel on &lt;a href="https://discord.com/invite/rBTTVJp"&gt;Discord&lt;/a&gt;, and we will be happy to help you out!  To know more about how you can participate in this event, take a look at our &lt;a href="https://github.com/appsmithorg/appsmith/blob/release/CONTRIBUTING.md"&gt;Contributor Guidelines&lt;/a&gt; and &lt;a href="https://github.com/appsmithorg/appsmith/blob/release/CODE_OF_CONDUCT.md"&gt;Code of Conduct&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Happy Hacking! 🐱‍💻&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>github</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Engineering Diaries: How We Created a Google Sheets Integration for our Product</title>
      <dc:creator>Vishnupriya Bhandaram</dc:creator>
      <pubDate>Fri, 24 Sep 2021 11:58:54 +0000</pubDate>
      <link>https://dev.to/appsmith/engineering-diaries-how-we-created-a-google-sheets-integration-for-our-product-1gl9</link>
      <guid>https://dev.to/appsmith/engineering-diaries-how-we-created-a-google-sheets-integration-for-our-product-1gl9</guid>
      <description>&lt;p&gt;Everything starts with a spreadsheet. Well, almost everything. Spreadsheets are the backbone of all business operations, whether budgeting, people management, expense management, organizing lists, etc. Spreadsheets often become the first choice for fledgling businesses, mainly owing to their versatility and flexibility. Little goes a long way with spreadsheets. For a startup, smart utilization of available funds is critical, and Google Sheets often comes in handy to plan projects, analyze risks, report metrics, generate quotes and predict financial outcomes. Start-ups even use spreadsheets to keep track of client lists, investor lists, and more. So what’s the problem? Things can get messy once you work on it collaboratively or establish strict flows around maintaining a spreadsheet database. Data can get corrupted, and not knowing the latest version, too many changes by too many people who have access to the database and no admin control. &lt;/p&gt;

&lt;p&gt;This is where the power of low-code can be melded with the power of spreadsheets. Turning an excel sheet into a web application is a great way to contain errors due to poor data management, allow for granular control, admin and user access, and these applications scale along with your business. Today, it’s pretty easy to make an application from Google Sheets in record time. &lt;/p&gt;

&lt;p&gt;There are many low code and no-code tools out there that can help you do this, including Appsmith. In this blog, we will talk a bit about the Google Sheets integration on Appsmith, how we built the integration and all the things you can do with it. &lt;/p&gt;

&lt;h2&gt;
  
  
  Behind the Scenes 
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1631783366537%2FUMKEpaFVL.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1631783366537%2FUMKEpaFVL.gif" alt="GSheets_GIF.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of our colleagues, Nidhi Nair, worked on making this integration a possibility. Nidhi joined Appsmith a little less than a year ago, and she enjoys the creative liberty to explore her ideas at Appsmith. “It was possible to use Google Sheets on Appsmith even without our integration. Users could do this using the REST API plugin. However, it’s not the most convenient, and I found it to be unwieldy and something that every user couldn’t configure intuitively or easily,” says Nidhi. &lt;/p&gt;

&lt;p&gt;The Google Sheets integration was created to simplify the interaction for end users. “We identified a set of actions that users would want to use Google Sheets for and optimized the way they interact with data in their sheets,” adds Nidhi. This meant not having to deal with cells and columns, but just arrays. “We defined the scope of the integration to be similar to that of a database. A single sheet was understood to be a table that we wanted to manipulate with the integration. We identified the relevant actions for this,” she says. Implementing this integration meant doing considerable research around how users interact with sheets. For us, reducing the friction for users was a key priority. “We introduced something called RowObjects in the integrations that makes sure that users don’t necessarily have to tinker with the data themselves,” says Nidhi. &lt;/p&gt;

&lt;h2&gt;
  
  
  Key Challenges 
&lt;/h2&gt;

&lt;p&gt;“We wanted to be able to support the DB integration style interaction and also allow users that want to work on it as an excel sheet to be able to continue to do so. This was a relatively easy solution because of how flexible our logic for these integrations is,” says Nidhi, adding that a user could say ‘get me rows 1-10’ and for the next page, ‘get me rows 11-20.’ But they can also do something like: ‘Get me cells D3:J8, and on the next page, get me D11:J16’ (or whatever other logic they would like to use). &lt;/p&gt;

&lt;p&gt;While this may sound trivial, having the liberty to navigate across the sheet at will means that they can organize their data separately from how it is consumed in Appsmith. The biggest challenge in creating this integration was to use Appsmith credentials as a provider for all instances to make it easy. With this, users don't have to set up configuration on Google; Appsmith has already done that for them. Setting up the configuration on Google comes with painful scrutiny, and it’s not for everyone, especially for people who do not deal with tech. “Appsmith’s one-click approval makes it easier,” says Nidhi. &lt;/p&gt;

&lt;p&gt;However, this has a downside; Google Sheets on self-hosted instances cannot be used unless they connect to Appsmith’s cloud API. &lt;/p&gt;

&lt;p&gt;The engineering team is working on and hopes to solve shortly for storing authentication on a per-user basis. This will allow users to access the part of the sheets they have access to and limit access to those they don't. To read more about the roadmap for features, &lt;a href="https://github.com/appsmithorg/appsmith/projects/3" rel="noopener noreferrer"&gt;follow this link&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use Google Sheets Integration on Appsmith 
&lt;/h2&gt;

&lt;p&gt;With Appsmith's inbuilt Google Sheet Integration Plugin, you can use any Google Sheet as a data source or a backend to build robust applications. &lt;br&gt;
1 Set-up Google Sheets PluginCreate a new account on Appsmith (it’s free!), if you are already an existing login to your Appsmith account.&lt;br&gt;
2 Create a new application by clicking on the Create New button under the Appsmith dashboard.&lt;br&gt;
3 We’ll now see a new Appsmith app with an empty canvas and a sidebar with Widgets, APIs, and DB Queries. &lt;br&gt;
4 Click on the + icon next to the APIs section and choose the Google Sheets option. Next, click on the New Datasource button, set the scope to Read and Write, and click Authorise. &lt;br&gt;
5 This will ask us to log in from our Google Account, choose the account we want to access Google Sheets, and log in. After successful authorization, this will redirect back to your Appsmith account. &lt;br&gt;
6 Now, you’ll find your Google Sheets Datasource under your APIs, and you can create the necessary queries by choosing this data source.&lt;/p&gt;

&lt;p&gt;Excellent; now that you’ve completed the set-up, follow the instructions in our docs and get started on your app! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.appsmith.com/how-to-guides/how-to-work-with-google-sheets-on-appsmith" rel="noopener noreferrer"&gt;Learn How to Make an App with Google Sheets&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you interested in learning more about our engineering processes? Follow us on &lt;a href="https://twitter.com/theappsmith" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; and &lt;a href="https://www.linkedin.com/company/appsmith/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt; to stay tuned! &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Write to me, &lt;a href="mailto:vishnupriya@appsmith.com"&gt;vishnupriya@appsmith.com&lt;/a&gt;, and I’d love to get to know what you’re building with Appsmith!&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>We're launching the Appsmith Writers Program!</title>
      <dc:creator>Vishnupriya Bhandaram</dc:creator>
      <pubDate>Wed, 22 Sep 2021 01:38:30 +0000</pubDate>
      <link>https://dev.to/appsmith/we-re-launching-the-appsmith-writers-program-oo9</link>
      <guid>https://dev.to/appsmith/we-re-launching-the-appsmith-writers-program-oo9</guid>
      <description>&lt;p&gt;Are you an engineer who enjoys creating content and sharing your knowledge with the world? We'd love to talk to you!  &lt;/p&gt;

&lt;p&gt;We've been creating a lot of content at Appsmith over the last few months for our growing audience of developers to educate them and share our knowledge with them. You can check it out on our &lt;a href="https://www.youtube.com/appsmith"&gt;Youtube&lt;/a&gt; or our &lt;a href="https://appsmith.com/blog"&gt;blog&lt;/a&gt;. As an open-source project, we don't just want to share our codebase with our community but also our collective knowledge. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Appsmith Writers Program?
&lt;/h2&gt;

&lt;p&gt;At Appsmith, we want to work with engineers who love writing or creating videos. Whether you're a veteran of the trade or a young student just starting out, we'd love to hear from you. &lt;/p&gt;

&lt;p&gt;And of course, pay you for the work you do. &lt;/p&gt;

&lt;p&gt;Topics that excite us are internal tools, low code, open-source, databases, application performance, engineering best practices, JavaScript. And needless to say, newer ways to use Appsmith.&lt;/p&gt;

&lt;p&gt;All that we care about is whether you can write in-depth and in detail. We're looking for long-form pieces which help educate our community (1500 words and up). &lt;/p&gt;

&lt;p&gt;We don't care about your style and grammar. We've got a great editorial team to help with that. &lt;/p&gt;

&lt;h3&gt;
  
  
  Is it paid?
&lt;/h3&gt;

&lt;p&gt;Yes! We pay anywhere between $200-$400 for content created (video, templates, blog posts, tutorials).&lt;/p&gt;

&lt;h3&gt;
  
  
  What kind of content should I send in?**
&lt;/h3&gt;

&lt;p&gt;Below are the types of content we're most excited about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blog Post / Templates&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A tutorial involving Appsmith. Some examples &lt;a href="https://appsmith.com/blog/building-an-expense-manager-for-your-startup"&gt;here&lt;/a&gt;, &lt;a href="https://appsmith.com/blog/building-a-discount-management-dashboard-with-postgres"&gt;here&lt;/a&gt;, and &lt;a href="https://appsmith.com/blog/make-your-own-social-media-marketing-app-like-hootsuite-with-appsmith-and-n8n"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A how-to guide explaining some of Appsmith's features. An example &lt;a href="https://blog.appsmith.com/the-complete-table-widget-building-complex-tables-with-appsmith"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A forkable template (for example, here's a template of a &lt;a href="https://www.appsmith.com/templates/daily-standup"&gt;standup app&lt;/a&gt;). The ideal template will include a database (check out all &lt;a href="https://docs.appsmith.com/core-concepts/connecting-to-data-sources/connecting-to-databases"&gt;databases supported here&lt;/a&gt;)+ some API integration. &lt;a href="https://docs.appsmith.com/core-concepts/connecting-to-data-sources/connect-to-apis"&gt;We connect to most REST APIs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to write an engineering post that could be relevant for Appsmith's audience of backend developers but not directly about Appsmith (for example, &lt;a href="https://blog.appsmith.com/junit-test-with-containerized-mysql-database-using-intellij-idea"&gt;this&lt;/a&gt;), we'd be very excited to discuss those too. &lt;/p&gt;

&lt;p&gt;If your proposal is accepted, we’ll feature it on our website with your name and share it with our rapidly growing open-source community. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These videos can fall into different categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Tutorial where you show how you built something using Appsmith.&lt;/li&gt;
&lt;li&gt;A How-to guide explaining some of Appsmith's features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to have an ongoing engagement with Appsmith, where you want to create Youtube videos on broader engineering topics (not directly related to Appsmith) on the Appsmith Youtube channel, please do reach out as well; we can figure something out.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Great, how do I get started?
&lt;/h3&gt;

&lt;p&gt;The best way is to &lt;a href="https://forms.gle/jVNqVzmXTWUBDqkd6"&gt;fill our form&lt;/a&gt; to share an outline, and we can take it from there. (Note: We're going to only consider previously unpublished content) &lt;/p&gt;

&lt;p&gt;If you're keen on exploring this opportunity but don't have a clear idea of what you'd like to write, we're happy to help! Just mention this in the form, and we will get back to you ASAP! &lt;/p&gt;

</description>
      <category>writing</category>
      <category>startup</category>
    </item>
    <item>
      <title>Building a Shopify Admin Panel: A Step by Step Guide</title>
      <dc:creator>Vishnupriya Bhandaram</dc:creator>
      <pubDate>Thu, 16 Sep 2021 08:45:14 +0000</pubDate>
      <link>https://dev.to/vishnupriyabh/building-a-shopify-admin-panel-a-step-by-step-guide-569o</link>
      <guid>https://dev.to/vishnupriyabh/building-a-shopify-admin-panel-a-step-by-step-guide-569o</guid>
      <description>&lt;p&gt;&lt;em&gt;This post has been written by one of Appsmith's contributors, Joseph Petty. This was &lt;a href="https://www.appsmith.com/blog/building-a-shopify-admin-panel-a-step-by-step-guide"&gt;previously published here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Hey everyone! Joseph here from GreenFlux, LLC. I'm a Shopify Partner Developer and a HUGE fan of Appsmith! 😻&lt;/p&gt;

&lt;p&gt;In fact, I've written  &lt;a href="https://blog.greenflux.us/"&gt;several blog posts&lt;/a&gt;  on Appsmith integrations already, but today will be my first post officially written for Appsmith! I'm super excited to be working with the Appsmith team and sharing my API integration experience with the community. &lt;/p&gt;

&lt;p&gt;I've done a lot of work with the Shopify API over the last few years, but only recently discovered Appsmith. So I wanted to put together this guide with some specific use-cases that help solve some common business problems. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;but before I get to those specific use-cases...&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  This guide is written for the Shopify API, but the build process can easily be applied to &lt;em&gt;any&lt;/em&gt; API.
&lt;/h3&gt;

&lt;p&gt;The Authentication steps may be different, but most of this guide will work with any API to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perform CRUD &lt;em&gt;(Create/Read/Update/Delete)&lt;/em&gt; operations with the API directly&lt;/li&gt;
&lt;li&gt;Download/sync API-GET request to Google Sheets&lt;/li&gt;
&lt;li&gt;Find/Modify/Delete a row in Google Sheets based on API data&lt;/li&gt;
&lt;li&gt;Send data from Google Sheets to Shopify &lt;em&gt;(Create, or Update existing)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Now for the specific use-cases
&lt;/h3&gt;

&lt;p&gt;Most shops only take orders for products that they have in inventory, then ship them out as the orders come in. &lt;em&gt;But some businesses wait to begin 'creating' the product until an order has been placed.&lt;/em&gt; Think T-shirt printing, custom-built bikes/skateboards, and even wholesale produce and flowers that are only harvested after an order is placed.&lt;/p&gt;

&lt;p&gt;That creation/ harvest process can have several steps and require multiple employees, and even have an approval process with different access levels. Lots of industries are creating products to-order, and need a way to track this process without sharing the Shopify admin login to all users. &lt;/p&gt;
&lt;h3&gt;
  
  
  ☝️ So let's say you have a Shopify store that sells high-tech vehicle upgrades! 🛸
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;And you have a team of workers in three departments:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[Assembly, Quality Control, Shipping]&lt;/code&gt; &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Case 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Track production with Google Sheets data linked to each order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Case 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Safely enable workers to edit orders (mark shipped) without sharing Shopify login&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h1&gt;
  
  
  Let's get to building!  🛠
&lt;/h1&gt;

&lt;p&gt;Start by creating a Google Sheet for &lt;em&gt;Workers&lt;/em&gt; and another for &lt;em&gt;Assignments&lt;/em&gt;. &lt;br&gt;
Or you can copy this public  &lt;a href="https://docs.google.com/spreadsheets/d/1NN02vjVebOV_Ti3XL7eIfavBX8oIPToqNmtEjo8J4C0/edit?usp=sharing"&gt;sample sheet&lt;/a&gt; . &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sx8W-gqX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630413266830/nZbYdxDlf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sx8W-gqX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630413266830/nZbYdxDlf.gif" alt="2021-08-31 08.33.42.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Next, you'll want to enable the Shopify API.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Login to Shopify and click &lt;strong&gt;Apps&lt;/strong&gt; on the left sidebar&lt;/li&gt;
&lt;li&gt;Scroll down and click &lt;em&gt;manage private apps&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Create a new private app&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Show inactive Admin API permissions&lt;/em&gt; to expand&lt;/li&gt;
&lt;li&gt;Select: &lt;strong&gt;Orders&lt;/strong&gt; = &lt;code&gt;Read and write&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Save and note the new API Key and Password&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ok, on to Appsmith&lt;/p&gt;


&lt;h3&gt;
  
  
  Add Shopify Datasource
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a new App (from Drag &amp;amp; Drop)&lt;/li&gt;
&lt;li&gt;Under Datasources, create a new &lt;strong&gt;Authenticated API&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set the URL to https://&lt;code&gt;YOUR_STORE_NAME&lt;/code&gt;.myshopify.com/admin/api/&lt;code&gt;API_VERSION&lt;/code&gt;/
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://greenfluxtest.myshopify.com/admin/api/2021-07/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Set Authentication Type to Basic&lt;/li&gt;
&lt;li&gt;Enter the API Key (as the username) and the password, and SAVE.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7AH_RxyY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630245034401/EjcizLcXM.png" alt="Screen Shot 2021-08-29 at 9.49.36 AM.png"&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Add Query
&lt;/h3&gt;

&lt;p&gt;Next let's create our first query to GET orders. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Under the Shopify datasource, add a new Query named get_orders&lt;/li&gt;
&lt;li&gt;Append the URL with &lt;code&gt;orders.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click RUN.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uCoTB-rf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630245167061/KNG8CYVhx.png" alt="Screen Shot 2021-08-29 at 9.52.00 AM.png"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Awesome! Our new app is now making authenticated API calls to Shopify and returning data. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note the response format; All orders are nested inside the "orders" property.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "orders":
    [
      // ARRAY OF JSON OBJECTS
      {Order1},
      {Order2},
      {Order3}...
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the API and rename &lt;code&gt;get_products&lt;/code&gt;, then change orders to &lt;code&gt;products&lt;/code&gt; in the endpoint URL. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PXOErhu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630357938051/f_f487m9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PXOErhu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630357938051/f_f487m9w.png" alt="Screen Shot 2021-08-30 at 5.11.45 PM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, let's add a few widgets to display the data&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Table Widget
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;code&gt;Widgets +&lt;/code&gt; on the left sidebar, and drag in a new table widget&lt;/li&gt;
&lt;li&gt;In the table's settings panel, click the &lt;code&gt;/&lt;/code&gt; (Slash) command&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;get_orders&lt;/code&gt; API.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;.orders&lt;/code&gt; to bind the Table Widget to the order array from response body.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5jN_O8lQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630245939419/Iak4u1V9Q.gif" alt="2021-08-29 09.57.01.gif"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alright, now to connect the Google Sheet data. &lt;/p&gt;




&lt;h3&gt;
  
  
  Add Google Sheets APIs
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;If this is your first time connecting Google Sheets to Appsmith, start out by adding a new datasource:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Datasources + &amp;gt; Create New &amp;gt; Google Sheets&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.appsmith.com/datasource-reference/querying-google-sheets"&gt;Appsmith Docs&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Then follow the prompts and authorize Appsmith to connect to your Google account. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Add new Query under Google Sheets datasource, named &lt;code&gt;get_workers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enter URL for your spreadsheet&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;worker&lt;/code&gt; for the sheet name&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Row offset&lt;/strong&gt; to &lt;code&gt;0&lt;/code&gt; and &lt;strong&gt;Row Limit&lt;/strong&gt; to &lt;code&gt;50&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;RUN.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QmEHmqjp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630356943282/ZFtv0KaMX.png" alt="Screen Shot 2021-08-30 at 4.55.38 PM.png"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next, copy the &lt;code&gt;get_workers&lt;/code&gt; API, rename &lt;code&gt;get_assignments&lt;/code&gt; and change the sheet name. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DQUiC-Rw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630404574471/yGWQeszcs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DQUiC-Rw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630404574471/yGWQeszcs.png" alt="Screen Shot 2021-08-31 at 6.09.29 AM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, so far we have GET requests working to Shopify and Google Sheets. &lt;/p&gt;

&lt;p&gt;Go ahead and add a few more Table Widgets for Workers and Assignments using the same method above. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now we need a way to feed the get_orders request to the orders sheet.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Add a POST (Create) API for Google Sheets
&lt;/h3&gt;

&lt;p&gt;Appsmith has a full list of methods available for performing CRUD operations with Google Sheets. We &lt;em&gt;could&lt;/em&gt; use &lt;code&gt;Insert sheet row&lt;/code&gt; to add orders one at a time, but the &lt;code&gt;get_orders&lt;/code&gt; API returns an array of orders. &lt;/p&gt;

&lt;p&gt;Now, the &lt;code&gt;Bulk Insert Rows&lt;/code&gt; method expects an array of objects, with keys that match the the sheet's column names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    header1:value,
    header2:value,
    header3:value
  },
  ...{more objects},
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the map() method returns an array. &lt;/p&gt;

&lt;p&gt;So we can &lt;strong&gt;map()!&lt;/strong&gt; over the &lt;code&gt;get_orders&lt;/code&gt; data and build our rows.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Detailed explanation here:&lt;br&gt;
&lt;a href="https://blog.greenflux.us/saving-api-response-data-to-google-sheets-with-appsmith"&gt;https://blog.greenflux.us/saving-api-response-data-to-google-sheets-with-appsmith&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Copy the &lt;code&gt;get_assignments&lt;/code&gt; API and rename &lt;code&gt;create_assignments&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change the method to &lt;code&gt;Bulk insert rows&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the Row Object, enter:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{
get_orders.data.orders.map(
o =&amp;gt; {
 return {'id':o.id, 'email':o.email, 'products':o.line_items.map(l =&amp;gt; l.name).join()};
}
)
}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RUN&lt;/strong&gt; 🚀&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RQX2Dw7Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630409015023/oGxtsbp9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RQX2Dw7Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630409015023/oGxtsbp9p.png" alt="Screen Shot 2021-08-31 at 7.22.49 AM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SWEET!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  All open orders are saved to Google Sheets with a single click!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fPseNxkI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630431179275/Jk-faDP7s.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fPseNxkI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630431179275/Jk-faDP7s.gif" alt="giphy (3).gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*But what happens when we run it again? *&lt;/p&gt;

&lt;p&gt;Uhhh... now I have two copies of every order.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1SRk_AWG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630431051615/1gF1qK37t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1SRk_AWG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630431051615/1gF1qK37t.gif" alt="giphy (2).gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hmm... we need a way to tell Shopify what orders we already have, and &lt;em&gt;only&lt;/em&gt; download new ones!&lt;/p&gt;




&lt;h3&gt;
  
  
  Passing values from an API response to a new request
&lt;/h3&gt;

&lt;p&gt;Here's where things get interesting. First we have to &lt;strong&gt;get_assignments&lt;/strong&gt;, then find the max order number that's already in our sheet, and finally, send a new request to Shopify to get new orders after that order number. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://shopify.dev/api/admin/rest/reference/orders/order#index-2021-07"&gt;Shopify API docs&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;We can use the &lt;code&gt;since_id&lt;/code&gt; parameter to filter the orders that are returned and then save only new orders back to the sheet. &lt;/p&gt;

&lt;p&gt;First we need to know the last order number from our sheet. I like to store these values into a separate widget, so I can reference just the name, instead of trying to insert a whole function in place of the ID in the URL. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a Text Widget named &lt;code&gt;maxId&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set the Text value to:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{
get_assignments.data.map(
    o =&amp;gt;{ return o.id}
  )
  .sort().reverse()[0]
}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Update the &lt;code&gt;get_orders&lt;/code&gt; API endpoint &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;This will produce an array of all order &lt;code&gt;id&lt;/code&gt;s, and then sort them in case any of the rows are stored out of order in the sheet. The default sort order is low to high, so reversing and taking the first (zero index [0]) item returns the max value. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wq9sbiiA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630411857933/NlGNsYjWX.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wq9sbiiA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630411857933/NlGNsYjWX.png" alt="Screen Shot 2021-08-31 at 8.10.53 AM.png"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Now we're getting somewhere.&lt;/strong&gt; We can continuously download orders to the order sheet, but what about updating individual rows? &lt;/p&gt;

&lt;p&gt;First let's add a few Widgets to view/edit the selected assignment. I've added a Container Widget to the right of the &lt;code&gt;table_assignments&lt;/code&gt;, Text Widgets to display the Order# and Products, and Input Widgets for the Worker and Instructions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r9d-T2Al--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630575599368/5vMlVPvJ4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r9d-T2Al--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630575599368/5vMlVPvJ4.gif" alt="2021-09-02 05.35.38.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can reference the &lt;code&gt;table_assignments.selectedRow&lt;/code&gt; properties to populate the default values for our Widgets. This will update the Widgets automatically when the selected row is changed. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vgiUv6TC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630575905300/WUqF5rgYm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vgiUv6TC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630575905300/WUqF5rgYm.png" alt="Screen Shot 2021-09-02 at 5.44.49 AM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, let's add a few Widgets to set values in the &lt;code&gt;assignment&lt;/code&gt; sheet. &lt;/p&gt;

&lt;p&gt;First we want to add a Select Widget (dropdown menu) with all the workers. The &lt;code&gt;Options&lt;/code&gt; should contain an array of objects with &lt;code&gt;label&lt;/code&gt; and &lt;code&gt;value&lt;/code&gt; properties.  (literal array, or expression that returns an array). &lt;/p&gt;

&lt;p&gt;So you could hard-code the Select Widget's Options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    'label': 'Worker1',
    'value': W00001'
  },
  {...
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...but wouldn't it be cool if our dropdown could automatically show all the current workers from our workers sheet?!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{
  get_workers.data.map(
    w =&amp;gt;  {return {label:w.name,value:w.id}
    }
  )
}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CvCdx2lD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630442342981/kVFLS8CkG.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CvCdx2lD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630442342981/kVFLS8CkG.png" alt="Screen Shot 2021-08-31 at 4.38.57 PM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cFaFR5h4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630442686143/yCPE7InyM.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cFaFR5h4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630442686143/yCPE7InyM.gif" alt="giphy (4).gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  EXCELLENT!
&lt;/h3&gt;

&lt;p&gt;Time to test out these new input fields! &lt;/p&gt;




&lt;h3&gt;
  
  
  Update a row in Google Sheets
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Copy the &lt;code&gt;get_assignments&lt;/code&gt; API and rename &lt;code&gt;update_assignment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change the method to &lt;code&gt;Update a sheet row&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy a single object from the &lt;code&gt;get_assignments&lt;/code&gt; response to the &lt;code&gt;update_assignment&lt;/code&gt; Row Object&lt;/li&gt;
&lt;li&gt;Add commas between properties&lt;/li&gt;
&lt;li&gt;Add references to the new Widgets' text values&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e2TaXvyj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630577973943/w1hgd8fh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e2TaXvyj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630577973943/w1hgd8fh9.png" alt="Screen Shot 2021-09-02 at 6.18.56 AM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: I removed the &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;products&lt;/code&gt; because these should not be edited once downloaded. Our template is only for updating the &lt;code&gt;worker_id&lt;/code&gt; and associated timestamps/ instructions. &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Fulfill an Order in Shopify
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ok, we're almost there!&lt;/strong&gt; The last piece we need is a way to fulfill an order in Shopify.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: Orders can have multiple fulfillments per line item and different status for each fulfillment. &lt;br&gt;
To keep this example simple, &lt;em&gt;our app is going to create a single fulfillment per order&lt;/em&gt; and ignore partial fulfillments. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This step will be using the &lt;code&gt;/fulfillments.json&lt;/code&gt; endpoint, and we need the location id. You can get this through the API,  but the easiest way is to view the location and get the id from the URL. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;In Shopify&lt;/strong&gt;, click Settings on left sidebar&lt;/li&gt;
&lt;li&gt;Click Locations&lt;/li&gt;
&lt;li&gt;Click the location you want to use for fulfillments&lt;/li&gt;
&lt;li&gt;Copy the id from the URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We want the employees to be able to select a row in the app and click 'Fulfill Order' without giving them full access to the Shopify admin account. &lt;/p&gt;

&lt;p&gt;In other words, we want to use data from the &lt;code&gt;selectedRow&lt;/code&gt; of the &lt;code&gt;table_assignments&lt;/code&gt; to send a POST request to Shopify. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Under the Shopify datasource, add a new Query named &lt;code&gt;create_fulfillment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set the URL to &lt;code&gt;orders/{{Number(table_assignments.selectedRow.id)}}/fulfillments.json&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4u3WeRRb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630578333102/ua3Ok3-JV.png" alt="Screen Shot 2021-09-02 at 6.23.11 AM.png"&gt;
&lt;/li&gt;
&lt;li&gt;Set the body to:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "fulfillment": {
    "location_id": YOUR_LOCATION_ID,
    "notify_customer": true
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add a button to run the &lt;code&gt;create_fulfillment&lt;/code&gt; API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MAKE IT SO!&lt;/strong&gt; 🛸 &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AtrnywS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630576905723/y1KjEzEcH.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AtrnywS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630576905723/y1KjEzEcH.png" alt="Screen Shot 2021-09-02 at 6.01.21 AM.png"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  WHEW! What an adventure!
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Thanks for taking this journey with me on my first official Appsmith post!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is just a small sample of the awesome power of Appsmith. There's so much more we could do from here, like connecting another API and sending Slack messages or emails to each worker when an order is assigned, emailing customers pictures of the products during production, or calculating average processing times per worker or product. &lt;/p&gt;

</description>
      <category>tutorial</category>
    </item>
    <item>
      <title>How We Made Connecting Data to Widgets Much Easier</title>
      <dc:creator>Vishnupriya Bhandaram</dc:creator>
      <pubDate>Tue, 14 Sep 2021 06:55:03 +0000</pubDate>
      <link>https://dev.to/appsmith/how-we-made-connecting-data-to-widgets-much-easier-pc6</link>
      <guid>https://dev.to/appsmith/how-we-made-connecting-data-to-widgets-much-easier-pc6</guid>
      <description>&lt;p&gt;What do we want our users to do on Appsmith? The obvious answer is that we want them to build fantastic internal apps for their organizations super fast. But what we're doing solves a more significant and perhaps intangible problem: avoiding repetitive and tedious grunt work. Developers don't want to do this, and we want to enable them to get to solutions faster. For this, Appsmith needs to be smarter and better too. The first step is to have a smooth onboarding experience — it's good for our users and great for us! &lt;/p&gt;

&lt;p&gt;However, we noticed that users couldn't easily find critical elements essential to understanding how Appsmith works. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9eufRcud--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100566373/wA6Cb5FKK.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9eufRcud--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100566373/wA6Cb5FKK.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our data connectors were hidden, and there were no obvious means of accessing them. There were a few more glaring pain points; for example, we felt that our widgets with pre-filled data, discouraged users from playing around with the platform. And even if our users were landing on the queries section, the flow was confusing and switching between data queries and widgets was non-intuitive. The product was not hitting the intended direction; to address all this confusion and more, we changed the navigation experience. &lt;/p&gt;

&lt;p&gt;Simply put, our overarching goal with this update was to get people to connect their data to the UI. &lt;/p&gt;

&lt;p&gt;Widget ➡️ Datasources ➡️ Querying Data ➡️ Connecting Widget&lt;br&gt;
With this flow in mind, we made several changes to the navigation experience. &lt;/p&gt;

&lt;p&gt;Users can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect data sources faster &lt;/li&gt;
&lt;li&gt;Find the right widget for available data &lt;/li&gt;
&lt;li&gt;See relationships between UI and Data clearly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog, we will talk about Appsmith's new navigation experience and how our design and platform pods went about the production process. Hopefully, you'll also get an inside look into the collaborative engineering and design practices here at Appsmith! &lt;/p&gt;

&lt;h3&gt;
  
  
  Merging APIs and DB Queries under Datasources
&lt;/h3&gt;

&lt;p&gt;When a user is in an exploratory stage, what do they do first? Build UI or connect data sources? For us, it was a little bit of a chicken and an egg situation. We wanted to limit the fields to not overwhelm users with too many options and manage the flow into smaller edible nuggets. &lt;/p&gt;

&lt;p&gt;Having APIs as a separate entity was counterintuitive. Merging it under data sources makes it easier for discovery and helps the user understand that all data comes from a data source — whether it's an API or a database query. &lt;/p&gt;

&lt;p&gt;Along with this, we've also added subtle nudges and prompts such as this: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r7htOJJF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100718789/ByaMwcp8T.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r7htOJJF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100718789/ByaMwcp8T.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This reinforces the importance of connecting data sources to get apps working. ‍&lt;/p&gt;

&lt;h3&gt;
  
  
  The Right Widget for Your Data ‍
&lt;/h3&gt;

&lt;p&gt;If you're confused about finding the best way to represent available data (a chart or a table?), the Appsmith platform can now predict the best widget based on your data. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7HFUBRYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100761726/hCZmzuMmb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7HFUBRYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100761726/hCZmzuMmb.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This feature helps users narrow down options based on the type of data they have, speeding up the process of building an app. Earlier, users had to add the data source, write the query, go back to the canvas, scout for the right widget, (deep breath), drop it, and then bind it. With the new and improved flow, users can add data sources, write queries, select recommended widgets. Appsmith does everything else!‍&lt;/p&gt;

&lt;h3&gt;
  
  
  Clarity on Entity Relationships‍
&lt;/h3&gt;

&lt;p&gt;Once you're inside a widget, it's essential to see how your data is linked to each other. We realized that when there are multiple data sources and queries on your application, sometimes it might be hard to navigate between data sources. So, we’ve added a way to be able to see entity relationships more clearly. With the upgraded new navigation experience, all the defined queries are listed on the widgets under incoming entities; you can directly choose (what) without writing JS bindings. When the widget performs any actions, for example, when a button is clicked, or a row is selected, these queries can now be seen under the outgoing entities section. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4b4cRf6t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100799468/zAkfvVmn0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4b4cRf6t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100799468/zAkfvVmn0.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Make things more obvious
&lt;/h3&gt;

&lt;p&gt;If there's one thing we've come to believe in after spending almost two months on this update, it's that keeping things simple tends to go a long way. This reflects even in the copy&lt;/p&gt;

&lt;p&gt;Bind Data — Connect Data &lt;/p&gt;

&lt;p&gt;APIs and DB Queries — Datasources&lt;/p&gt;

&lt;p&gt;We introduced slash commands as a quicker and simpler way to connect widgets to a data source. Now you can trigger commands by typing "/" and use it anywhere you're writing Javascript (within moustache bindings) on Appsmith. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T4YYusRv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100836518/QlDEGDgDr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T4YYusRv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629100836518/QlDEGDgDr.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Slash commands also give a heads up for developers to start from somewhere. They become the way to initiate writing custom code and our auto-complete feature speeds up the process! &lt;/p&gt;

&lt;p&gt;Our efforts with this new navigation experience were to make things simple and enable our users to find and understand features easily. As an open-source organization, we will always be a work in progress powered by our incredible community. We will strive to keep improving Appsmith!&lt;/p&gt;

&lt;p&gt;‍If this new navigation experience helped you do let us know! As always, we would love to learn more about you and what you're building using Appsmith; please feel free to email me (&lt;a href="mailto:vishnupriya@appsmith.com"&gt;vishnupriya@appsmith.com&lt;/a&gt;). &lt;/p&gt;




&lt;p&gt;&lt;a href="http://notion.so/Betasmith-Join-the-Appsmith-Beta-Community-5c288dfd57bd4c4781c3bf02ddf9aa8a"&gt;&lt;em&gt;Become a Betasmith&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Have a say in shaping Appsmith's future!‍&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.appsmith.com/"&gt;&lt;em&gt;Join our community‍&lt;/em&gt;&lt;/a&gt; &lt;br&gt;
Contribute or generally hang out with us!‍&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lu.ma/appsmith"&gt;&lt;em&gt;Sign up for Events‍&lt;/em&gt;&lt;/a&gt; &lt;br&gt;
Stay up to date on new features, live demos, etc.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How Tiger Global funded Fyle Empowered Their Customer Success Team with Appsmith</title>
      <dc:creator>Vishnupriya Bhandaram</dc:creator>
      <pubDate>Tue, 14 Sep 2021 06:49:53 +0000</pubDate>
      <link>https://dev.to/appsmith/how-tiger-global-funded-fyle-empowered-their-customer-success-team-with-appsmith-4f10</link>
      <guid>https://dev.to/appsmith/how-tiger-global-funded-fyle-empowered-their-customer-success-team-with-appsmith-4f10</guid>
      <description>&lt;p&gt;Fyle is a software product that helps management and finance teams eliminate manual work. Fyle’s global expense management system integrates accounting software and credit card reconciliation, among other features.  With Fyle, employees can track their business expenses, apply for reimbursements on the go, etc. Fyle has over 300 customers in more than 80 countries and is backed by marquee investors like Tiger Global. &lt;/p&gt;

&lt;p&gt;They are a team of 80 employees (and counting) who believe that business expenses should be the least complicated thing about businesses. We spoke to Jatin Sharma, a software engineer, and Gokul Kathiresan (Engineering Manager) in Fyle’s Operations Engineering team about how they automated some of their crucial internal processes with Appsmith. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Successes for Fyle with Appsmith:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated 30% of Service Requests in a quarter &lt;/li&gt;
&lt;li&gt;Reduced Engineering Workload by 30%; freeing up their time to focus on core goals&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solid Internal Processes Lead to Great External Success
&lt;/h2&gt;

&lt;p&gt;Streamlining internal processes is crucial to any company, and it reflects on your deliverables and overall company performance. If you’re able to manage those micro-processes, it improves the entire working environment, believes Jatin. “We know that when we build something in-house, we have to divert our attention and focus on maintaining that particular product and also scaling that product over time, and it can become a problem,” he adds. &lt;/p&gt;

&lt;p&gt;When companies scale — especially a fast-growing next-generation expense management software like Fyle — some operations become redundant, which employees have to perform manually and frequently. These activities are crucial for the flow of information in an organization, and a chink in the internal system can have severe repercussions for the end product. From an organizational perspective, the customer side of the product takes up a bulk of the engineering team’s efforts. Then there’s the internal platform engineering, dev-ops, etc., which is essential and also needs due attention. Effective internal tools/applications can help manage organizations like Fyle manage their engineering resources better.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Fyle’s Internal Challenges
&lt;/h2&gt;

&lt;p&gt;Fyle’s key focus internally is on resolving redundant operations, which are performed manually and frequently. And a part of this vision is to reduce pressure on the engineering team in catering to customer requests or completing operations required by the non-engineering team—avoiding maintaining in-house internal tools that place serious time and effort crunch on the engineering team. More specially, ensuring the smooth functioning of the customer success department. Whenever customers raise queries and requests, a customer success team member would create a “task” on Click Up (a project management application) and assign it to a member from the engineering team. “The scaling problem is real. Earlier it was a once-a-day activity, where two engineers would look over the requests, but now after going remote, and with the increasing volume of requests, it was affecting the productivity of our engineers,” says Gokul.  &lt;/p&gt;

&lt;p&gt;When the volume grows, ad-hoc tasks can no longer be possible, and in fact, can be detrimental to the functioning of an organization. At Fyle, the increased volume of requests put pressure on the engineering teams leading to backlogs and delays. It became urgent to resolve this issue for both the engineering and customer success teams. This is where Appsmith entered the picture by being the platform that could help the customer success team self-serve the requests without the intervention of the engineering team. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Fyle Chose Appsmith
&lt;/h2&gt;

&lt;p&gt;Jatin’s team at Fyle was already looking for a robust internal tool that could solve their problem of reducing engineering dependencies for day-to-day internal operations. They also tried Retool, Internal, among others, and chose to go with Appsmith for the following reasons: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Easy to evaluate&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We were able to do a hands-on demo quickly, and it made us understand what we were getting and what we could do with Appsmith.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The developer’s documentation was great, and it provided easy steps to try out Appsmith. This was really helpful. It also has simple curl scripts for installing the platform via Docker, Kubernetes, etc.” ‍&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Easy to Build‍&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It’s so easy to build an app on Appsmith, that too in just less than 10 minutes.‍&lt;br&gt;
Deploy on Private Instance&lt;/p&gt;

&lt;p&gt;“We loved that we could deploy Appsmith on our local/private instance and build an app. For us, it was an important concern because it would involve our production database credentials which we were unwilling to share.”‍&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;*&lt;em&gt;Open-Source *&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Appsmith is an open-source product with all the basic features similar to other paid products in the market. It has been a great problem solver for us.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Helpful Community&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Appmsith has a great and helpful community on Discord, and getting quick responses there helped us a lot!” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What did Fyle Build with Appsmith? ‍
&lt;/h2&gt;

&lt;p&gt;Fyle created an internal service request management system for the customer success team. With this app, they could validate requests from organizations and resolve those requests with just a click of a button. This process has ensured that such requests get resolved in seconds. This application, built on Appsmith, provides Fyle’s customer success team basic information about a customer to help debug and exclude PII data. It allows them to enable/disable some features and settings of the product for a specific set of customers. This enabled the team to self-serve customers’ service requests without depending on the engineering team. This automation has reduced the turnaround time (TAT) of serving a customer’s service request from a few days to just a few seconds.&lt;/p&gt;

&lt;p&gt;See the app in action:&lt;/p&gt;

&lt;p&gt;%[&lt;a href="https://www.youtube.com/watch?v=0c0C-6ygC2Y&amp;amp;ab_channel=Appsmith"&gt;https://www.youtube.com/watch?v=0c0C-6ygC2Y&amp;amp;ab_channel=Appsmith&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;According to Gokul, out of the 300 service requests received after deploying the app built on Appsmith, customer success team members could resolve 100 by themselves! Earlier, a customer would raise a request, following which the customer success personnel would add and flag it to the engineering team, who would then add it to their list of tasks, resolve the issue, indulge in back and forth. Then it would finally get resolved in approximately two to three days! Phew! Picture more than ten people following up with engineers who have workloads filled to the brim; such requests would invariably fall through the cracks. &lt;/p&gt;

&lt;p&gt;With Appsmith, Fyle has automated 30% of the total SRs created in this quarter alone by using Appsmith, saving valuable time and bandwidth for their engineering team to focus on growth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q38VVVDW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629724727754/Te3HRLcA3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q38VVVDW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629724727754/Te3HRLcA3.jpeg" alt="CS-Image2.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2z1B2CMa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629724740322/MWo5hwp4J.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2z1B2CMa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1629724740322/MWo5hwp4J.jpeg" alt="CS_Image_1.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An organization with the right idea about scaling up has a good understanding of the right foundations. Fyle is one such example. The 300 service requests, in all likelihood, will become 1000, 10000, and counting. At Fyle, by investing early on in an operations engineering team and relying on products that automate this, they are fully prepared for future growth and ensuring that their end customer is served better—at the same time, not burdening the wider engineering teams.&lt;/p&gt;

&lt;p&gt;We can’t wait to hear about what they build next! &lt;/p&gt;




&lt;p&gt;Liked what you read? Why not  &lt;a href="https://www.appsmith.com/blog/how-tiger-global-funded-fyle-empowered-their-customer-success-team-with-appsmith"&gt;take Appsmith for a spin&lt;/a&gt;? &lt;/p&gt;

</description>
      <category>startup</category>
    </item>
    <item>
      <title>Build Tools for Your Fitness Start-up with Appsmith</title>
      <dc:creator>Vishnupriya Bhandaram</dc:creator>
      <pubDate>Tue, 14 Sep 2021 06:46:29 +0000</pubDate>
      <link>https://dev.to/appsmith/build-tools-for-your-fitness-start-up-with-appsmith-34hn</link>
      <guid>https://dev.to/appsmith/build-tools-for-your-fitness-start-up-with-appsmith-34hn</guid>
      <description>&lt;p&gt;This week, we’re back to feature apps made by Appsmith’s newest team members! Each new team member has to make an app on Appsmith as part of the hazing welcoming ritual! 😬  We’re a fully remote distributed organization with colleagues in more than five countries, and this is a fun and educational way of onboarding new members onto the team. And of course, it makes sense for people working on making Appsmith better to use it, understand it, and know the framework’s shortcomings. These apps made during the onboarding process can range from functional to fun or straight-up silly! &lt;/p&gt;

&lt;p&gt;This week, we’re featuring our colleague Ashit Rath’s app. Ashit is a Sr. Frontend Engineer from Bhubaneswar in India. He has experience in building scalable web applications, and he loves to travel. You can follow his work here. &lt;/p&gt;

&lt;p&gt;Ashit decided to make a simple food nutrition app to list items, and it would show you the nutrition details. Ashit’s recipe analyzer is an excellent example of the range of applications you can make on Appsmith. &lt;/p&gt;

&lt;p&gt;During the app-making process, Ashit found the following things great about Appsmith: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Composing UI widgets was very intuitive&lt;/li&gt;
&lt;li&gt;Adding API data source was super easy&lt;/li&gt;
&lt;li&gt;Good performance overall&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next part of the blog, Ashit has listed the steps to build the recipe analyzer. &lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;This short tutorial uses the cloud version of Appsmith. However, you can always export and import Appsmith apps to different environments (cloud, self-hosted, local). The recommended way to use Appsmith is via Docker; follow the documentation here for detailed instructions if you want to build locally.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new account or sign in with an existing account, redirecting it to our dashboard. &lt;/li&gt;
&lt;li&gt;Click on Create New under your organization, and this will create a new Appsmith application.&lt;/li&gt;
&lt;li&gt;Rename the application to GitHub Organisation Dashboard (or any name you’d like) by simply double-clicking on the existing one.&lt;/li&gt;
&lt;li&gt;On the left, find the entity explorer; this is where you can manage all the widgets and data sources of the entire application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are three parts to building this Recipe Analyzer app: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;API for nutritional data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connecting the form to get the data from API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crunching numbers to show the nutrition&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  API for nutritional data
&lt;/h2&gt;

&lt;p&gt;‍&lt;br&gt;
The API that we have used here comes from &lt;a href="https://www.edamam.com/"&gt;Edamam&lt;/a&gt;. They have a robust API for any kind of food/recipe/ingredient level search.&lt;/p&gt;

&lt;p&gt;Sign up for their &lt;strong&gt;Nutrition Analysis API&lt;/strong&gt; as a &lt;strong&gt;Developer&lt;/strong&gt; account to try out without a subscription. The &lt;strong&gt;Developer&lt;/strong&gt; account might give out less information than it should, but it should be fine for our use case.&lt;/p&gt;

&lt;p&gt;Once signed up, we need to generate the API key from &lt;a href="https://developer.edamam.com/admin/applications"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click the "&lt;strong&gt;Create New Application&lt;/strong&gt;", &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select "&lt;strong&gt;Nutrition Analysis API"&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fill out the form and hit "&lt;strong&gt;Create Application&lt;/strong&gt;"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the application has been created; you would be greeted with the application API details page. Keep "&lt;strong&gt;Application Keys&lt;/strong&gt;" and "&lt;strong&gt;Application ID&lt;/strong&gt;" in place. We would need it in the next step.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Connecting the form to get the data from API
&lt;/h2&gt;

&lt;p&gt;‍&lt;br&gt;
We have the API key from the previous step, so now we will use that to make API calls to Edamam for our searches.&lt;/p&gt;

&lt;p&gt;Now head over to &lt;strong&gt;Appsmith&lt;/strong&gt; to create a data source.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a new Datasource by clicking the &lt;strong&gt;+ button&lt;/strong&gt; on the sidebar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click "&lt;strong&gt;Create new&lt;/strong&gt;" for a new data source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click "&lt;strong&gt;Create new API&lt;/strong&gt;"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change the API Name to &lt;strong&gt;nutrition_api,&lt;/strong&gt; it would be "Api1" by default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the "&lt;strong&gt;GET&lt;/strong&gt;", a dropdown should open up and select "&lt;strong&gt;POST&lt;/strong&gt;".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the following to the URL bar; replace &lt;strong&gt;&lt;/strong&gt;  with the "&lt;strong&gt;Application ID&lt;/strong&gt;"  and &lt;strong&gt;&lt;/strong&gt; with the "&lt;strong&gt;Application Keys"&lt;/strong&gt; that we got from the previous step &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;https://api.edamam.com/api/nutrition-details?app_id=&amp;lt;application id&amp;gt;&amp;amp;app_key=&amp;lt;application key&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This should create our data source for fetching the nutrition data.&lt;/p&gt;

&lt;p&gt;Let's create a new input and connect it to the data source to fetch.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Add a new text widget and name it as &lt;strong&gt;FoodInput&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resize the text widget according to need and add the following to the &lt;strong&gt;Placeholder&lt;/strong&gt; property&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;cup&lt;/span&gt; &lt;span class="nx"&gt;rice&lt;/span&gt;

&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nx"&gt;cup&lt;/span&gt; &lt;span class="nx"&gt;dal&lt;/span&gt;

&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="nx"&gt;gm&lt;/span&gt; &lt;span class="nx"&gt;chicken&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Now add a new button widget; on clicking this, we need to trigger an API request (to the API we added in the previous section).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the button widget properties and scroll down to &lt;strong&gt;Actions&lt;/strong&gt; section; there would be an &lt;strong&gt;onClick&lt;/strong&gt; property. Click the &lt;strong&gt;JS&lt;/strong&gt; and a blank text box should open up&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the following lines to the text box opened in the previous step&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;
&lt;span class="p"&gt;{{&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FoodInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;foodInputArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;FoodInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="nx"&gt;storeValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foodInputArray&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;foodInputArray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onSuccess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onFailure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

                &lt;span class="nx"&gt;showAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid quantity or name.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warning&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="nx"&gt;nutrition_api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onFailure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="nx"&gt;showAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Please enter something to analyze&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warning&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;})()&lt;/span&gt;

&lt;span class="p"&gt;}}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This code basically takes the &lt;strong&gt;FoodInput&lt;/strong&gt; text, modifies into proper API request format (array of string), stores the value in global storage using (&lt;strong&gt;setValue&lt;/strong&gt;) and triggers the &lt;strong&gt;nutrition_api&lt;/strong&gt; (nutrition_api.run)&lt;/p&gt;

&lt;p&gt;That's it; we have connected our API and our form to send requests and get our awesome nutrition data!.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;
&lt;h2&gt;
  
  
  Crunching numbers to show nutrition values
&lt;/h2&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;Now we create the part where we display the data from Edamam and show it in a neat format.&lt;/p&gt;

&lt;p&gt;All of the data points are calculated in a similar fashion, so we will demonstrate the only one just to get the idea behind it.&lt;/p&gt;

&lt;p&gt;Let's consider &lt;strong&gt;Total Fat,&lt;/strong&gt; the value for it can be derived by having the following code in the text property.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;
&lt;span class="p"&gt;{{(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;nutrition_api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalNutrients&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;FAT&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;



    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nutrition_api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalNutrients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FAT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;nutrition_api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalNutrients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FAT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;unit&lt;/span&gt;

&lt;span class="p"&gt;})()}}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This first checks if &lt;code&gt;totalNutrients.FAT.quantity&lt;/code&gt; exists or not; if not, then we display "-.” If it exists, then parse the value and append the unit to it&lt;/p&gt;

&lt;p&gt;So "10.12520"  becomes 10.12 gm (&lt;strong&gt;gm&lt;/strong&gt; comes from nutrition_api.data.totalNutrients.FAT.unit)&lt;/p&gt;

&lt;p&gt;Similarly, the &lt;strong&gt;Total Fat Daily Percentage&lt;/strong&gt;  can be displayed using the same logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;
&lt;span class="p"&gt;{{(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;Api1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;totalDaily&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;FAT&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;



    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Api1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalDaily&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FAT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="p"&gt;})()}}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We build the whole UI by adding similar code but changing the key from FAT to whatever macro/micronutrient is required to be shown.&lt;/p&gt;

&lt;p&gt;Wasn’t that simple? &lt;/p&gt;

&lt;p&gt;This recipe analyzer can be used as part of the many tools a fitness company/studio can give its members. We took the recipe analyzer a few steps further and envisioned the various other things to help a fledgling fitness studio tech up.&lt;/p&gt;

&lt;p&gt;See the screenshots below to get a better idea:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CZBK1Jyt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630047434525/Bd-mkwWE5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CZBK1Jyt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630047434525/Bd-mkwWE5.png" alt="Screenshot 2021-08-25 at 1.37.50 PM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can make a fully automated system to keep track of progress for clients, with our modal widget, you can automate payment collections etc. Just connect your data source to get started!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UP4CWvOJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630047445304/nfClc38eb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UP4CWvOJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1630047445304/nfClc38eb.png" alt="Screenshot 2021-08-25 at 1.38.52 PM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Connect your database from Airtable or Google Sheets and start building!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For a detailed tutorial on how to build dashboards and admin panels, &lt;a href="https://www.appsmith.com/blog/building-an-admin-panel-with-appsmith"&gt;follow this link&lt;/a&gt;. &lt;/p&gt;




&lt;p&gt;Have you made something using Appsmith? Write to me (&lt;a href="mailto:vishnupriya@appsmith.com"&gt;vishnupriya@appsmith.com&lt;/a&gt;), and I would love to feature you on our blog! If you’re interested in building an app on Appsmith,  &lt;a href="https://app.appsmith.com/user/signup?"&gt;sign up today&lt;/a&gt; . We have  &lt;a href="https://docs.appsmith.com/"&gt;docs&lt;/a&gt;, tutorials, and live help on our vibrant  &lt;a href="https://docs.appsmith.com/"&gt;Discord&lt;/a&gt;  community to help you along the way. So go ahead, put your ideas out there!&lt;/p&gt;

</description>
      <category>startup</category>
      <category>internaltools</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
