0:00 everybody for joining. We are going to 0:01 go ahead and get started here. So, uh, 0:03 welcome to our build better operations 0:05 build. We're going to spend some time 0:07 today, uh, talking about how to take 0:09 data that you might have trapped in 0:10 spreadsheets, uh, and use retool to help 0:13 your operations team be faster and more 0:14 efficient. Uh, I'm Kenan. I'm a 0:16 technical product marketing manager at 0:18 Retool. And I want to welcome you all to 0:20 our event. We had a ton of registrations 0:22 for today. So, thanks everybody for 0:23 registering and taking time out of your 0:25 day to join us here. Uh, like I 0:28 mentioned before, we have Christina and 0:29 Nate from Retool also running the room 0:31 and they'll you'll see them in the chat 0:33 uh answering questions from folks, but 0:35 we will have plenty of time for Q&A at 0:37 the end. So, if you do have questions u 0:39 or anything specifically that you're 0:40 hoping that we cover, uh please don't 0:42 hesitate to drop those in the chat and 0:44 either Nate or Christina will get to 0:45 those questions or we will get to them 0:47 at the end. Um so, yeah, over there on 0:50 the right hand sidebar is where we have 0:51 our chat and our Q&A section. So, feel 0:53 free to use those. Um and uh we'll just 0:56 get going here. Let's get started. So 0:58 what's the problem that we're going to 1:00 be talking about today? Well, operations 1:01 teams need data. They oftentimes have a 1:04 lot of it uh and they need a way to work 1:06 with it. And so this data is a lot of 1:08 times stored in a central database. um 1:11 where you know operations folks need to 1:14 ask engineering teams to run queries for 1:17 them or get specific slices of data that 1:19 they need and engineering team and the 1:21 security folks don't want to just give 1:23 read access to the entire database and 1:25 so what this ends up looking like is 1:26 oftent times uh requests come into 1:28 engineering for queries queries get run 1:31 turn into spreadsheets and then those 1:33 spreadsheets are kind of what's floating 1:34 around um you know things like those 1:37 spreadsheets being out of sync with 1:38 production data or you know you that a 1:41 spreadsheet that gets passed around and 1:42 modified and you end up with file names 1:44 like data final final you know things 1:46 like that. So we want to avoid all of 1:49 that and and look at how we can easily 1:51 kind of take that spreadsheet data turn 1:53 it back into an application that's 1:55 actually useful connect it to real live 1:57 functional data uh and how to kind of 1:59 manage that that build from beginning to 2:01 end. So while spreadsheets are 2:03 incredibly useful, they're not always 2:04 the best way to solve this kind of data 2:06 problem that operations teams have. And 2:09 so that's where retool comes in. Uh like 2:11 you can see here, retool is the fastest 2:13 way to build internal software. And 2:15 we're going to take a look at how that 2:17 happens uh in a few different ways. 2:19 Number one, we're going to look at 2:21 resources and basically where data comes 2:22 from when you're building with retool, 2:24 whether that's a spreadsheet or a 2:25 database you already own. Um the next 2:28 thing we're going to look at is kind of 2:29 the app builder experience. basically 2:30 the UI that we put on top of that data. 2:32 Uh and we're going to look at kind of 2:34 the workflow and the the developer 2:35 experience that ties all of those pieces 2:37 together. So the process of connecting 2:39 resources into your app. Uh looking at 2:41 those different slices of data in 2:43 different ways. Um and this is what 2:45 retool specifically helps with. 2:47 So the first thing when we start on any 2:49 project like this is to think about 2:50 where is our data right? So in retool 2:53 the concept data is represented by what 2:55 we call resources. Resources are 2:57 essentially any data source whether 2:59 that's an API connecting to a database 3:02 S3 bucket or things like retool database 3:04 and retool storage which we'll take a 3:06 look at a little bit later. Um basically 3:08 connecting your own data into retool is 3:10 what really makes it the most useful. We 3:12 have a ton of components and cool UI 3:14 things that you can build with. Uh but 3:16 where internal apps and tools get really 3:18 powerful is when you can connect your 3:19 own data. So if you already have a 3:22 Postgress database, a MySQL database, 3:24 anything like that, um you can very 3:26 easily connect those as resources uh 3:29 into re in retool. But where we see a 3:31 lot of folks get stuck is they want to 3:33 build an internal app. They have a 3:34 spreadsheet uh but they don't aren't 3:36 able to kind of go through the process 3:38 of you know getting that database 3:39 connection right away. Um and so that's 3:41 where we're going to start today. We are 3:43 going to show how retool can still be 3:44 useful um if you're starting with a 3:46 spreadsheet and it can be useful to kind 3:48 of build up that UI figure out what sort 3:50 of app you want to build and then once 3:52 you've got that app functional working 3:54 then you can actually without very many 3:57 changes hook that data up to your real 3:59 live database. So to support kind of 4:01 this spreadsheet to app model uh retool 4:05 offers a tool called retool db which is 4:07 essentially uh it's a managed postgress 4:09 database and you can create tables and 4:12 fields and modify the data like you 4:14 would with a spreadsheet. So let's start 4:16 there. We're going to go into our retal 4:19 DB instance and basically for the 4:22 purpose of this presentation uh we're 4:24 going to be looking at what an 4:25 operations team for a software company 4:27 might deal with where we have uh you 4:29 know various sales data and some 4:31 different affiliates who are you know 4:33 promoting our different products um with 4:36 their unique promo codes. We want to be 4:37 able to kind of slice that data up and 4:39 use it in a couple different ways. So 4:42 right now we have two uh CSV files that 4:45 we're going to import. So you can see if 4:46 you go up to retool DB here, you can 4:49 import CSV. We're going to import it 4:50 into a new table. And I'm just going to 4:53 grab our sales data. And you can see 4:56 that when we drop our CSV in here, it 4:58 automatically detects all of our 4:59 columns. It suggests field types and all 5:02 of these things. So really with very 5:04 little configuration, I can create a 5:07 table inside of REL DB with my CSV data. 5:11 So you see here that it's all imported. 5:13 And now that this is in Retool DB, if 5:15 you needed to kind of make any 5:16 modifications or adjustments, you could 5:18 do that in an interface that looks very 5:20 similar to a spreadsheet. So, it's an 5:22 interface you're definitely already 5:23 familiar with. Um, but that data is now 5:26 in here. So, we're going to do that one 5:27 more time for our kind of affiliate 5:30 promotional data. 5:33 And you can see again, it created the 5:35 fields that I needed from my CSV. And we 5:39 can just go ahead and create table. So 5:41 now we have two tables essentially our 5:43 sales data with information about you 5:45 know who's buying which of our our plans 5:47 and then we also have our table of 5:49 affiliates with a little bit more 5:50 information about them uh and their 5:52 particular promo code which will come in 5:54 handy a bit later. So now that our data 5:57 is inside of retool we actually need to 5:59 do something with it and build a UI for 6:01 it. So that's where our app builder 6:02 comes in. 6:04 This is retools app builder. So you can 6:06 see right now we're kind of starting out 6:07 with a blank canvas, but we do have all 6:10 of Retool's components over here that we 6:12 can add. So these are if you've ever 6:14 used a drag and drop kind of editor 6:16 before, we can start to do that. But 6:18 we're also going to take a look at how 6:19 this can be a whole lot more powerful 6:21 than just drag and drop. So we're going 6:23 to give some idea of what we're building 6:25 here. 6:26 Just a little title element, sales 6:28 dashboard. These text components do 6:30 support markdown. So, you can uh use any 6:32 sort of markdown styling you're familiar 6:34 with here, or you can just make it plain 6:36 text. 6:38 Next, we're going to use one of RET's 6:39 more powerful components, which is 6:41 called our table component. So, if we 6:43 drag and drop this table component here, 6:45 we can see that it gets populated with a 6:47 bunch of test data. Um, which is useful 6:50 to kind of see how the table component 6:52 works and how it's going to look in our 6:53 layout. But what's really powerful, like 6:55 we said, is when we connect our own data 6:56 to it. So, we can click on this badge 6:58 right here, connect your data. And this 7:01 is when we can look at creating a new 7:03 query to pull in our retail data. 7:08 So we're going to specify that we want 7:09 to use the retail database resource 7:13 and then we can write our query in here. 7:15 Let's just continue so we get this in a 7:17 full state. So now that we're quering 7:19 from retail DB, we can just run a select 7:22 star on our table, which if we bounce 7:26 back over here, we called it BA sales. 7:32 And if we save and run, you see that it 7:34 gives us a preview of our data here 7:39 and then it pulls the data into that 7:41 table. So it still has our kind of test 7:44 columns in here. here. So what we want 7:45 to do is basically just regenerate the 7:47 column names from the data that we 7:48 actually have so it matches our data and 7:51 just like that we have a table that is 7:54 pulling from uh retal DB. So we can 7:57 modify this a little bit. We don't 7:59 necessarily care about things like 8:01 displaying the ID even though that was 8:03 present in the database. So we can click 8:06 on the ID and set hidden to true. And we 8:10 can also do things like if we really 8:12 want the plan to be the first column 8:14 that people see, we can drag it. And 8:16 basically this table is entirely 8:18 modifiable, you can double click on 8:20 column headings um to adjust the spacing 8:24 of them just like you would in Excel or 8:26 any other spreadsheet tool. Uh let's say 8:28 we want, you know, our organization to 8:31 be next to our customer name. So we can 8:33 do a lot of tweaking in here to make the 8:36 data look the way we want it. Uh, and 8:38 because this is a fully interactive 8:40 table, after we've gotten it set up, we 8:43 can do things like sorting. So, if we 8:45 want to see like, you know, the most 8:46 recent purchase in here, we can do that. 8:49 Um, we also have the ability to use 8:52 these buttons down here, which you may 8:54 be familiar with these icons. This first 8:55 one is filter. So, if we wanted to, for 8:57 example, show only, you know, free plan 8:59 users, that would be a way to do that. 9:01 And then this table gets filtered down 9:03 to only uh free plan users. 9:12 So you can see this has similar elements 9:14 to what you might build in a 9:15 spreadsheet, but it's already a lot more 9:17 powerful. In addition to this kind of 9:18 filtering functionality, uh you can also 9:21 at any point download an actual file 9:23 version of this. So even though your 9:26 data is in retool and it's a little bit 9:27 more powerful in a spreadsheet, if you 9:28 do need to export it out to a 9:30 spreadsheet, uh you can do that very 9:32 easily from within this interface that 9:33 we're building. 9:36 Cool. So, let's make this a little bit 9:39 uh more useful. So, we have all of our 9:41 data here now. Um but one thing we can 9:44 also do is if we're saying, you know, we 9:46 have enterprise plan and free plan. 9:48 Let's say that something our operations 9:49 team is dealing with is the launch of a 9:51 new plan called the business plan. So, 9:53 you can see that we have a plan that is 9:57 business in here. We have some customers 9:59 on it, but we want to look and be able 10:00 to very quickly see like what the 10:02 adoption is looking like on this. uh if 10:04 people are using it, if people are 10:06 signing up for it, um that sort of 10:08 thing. So what we can do is we can use 10:11 another one of RTO's components, the 10:13 chart component. 10:15 And if we pull that in here, it retool 10:17 will do its best to guess what sort of 10:19 data we want. Um which based on kind of 10:22 the queries we've set up and all that 10:23 stuff, but this is does not look like 10:26 kind of the data that we want. So what 10:28 we're going to do is we're going to say 10:30 let's look at a pie chart instead. Um, 10:32 and instead of the uh labels here for 10:36 the date, we're going to do uh plan. So, 10:39 just in a couple clicks, this gives us a 10:41 very nice visual breakdown of uh how our 10:45 different plans are are set up and 10:47 distributed across our customers. So, we 10:48 can add a title here to say that as 10:51 well. 10:53 But you can see that enterprise, you 10:54 know, is about 40% of our customers here 10:56 in this example. business is a little 10:58 bit less with 33 and our free plan is 11:01 only 27% of users and we just kind of 11:04 took the defaults here. But for example, 11:05 if we wanted to really call out the 11:07 business plan um you know we could go in 11:09 here and say no we really want that to 11:11 be orange you can change all these 11:12 colors and um use any of these elements 11:15 of the UI that are helpful uh to kind of 11:17 customize this chart to make it useful. 11:20 The other thing that you can do is if 11:21 you really need to go further um the 11:24 graphing and charting underneath is 11:26 using plotly.js JS and so uh if you want 11:29 to write the JSON yourself or get it 11:31 generated by some other tool uh you can 11:33 just copy paste that into here uh and 11:35 that JSON will be what's used to 11:38 generate your chart. So the UI is a 11:40 really quick way to get started. If you 11:41 need even more customability you can 11:42 access all the features of plotly uh 11:44 using the plot JSON. 11:46 Great. So now we have a table that is 11:48 gen has been generated from our 11:49 spreadsheet. We can filter it, we can 11:51 download it, and we also have a 11:53 breakdown of exactly who's using uh 11:56 which which plan. So we see that, you 11:58 know, the usage is actually pretty even. 11:59 Uh it looks like our our free plan is is 12:02 the least, but um you know, we can 12:04 easily see over time, you know, as more 12:06 data comes in how this starts to change, 12:08 which uh is is pretty helpful. And so 12:12 already this is becoming a pretty useful 12:14 dashboard. um especially when you know 12:17 taking into account that multiple people 12:19 can access this. You can share this with 12:20 your team uh and everybody can kind of 12:23 centralize on this sort of view. So 12:25 you're not worrying about you know 12:27 passing different spreadsheet files back 12:28 and forth or you know wondering if 12:31 someone has the latest updated version 12:32 of the data once all this data is in 12:35 retool and this this dashboard is you 12:36 know updated in essentially real time as 12:38 new data comes in uh it becomes even 12:40 more useful. 12:43 So, let's start to take a look at some 12:44 of this affiliate data, right? We have 12:46 all this these sales here that some of 12:48 them have promotional codes associated 12:49 with them, etc. Uh, and one of the 12:52 really powerful things that you can do 12:53 in Retool that you can't necessarily do 12:55 as easily in a spreadsheet, is respond 12:57 to events that happen. So, we do these 13:00 through something called event handlers 13:01 in Retool. And we're going to take a 13:02 look at exactly how that works. What we 13:04 want to do here is when we click on a 13:07 particular uh transaction row in our 13:10 table, we want some information about 13:12 this affiliate which we can pull from uh 13:14 the other table that we imported to 13:16 retal DB. So let's do that here. We're 13:19 just going to put a text element here 13:22 and we're going to call this affiliate 13:24 info. 13:29 Uh let's make it a little bit bigger so 13:31 we can see what's going on here. 13:34 Cool. 13:36 And then we're going to use one of 13:38 Retool's components that's called key 13:40 value. Basically, this is useful for 13:42 displaying kind of a heading and then a 13:43 piece of data um and then another 13:46 heading and another piece of data. So, 13:47 you can see again it's populated with 13:48 some sample content. We're going to 13:50 clear that out for now and we're going 13:52 to write a new query. 13:55 So, this query here we're going to call 13:57 get sales data. That's the one we 13:58 already have written. But we need a new 14:00 query now for getting the selected 14:04 affiliate. 14:07 And what's cool in retool is that even 14:09 though there is a ton of capability 14:11 that's accessible just by dragging and 14:13 dropping UI using the pre-built 14:14 components, you can also basically write 14:16 code anywhere and extend these 14:18 components in such a way um that they 14:21 work for you and not you know not 14:23 something you're having to fight 14:24 against. So in this case what we want to 14:26 do is we want to run a database query to 14:28 grab uh data from the affiliates table 14:31 which is here and it shows more 14:33 information about the different 14:34 affiliates. Uh but we only want to use 14:36 the affiliate that is in the selected 14:39 row. So what we can do is we can say 14:42 select star from uh BA promo which it 14:46 autofills that as a table name because 14:47 we know that's there. But again getting 14:50 all of the data from the table is not 14:52 exactly what we want. So what we can say 14:55 is where and then affiliate 14:59 promo code equals and this is where we 15:03 can pull in 15:04 anywhere in when these double curly 15:06 brackets is something else from some 15:07 other retail component or something in 15:10 the UI builder. So what we can do is we 15:12 can say table one dot selected row 15:17 and then you can see it's kind of 15:18 showing us what our selection is here. 15:21 And so we want to ask it for the 15:24 promotional code. So basically grab the 15:26 affiliate from the promo table where the 15:29 promo code is whatever's in this column 15:31 here. 15:33 So if we save and run this query, you 15:35 can see nothing is is there because 15:37 there's no promo code. But when we pick 15:39 a row that has a promo code, you see 15:41 that, okay, now we're actually pulling 15:43 in our affiliate data, which is pretty 15:44 cool. So, what we can do then is go back 15:46 to our key value and say we really want 15:50 the data from our get selected affiliate 15:52 query to be populated into here. And so, 15:55 you can see that now it's pulling this 15:57 affiliate data. And if we click 16:01 another row with an affiliate, it 16:03 actually reruns. And so you can see that 16:06 this query right here is set to run when 16:08 inputs change. Which means retool 16:09 automatically knows to watch this table 16:12 one selected row. And when a different 16:14 row is selected, it automatically reruns 16:16 the query and automatically populates 16:18 this new component. There's no concept 16:20 of having to manually manage state or 16:22 having to manually kind of rerun or 16:24 reflow things. Um because retool can 16:27 handle that all for you. You can set up 16:29 relatively complicated dependencies 16:30 actually between components and queries 16:32 and those things will automatically run. 16:34 And again this component we we wrote 16:36 some code to get this populated but now 16:38 we can go back to just like we did 16:40 before. If we wanted to, for example, 16:42 you know, hide this ID column, we could 16:44 do that. 16:46 Reorder these however we wanted to. Um 16:48 and and all this is is kind of possible 16:50 inside the UI builder now, but we've 16:53 written some code to to get that going. 16:55 So another thing that is useful for this 16:58 kind of logic is like cleaning up when 17:00 for example if we don't have a component 17:02 selected obviously we won't have any 17:05 data in the key value 17:07 but we probably don't want this uh text 17:11 to display either. So this hidden 17:13 attribute which we've used a couple 17:14 times already today in addition to just 17:16 being true or false you can use our 17:18 double curly brackets again to have a 17:22 condition that's based on a variable. So 17:24 for example we could say you know table 17:26 one dot selected row 17:31 dot id right so if there is an ID we 17:34 want this to show we actually want the 17:35 inverse of that so if there's no ID we 17:38 want it to be uh hidden. 17:48 So basically you can see that now it is 17:50 conditional the logic is conditional on 17:52 whether uh you know the currently 17:56 selected row has a promotional code 17:58 which is nice because that just lets our 18:00 interface be a little bit cleaner um and 18:02 only 18:03 display when that information is 18:05 relevant. So the hidden attribute is not 18:08 just the true or false. any any variable 18:10 or any retail attribute that evaluates 18:12 to a a true or false kind of boolean as 18:14 far as JavaScript is concerned can power 18:17 this hidden attribute which makes it 18:18 really powerful. 18:22 So now we've got kind of a basic readout 18:24 of our affiliate info. Um but really 18:26 what would be more interesting here is 18:28 to if we could get you know sort of a 18:30 leaderboard of okay what who are the top 18:32 affiliates? how are they uh you know 18:34 driving 18:36 purchases of our different plans. So 18:39 let's take a look at that. Um 18:42 let's get rid of this affiliate info 18:44 stuff for now because we want to uh 18:47 really be able to show a bunch of our 18:49 affiliate data here. 18:52 So again, now that all these components 18:53 are in place and they're actually 18:54 pulling data, you can spend kind of as 18:56 much time as you'd like reordering 18:58 things and kind of getting the layout 18:59 the way you want it to. Um, and it all 19:03 just kind of works and refflows. So, 19:04 we'll just adjust this a little bit 19:06 here. We will do our reverse 19:08 chronological search. Cool. And so, we 19:11 are ready to put another table in here. 19:16 So, what we want to do here is we want 19:19 to build uh like an affiliate 19:21 leaderboard. Basically, rank the 19:23 affiliates based on u you know how many 19:26 sales each of these kind of individual 19:28 promotional codes is driving. And so 19:31 what we can do is we can write a query 19:34 that does that. We go back over here to 19:36 our query editor. We can add a new 19:39 query, which again we wanted to pull 19:41 from retold DB. 19:45 And this is a slightly more complex 19:47 query than the one we've written before. 19:48 So I'm just going to copy paste this in 19:50 here. We want to make sure that our 19:53 table names line up. 19:57 And if we save and run, we can see that 19:59 now we have our affiliates ranked by how 20:04 many times their particular promotional 20:06 code uh was used. So we're going to call 20:10 this uh query rank affiliates. 20:15 And we can use our new table here 20:21 to display the results of this query. 20:26 Right? So we have our the promotional 20:28 code, the affiliate name, and then the 20:29 usage count, right? So again, this is 20:32 the same table component we've used 20:34 before. So if we want to, you know, sort 20:36 this the other way and see, you know, 20:37 which of the affiliates are, you know, 20:39 referring less less purchases to us than 20:42 we would expect, we can rank it that 20:44 way, too. But again, this is kind of 20:46 just like these two different or two 20:48 different slices of looking at the same 20:49 data. Um, and we can do all of that 20:52 inside of retool. Look at data in kind 20:54 of any way we want. And again, if this 20:56 is useful to certain people on the team, 20:58 uh they can download this as a CSV or 21:00 filter by, you know, only affiliates 21:02 that they that they care about and 21:04 things like that. Um so you could do 21:06 something like, you know, only filter by 21:07 where usage count is 21:10 greater than three and that trims down 21:12 your table pretty significantly. Um, but 21:15 this is just again another way you can 21:16 kind of slice and dice this data um to 21:20 make it useful to people who are trying 21:21 to get actual information out of your 21:23 data and insights out of your data as 21:25 opposed to spending all day scrolling 21:27 through and staring at CSVs. 21:31 So, there's a lot more that you could do 21:32 here now that you have this um this 21:35 dashboard built out. Like again, like I 21:36 mentioned, you can really one of the 21:38 most powerful things you can do is 21:39 invite your other team members. So that 21:42 kind of keeps everyone on the same page 21:43 in terms of knowing what data to look 21:45 at, where the data is, and where it 21:46 lives. Um, and now again that you have 21:49 this UI built, uh, this is the time 21:52 where a lot of times we see people use a 21:54 tool like retual DB to get going very 21:56 quickly and figure out what kind of tool 21:59 they need to build. But very easily you 22:01 could take these table and these queries 22:03 and instead of querying retal DB, uh, 22:06 you could hook it up to your own, you 22:07 know, MySQL or Postgress instance. Um, 22:10 and that would make these tables even 22:12 more powerful because it'd be pulling in 22:13 like real-time sales data and um, 22:16 refreshing kind of as soon as there was 22:18 new data available. And so you can build 22:21 these kind of relatively complex like 22:23 real-time dashboards um, after you've 22:25 gotten going and figured out what you 22:27 need to build and how you want it to 22:28 look. And so, um, there's a lot more 22:30 that that you can do here, but I hope 22:32 this has been a little bit helpful just 22:34 to see kind of how you can very quickly 22:35 get going, uh, with spreadsheets, use 22:38 retools, built-in components to make 22:40 that data a little bit more useful and 22:41 helpful, um, and display it and and 22:44 slice it up in a few different ways. So, 22:47 um, again, we want to leave some time 22:50 for Q&A, so I think we're going to move 22:52 into that now. But, um, yeah, if you 22:54 have any kind of questions that we 22:55 didn't cover, please leave them in the 22:57 chat. Um, and I I hope this is helpful. 22:59 So, we will jump into Q&A. 23:04 Let's see. So, 23:07 Matthew asked, "Any tips on this use 23:08 case? Should I create one single app for 23:11 multiple clients or should I create a 23:12 separate app for each? Each client has 23:14 the same data connectors. The queries 23:16 are the same and I just need to be able 23:19 to dynamically change the resource based 23:21 on which client logged in." Yes, that's 23:23 a good question. So there's a couple 23:24 different ways you can think about to 23:26 architect that depending on honestly a 23:28 lot of it depends on your preference. So 23:30 if it's easier for you to create 23:32 different apps for different clients 23:34 just to keep things separate. Uh retool 23:37 does offer you know folders and things 23:39 outside of the app builder interface to 23:41 keep things organized for you. Um, and 23:43 also you can um take queries that you've 23:47 written and extract them to retools 23:50 query library which basically gives you 23:51 a a common set of queries to pull from. 23:54 So you don't have to reinvent the wheel 23:55 for every app. So if that's kind of how 23:57 your brain works and and what you want 23:58 to how you want to break things up. Um 24:01 you won't necessarily have to kind of 24:03 reinvent the wheel with every one of 24:04 those apps. You'll still be able to have 24:06 the concept of shared logic. Um you can 24:09 basically create groups of components 24:11 known as modules. uh in retool and reuse 24:13 those across apps. So there's definitely 24:16 an element of that of the shared logic 24:18 that you can uh reuse there and that can 24:20 keep it a little bit simpler um if 24:22 resources are changing kind of per per 24:25 application. 24:29 Uh Michael asks, can you import CSV 24:31 files directly from an S3 bucket? uh at 24:34 the moment I don't believe so but if you 24:37 do have kind of ETL needs like that 24:40 where you want to like take data in from 24:42 some other source and transform it a bit 24:44 before uh it gets into retool uh retool 24:48 does have a solution called workflows 24:50 for that which basically lets you um 24:54 do whatever you need to with uh you know 24:57 visual kind of steps in here. So um you 25:00 know taking data from S3 doing any sort 25:03 of transformations that are necessary 25:04 and then importing it uh into a retal DB 25:08 like we showed here uh would be a great 25:10 way to use uh workflows if you do need 25:12 to pull from S3 or some other data 25:14 source like that. 25:17 Can you speak to uh Benjamin asked can 25:19 you speak to the merits of doing the 25:20 approach you've overviewed here versus 25:22 using something like Google Sheets to be 25:24 able to also have real-time data 25:25 available within a spreadsheet tool. Uh 25:28 yeah, Google Sheets is definitely 25:29 another option for doing something like 25:30 this. Um especially if you know what you 25:33 need is basically a chart and uh some 25:36 data next to it. Um I think that you 25:39 know where retool becomes a much better 25:42 option than Google Sheets is talking 25:43 about some of the things like going that 25:44 we're talking about going beyond uh this 25:47 pretty basic example. So, you know, if 25:49 you want to, you know, push this data 25:51 out to Slack or take in data from more 25:54 than just a database, if you want to 25:55 start incorporating things like data 25:57 from Salesforce so that you could, you 25:58 know, know who this organization is, how 26:01 much, you know, they've talked to the 26:02 sales team, etc., um, incorporating more 26:05 of those data sources and things like 26:07 that, um, is something that Retool is 26:08 really great at and does out of the box, 26:10 whereas you would have a much more 26:12 difficult time doing something like 26:13 that, uh, in Google Sheets. 26:16 Cool. 26:18 Uh, can ask, could tools be created in a 26:21 B2B multi-tenant setting where 26:23 individual users tied different tenants 26:25 could be shown data from their own 26:27 linked data sources? Yeah, so um this is 26:30 something that is actually uh going to 26:32 we're going to be pushing out very soon. 26:35 Um we're launching the concept of of 26:37 retool portals which basically gives you 26:39 that sort of multi-tenant user specific 26:41 experience. Um but already in retool you 26:44 can use things like um that conditional 26:47 logic inside of curly braces that we 26:49 talked about earlier um to kind of 26:51 personalize this view for specific folks 26:54 uh based on you know who the users are 26:55 that are logged in. Um so if you're 26:58 talking about you know specific users 27:00 that are internal to your company um 27:02 being able to view data that's specific 27:04 to them uh you can definitely already do 27:06 that in retail. if you're talking about 27:08 wanting to, you know, invite external 27:10 users and let them see data. Um, that's 27:13 something that's that we're going to be 27:14 able to talk about more very soon. 27:18 Pier asks, "What will be the difference 27:19 between using components, no code 27:21 filters, and updating our query with the 27:23 proper wear argument?" Um, it's a good 27:27 question and I don't know that I'll be 27:28 able to address all of that, but I hope 27:30 to address a lot of it. So the table 27:31 component like as it drops in um is kind 27:34 of gives you the default query and by 27:36 default it shows everything that you've 27:38 written in the query here. So if you 27:40 have like a particular slice of the data 27:44 that you want to show by default when 27:46 this component loads that's probably 27:47 when you would want to write it into the 27:49 query. Um, if you don't really know what 27:52 people are going to want to see and you 27:53 want to just write the query to be a 27:55 little bit more general, but let people 27:57 see what data is kind of useful to them, 28:00 that's where using the filters, 28:02 especially for people who aren't 28:03 familiar with writing SQL, um, is really 28:05 helpful. Like, for example, you could 28:07 put, you know, plan includes free, like 28:10 we talked about. You could write this 28:11 into the query, um, but that would kind 28:13 of limit the output of this table to 28:15 only the free plan, which if that's what 28:16 you wanted, that would be fine. Uh, but 28:18 if you want to make it a little more 28:19 flexible and let people do the filtering 28:20 themselves, that's where uh, using the 28:22 filtering comes in. 28:26 Stephanie asked, can you upload a CSV 28:28 file via the upload button, format the 28:30 CSV via the table component, and send it 28:32 automatically to update the retool 28:34 database? Um, so I think what you're 28:36 talking about is using kind of our, uh, 28:39 our import CSV like we did here, um, and 28:42 format it via the table component and 28:44 then send it back to retail database. if 28:46 you need to format the data or change 28:49 the data once you've imported it. Uh 28:51 this kind of retool retool DB interface 28:53 is where you're going to want to do 28:54 that. Um I'm not quite sure what you're 28:57 talking about for through formatting it 29:00 via the table component, but um you can 29:02 edit and do any sort of data updates you 29:05 need to here after you import it. Uh and 29:07 then there's no separate sync step like 29:09 as soon as you make a change here and 29:10 hit save uh it's updated in retrieb 29:13 which would then uh reflect here any 29:15 components that were using that 29:16 underlying data automatically. 29:21 Matthew asked does the hidden feature 29:22 improve the app performance in any way? 29:25 Um I think it would really depend on 29:27 like how many components you have on the 29:29 page as to whether you would notice it. 29:31 Um but yeah, it does, you know, remove 29:33 it from the the render flow of the of 29:36 the app itself. And so, um in addition 29:39 to, you know, just visually cleaning it 29:41 up, uh there would probably be some 29:42 performance improvement, but uh it would 29:44 be difficult to say like how many you 29:46 need a lot of components on the page to 29:48 to notice that probably. Um the 29:50 engineering team behind Retool spends a 29:52 lot of time working on kind of 29:53 performance improvements for all 29:55 components across the board. So um you 29:58 know I would be surprised if if you 29:59 would notice the performance improvement 30:01 from hiding one component but it it 30:03 definitely helps to to have it hidden. 30:07 Uh would the same flow follow if we were 30:09 to use air table as a database? Yeah. So 30:11 basically um the idea behind using a 30:13 database in retool and displaying it in 30:15 a table component. The idea of retool 30:17 resources is that you can use 30:19 essentially any API database or any 30:22 other backend that you might have uh to 30:25 populate these sorts of dashboards. Um 30:28 so you know again you would just need to 30:29 slightly modify the query um to pull 30:32 from air tableable as opposed to retool 30:34 database. Uh retool as we mentioned here 30:37 with resources we have a lot of 30:39 connections and integrations to 30:40 resources already. Um, but if there's 30:43 one that you need to use that's not 30:45 supported as long as it has uh an API or 30:48 some other way that you can connect to 30:49 it, um, you can you can do that in 30:51 retool. You can just hit it as a rest 30:53 API or as a SOAP API or something 30:55 similar that it would be a very similar 30:57 flow. Um, you would just need to update 31:01 your queries to connect to air table 31:03 instead of uh pulling from ret. 31:07 Alternatively, if you wanted to do 31:09 something like with the the like retool 31:12 workflows piece, um you could write a 31:14 workflow that imported data from Air 31:16 Table and synced it into Reut DB every 31:18 every so often um if you didn't want to 31:20 connect to Air Table directly. That was 31:22 that's an option you could have as well. 31:26 Colleen asks, "If you have sheets that 31:28 are essentially relational, can retool 31:30 automatically set up those relationships 31:31 or do you need to handle setting IDs 31:32 prior to importing the CSVs?" Good 31:35 question. Um, yeah, the retool does its 31:37 best to guess at kind of how your data 31:39 is set up. So, like like you saw when we 31:42 imported uh the CSVs here, it knew like 31:45 what kind of data types things were. It 31:47 kind of looked at the CSVs that way. Um, 31:49 as far as creating relations dynamically 31:52 between data that you've imported, um, I 31:55 don't believe we support that right now. 31:56 What I will say, something that might 31:58 interest you, um, is you'll notice that, 32:00 uh, when we were doing these queries 32:02 here, there's this little ask AI widget 32:04 down here. And the ask AI basically pops 32:07 up like, okay, you can ask it whatever 32:09 you want it to do. Um, and it is aware 32:12 of all your various data tables and 32:15 columns and the kind of the schema of 32:17 your data, how it looks. And so it can 32:19 help you create those uh, relations and 32:21 do things like, you know, our affiliate 32:23 table query. um it could look at okay we 32:26 have sales data and affiliate data and I 32:27 want to correlate them um and I actually 32:29 used it to help me uh write this 32:32 relatively complex query here. So that's 32:35 definitely something to look into um if 32:37 you need some help uh putting your 32:39 queries together and and all you have is 32:41 flat CSV data. Another another reason to 32:44 use something like retool or for just 32:45 using CSVs is that you know those 32:47 relationships are a little bit harder to 32:49 quantify sometimes if it's just a CSV 32:51 file or a set of CSV files. And so 32:53 getting it into something that's an 32:54 actual database um like Rachel DB is a 32:57 way to go. But yeah, definitely take a 32:58 look at that um that ask feature if you 33:01 need help kind of defining those 33:02 relationships. 33:07 Um yeah, Bison asks, "Is it more or less 33:09 difficult to use an API as a data source 33:11 instead of a database? Do you have any 33:12 recommendations for resources on how to 33:14 do this?" Um I think it just depends 33:16 like your comfort with making REST API 33:18 calls, whether there's already a retool 33:20 connector for it. um and just like what 33:23 you're actually trying to access. Um so 33:27 you know the obviously like if you're 33:29 comfortable writing SQL like using retal 33:32 DB is relatively straightforward. Um as 33:34 you saw kind of most of the output of 33:37 retail queries is usually some type of 33:39 array or object. So that's very similar 33:42 to what database uh sorry what APIs 33:45 return as well. So, as far as like the 33:48 components to um use a database response 33:51 versus an API response, there's not a 33:53 ton of difference. Um, one thing I will 33:55 notice is one thing I will say is that 33:57 if your API doesn't give you uh an array 34:00 similar to what the table component is 34:02 expecting, you can use this transform 34:04 results piece here where you can 34:07 actually write whatever sort of 34:09 transformations in JavaScript that you 34:10 want to. So in addition to what you get 34:13 back from your API call or database 34:15 query, you can transform those results 34:18 into whatever shape you need them to be 34:21 to show up in the in the component that 34:22 you rely on. So um it depends on a few 34:25 different things, notably like whether 34:27 there's a built-in retail connection for 34:28 it. Um how like what sort of quality of 34:32 data the API returns and things like 34:33 that. But um the idea is that uh it 34:36 should be a pretty seamless and and 34:38 similar experience no matter where 34:40 you're pulling. uh just because of how 34:41 you can write things in the query 34:43 interface. 34:47 Cool. Um John says, "How do you choose 34:49 which roles and users have the ability 34:51 to access this page?" Yeah, so that's a 34:53 good question. Um it's a little bit I 34:55 think outside of the scope of what we're 34:56 showing here, but basically u you know 34:58 retool has lots of different controls 35:00 and permissioning for um you know to 35:03 basically get as granular as you want 35:04 around who has access to certain apps, 35:07 who has access to run certain queries um 35:10 things like that. So it's definitely 35:11 something that you can configure um when 35:14 you once you have your app built out uh 35:17 and something that you know you can 35:19 build organizational rules and things 35:20 around as well so that you know the 35:22 people who need to see your information 35:24 can uh and people you don't want to have 35:26 access to it don't have that ability. 35:31 Oscar asks yeah what about data uploads 35:33 from retool other systems? Are there 35:34 built-in connectors? Yeah, so we we 35:35 covered this a little bit but there 35:36 definitely are. Um you can go to the the 35:39 retool docs on resources to see uh what 35:42 we have here in terms of resources that 35:44 you can connect to. Uh but there are 35:47 yeah a ton of different integrations 35:48 that we have out of the box. And again 35:51 uh if an integration you need is not 35:53 something we currently support. Um as 35:55 long as that tool has an API you can 35:57 make a REST API or a SOAP API request to 35:59 that uh to pull in that as a data 36:01 source. 36:05 Andrew says, "Can you set up event hooks 36:07 such as notifications in Slack when your 36:09 app database gets updated or deleted?" 36:11 Yeah, so uh we do have a Slack uh 36:14 connector that you can use to get 36:16 notifications about things that happen 36:17 in the app. Whether that's, you know, 36:19 having a button that someone can click 36:21 here to manually send a notification 36:22 message um you know or just basically 36:26 responding to events that happen. Uh you 36:29 can do those through event handlers here 36:32 in retail which we didn't really go into 36:34 but you can basically uh respond to any 36:37 sort of event in your app. Um and you 36:41 can either show stuff in your app, you 36:43 can run scripts, you can control 36:45 components, uh control queries, which is 36:48 what we would need to use to, you know, 36:49 send a message into Slack. Uh and even 36:52 something as simple as, you know, making 36:54 a a nice little confetti image, which is 36:56 kind of cool. So now every time we 36:57 select a row, we see that event happens 36:59 uh and we get something on the screen. 37:01 So you can definitely connect things 37:03 essentially in any configuration that 37:04 you'd like. Um and Slack is a connect 37:06 that we support and use all the time for 37:09 stuff like that. 37:13 Have you ever had customers create a 37:15 complex single page app with no page 37:17 reloads by using modules and changing 37:18 component views instead of creating 37:20 individual apps and linking those apps 37:22 via the nav? Um yeah. Yeah. So the 37:24 question basically boils down to like uh 37:26 could you do a very complex app with no 37:28 page reload just by hiding joining 37:30 components. Um and you definitely could. 37:33 I think um you know you'd want to just 37:36 make sure that you know all the various 37:39 queries and stuff running in the 37:40 background that you were very efficient 37:41 about um you know only running queries 37:44 when you really need to. If you add more 37:46 components that run queries 37:48 automatically you make those 37:49 dependencies more complicated. uh you 37:51 know that's when like you start to see 37:52 some performance hits because things are 37:54 running when they don't need to etc. But 37:56 um if you're really you know observant 37:58 about that and diligent about that you 37:59 definitely could uh have a single page 38:01 app with with no um kind of navigation 38:04 component. Uh I will say if if you 38:06 notice before when we had those 38:08 components that were hidden um when you 38:10 do have the have different components 38:13 hidden um you know it does kind of make 38:16 the clickable area to select this 38:17 component down to just that one little 38:19 tab there. So if you had a ton of 38:20 components that were stacked on top of 38:22 each other um you know you you may start 38:25 to have issues as a builder of this 38:27 application like getting clicking on the 38:29 component that you want selecting it 38:31 etc. Um but it's definitely something 38:33 you could do. I will also say that uh 38:35 the folks on the engineering team are 38:37 continuing to you know make navigating 38:39 between rettool apps and having the the 38:41 concept of like multi-page apps uh much 38:44 more performant and you know continue to 38:46 make improvements there. So, um, you 38:49 know, I do think that makes the case a 38:50 bit stronger for wanting to divide 38:51 things up by pages. But, uh, if you 38:53 wanted to have, you know, a bunch of 38:55 components on a single page and just 38:56 kind of hide show them, you definitely 38:57 could. Uh, but just make sure you know 38:59 you're you're looking at what queries 39:01 are running and things that are running 39:02 automatically and you have kind of a 39:04 good handle on that. 39:07 Um, cool. Yeah, I think uh, we've got a 39:10 couple more here. 39:13 If you create, Nick asks, if you create 39:15 a module of a set of components, does 39:17 that inherently include the queries 39:19 those components are powered by? Um, so 39:22 we talked about module, we just briefly 39:24 touched on modules as basically a 39:26 reusable um combination of components. 39:28 So this is most frequently used in 39:29 things like building a navigation bar 39:31 that you want to include in like every 39:33 app that's connected to that navigation 39:34 bar. Um, 39:37 and so you can definitely do that 39:39 because they're are groups of 39:40 components. Um yeah, the queries and 39:43 everything else that powers those 39:44 individual components come with them. So 39:46 um it's really best for like when you 39:49 want to create an entirely reusable 39:51 section of your app. Um so that you're 39:54 not having to duplicate logic and 39:55 duplicate queries and things like that 39:57 uh across multiple different spaces. 40:01 Let's see. Um is there a way to create a 40:04 second page that would display all of a 40:06 single customer's details when you 40:07 select one from the top table? For sure. 40:09 Um, you could create that as a separate 40:11 app where you could click in and like 40:12 view customer details. Uh, we also, like 40:16 I said, have a bunch of different 40:18 components that can let you do things 40:20 like that. So, we do have, uh, a modal 40:23 component where you could pop something 40:25 over the top that kind of shows that. 40:26 You could also have a sidebar that 40:29 slides out from the side. Uh, that's 40:30 kind of that that detail component. So, 40:32 that's that drawer, this drawer frame 40:34 here, and the the modal frame. So you 40:37 see that if we have the drawer frame and 40:38 we drag it here, this is where we could 40:40 you know have we could do our our same 40:42 kind of logic around um you know 40:45 selected selected customer details etc. 40:48 Um 40:50 and so you know we could have this 40:52 basically clicking on a row you could 40:54 have it trigger this slide out and and 40:56 do you know more detailed data views in 40:58 there. So the modal and the um the 41:01 sidebar frame are are pretty good ways 41:03 to accomplish that. 41:06 Cool. And then we've got time for just a 41:08 couple more here. Um, 41:14 is there any single solution to create a 41:16 flexible view between mobile and the web 41:19 except check the mobile view in every 41:20 component? That's a good question and 41:22 and something the team is definitely 41:23 working on and taking a look at. Um, 41:26 retool right now kind of has two 41:28 separate products. One which is RTL 41:30 mobile. So if you're looking to create 41:32 mobile applications and that sort of 41:33 stuff uh that use things like retal DB 41:36 and you love this kind of tool building 41:37 process but it needs to be a mobile app 41:39 um you can use retail mobile for that. 41:41 For the kind of web desktop apps uh we 41:44 do have as you noted like kind of mobile 41:47 toggles and things in here to look at 41:49 like how things look on mobile to hide 41:51 show certain things on mobile. Um, but 41:53 that's that is something you kind of 41:54 have to go through and and build that 41:56 experience uh w with that kind of mobile 41:59 view in mind. Uh, there's no way to to 42:01 do that in in bulk right now. 42:07 Um, yeah. So, two more questions here. 42:10 One, what are best practices to clean 42:12 and normalize data and apply a unified 42:14 taxonomy from multiple sources into 42:15 retool? Um, yeah, this is definitely 42:17 where I would recommend something like 42:19 retool workflows where uh, you know, if 42:21 data is coming from a bunch of different 42:22 sources. Uh, you want to make sure that, 42:24 you know, it's going to fit into 42:26 whatever schema you've uh, introduced 42:28 into your database. And so that probably 42:30 needs a little bit more uh, like ETL 42:33 sort of motion before it's ready to be 42:35 used and retool. So, um, that's not a 42:38 retool specific problem. There's 42:39 definitely, you know, lots of lots of 42:41 resources online to um, look at kind of 42:44 how you want to set up your data schema. 42:46 Um, but once you have that schema set 42:47 up, whether it's in retail DB or some 42:49 other database, um, if you're pulling 42:51 data from multiple sources that don't 42:53 quite all match that schema, that's 42:55 where I would suggest something like 42:56 retail workflows to, uh, get that data 42:58 all in the same shape before it comes 43:00 in. 43:03 And we'll do the last one here. New to 43:05 retool here, welcome. Uh, are there any 43:07 outgoing connections? So, for example, 43:08 once the database is populated, can 43:10 these lines be used to create a Jira 43:11 ticket? Absolutely. So, again, we we 43:14 covered this a little bit. Um but 43:16 queries are not just uh inbound. You can 43:19 also have queries that do things uh 43:22 outside of retool. So for example um you 43:25 know if we wanted to add a button here 43:27 in this row that said you know we wanted 43:29 to be able to send an email to this 43:31 person and say congratulations like 43:33 thank you for being you know one of our 43:34 top affiliates. Um you know we could 43:37 have a resource query that instead of 43:39 pulling from the database you know used 43:40 retool email which is Retool's built-in 43:42 email sending tool. Um, and so whether 43:45 it's email or Slack or making REST API 43:48 calls to something like Jira, um, you 43:51 can definitely do all of that using 43:52 retail queries. These are not by any 43:54 means read only queries. Uh, you can do 43:56 a ton here. 43:59 Cool. Well, we are just about at time 44:01 here. Thank you everybody for joining. 44:03 Uh, like folks have mentioned in the 44:04 chat, there will be a recording 44:06 available that we'll make sure to get 44:07 sent out uh, to you. Uh we will also be 44:10 uh you know posting a follow-up post in 44:13 our retool community. So if you have not 44:15 checked out the retool community, please 44:17 do. Um we have lots of people jumping in 44:19 there helping showing cool things they 44:20 built with retool. Um and it's a great 44:22 place to kind of learn more about all 44:23 the stuff that we've talked about today. 44:25 Uh and specifically if you have even 44:26 more questions that we didn't get a 44:28 chance to cover, uh that's a good place 44:29 to to drop those in. But thanks 44:32 everybody for coming. I hope uh this was 44:34 helpful and and you have some ideas 44:35 about how you can upgrade your 44:36 spreadsheets a bit uh and and get some 44:39 of this this functionality we saw here 44:41 today. Um and you know put put our claim 44:44 of retool being the fastest way to build 44:46 internal tools to the test. Thanks 44:48 everybody.