# Creating your first workflow

[CARTO Workflows](https://docs.carto.com/carto-user-manual/workflows) is a visual model builder that allows you to build complex spatial analyses and data preparation and transformation workflows without writing code. As with the rest of our platform, Workflows is fully cloud-native and runs in your own data warehouse leveraging its full scalability.

In order to learn more about the main sections of CARTO Workflows' interface and its available components, please check [this section](https://docs.carto.com/carto-user-manual/workflows) of our documentation.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-6ac4e60030b5cd1c2584720cd0bbd02c9faee2f1%2FCaptura%20de%20pantalla%202023-09-08%20a%20las%2018.46.28.png?alt=media" alt=""><figcaption></figcaption></figure>

In this first example we will create drive-time isolines for selected retail locations and we will then enrich them with population data leveraging the power of the H3 spatial index. This tutorial includes some examples of simple data manipulation, including filtering, ordering and limiting datasets, plus some more advanced concepts such as polyfiling areas with H3 cells and joining data using a spatial index in common.

As input data we will leverage a point-based dataset representing retail location that is available in the demo data accessible from the CARTO Data Warehouse connection (i.e. retail\_stores), and a table with data from CARTO's Spatial Feature dataset in the USA aggregated at H3 Resolution 8 (i.e. derived\_spatialfeatures\_usa\_h3res8\_v1\_yearly\_v2).

Let's get to it!

### **Creating a workflow and loading your data**

1. In your CARTO Workspace under the Workflows tab, create a new workflow.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-d0a9126b5249a45f985437b0b1152929c591821a%2FCaptura%20de%20pantalla%202023-09-08%20a%20las%2018.48.08.png?alt=media" alt=""><figcaption></figcaption></figure>

2. Select the data warehouse where you have the table with the point data accessible. We'll be using the CARTO Data Warehouse, which should be available to all users.
3. Navigate the data sources panel to locate your table, and drag it onto the canvas. In this example we will be using the `retail_stores` table available in demo data. You should be able to preview the data both in tabular and map format.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-8d3346129483c9196378841e5e419c1f33245743%2Fworkflows_isolines_2.png?alt=media" alt=""><figcaption></figcaption></figure>

### **Filtering data to select the relevant stores**

In this example, we want to select the 100 stores with the highest revenue, our top performing locations.

4. First, we want to eliminate irrelevant store types. Drag the **Select Distinct** component from the Data Preparation toolbox onto the canvas. Connect the stores source to the input side of this component (the left side) and change the column type to **storetype**.
5. Click run.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-44e95ee7559cbd23b46a5a9412d4cfce3431126f%2Fworkflows_isolines_3.png?alt=media" alt=""><figcaption></figcaption></figure>

6. Once run, click on the Select Distinct component and switch to the data preview at the bottom of the window. You will see a list of all distinct store type values. In this example, let’s say we’re only interested in supermarkets.
7. To select supermarkets, add a **Simple Filter** component from the Data Preparation toolbox.
8. Connect the retail stores to the filter, and specify the **column** as storetype, the **operator** as equal to, and the **value** as Supermarket (it's case sensitive).
9. Run!

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-322f05d71c0b5a7b7bfc0fd39e3f8f9f41a8ea6f%2Fworkflows_isolines_4.png?alt=media" alt=""><figcaption></figcaption></figure>

This leaves us with 10,202 stores. The next step is to select the top 100 stores in terms of revenue.

10. Add an **Order By** component from the Data Preparation toolbox and connect it to the top output from Simple Filter. Note that the top output is all features which match the filter, and the bottom is all of those which don't.
11. Change the column to revenue and the order to descending.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-d586745156bcfe3d4ebe110a76d972400ed97727%2Fworkflows_isolines_5.png?alt=media" alt=""><figcaption></figcaption></figure>

12. Next add a **Limit** component - again from Data Preparation - and change the limit to 100, connecting this to the output of Order By.
13. Click run, to select only the top 100 stores in terms of generated revenue.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-06e858f7220db7675cde11b814bddc3546ebdc98%2Fworkflows_isolines_6.png?alt=media" alt=""><figcaption></figcaption></figure>

### **Creating walk-time isolines around the stores**

14. Next, add a **Create Isolines** component from the Spatial Constructors toolbox. Join the output of Limit to this.
15. Change the **mode** to *walk*, the **range type** to time and **range limit** to 600 (10 minutes).

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-b65acb7e88ce1ef6754e0d6f933bd96aeb4325e6%2Fworkflows_isolines_7.png?alt=media" alt=""><figcaption></figcaption></figure>

16. Click run to create 10-minute drive-time isolines. Note this is quite an intensive process compared to many other functions in Workflows (it's calling to an external location data services provider), and so may take a little longer to run.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-0bf4f1ead24fb4488fbbc37e1d975522d46a4d4a%2Fworkflows_isolines_8.png?alt=media" alt=""><figcaption></figcaption></figure>

### Leveraging the H3 spatial index to enrich geospatial data

17. We now add a second input table to the canvas, we will drag and drop the table `derived_spatialfeatures_usa_h3res8_v1_yearly_v2` from `demo_tables`. This table include different spatial features (e.g. population, POIs, climatology, urbanity level, etc.) aggregated at H3 grid with resolution 8.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-11daf86d7af5f0bd35fd9883bc34da5470cb6646%2F17.png?alt=media" alt=""><figcaption></figcaption></figure>

18. In order to be able to join the population data with the areas around each retail store, we will use the component **H3 Polyfill** in order to compute the H3 grid cells in resolution 8 that cover each of the isolines around the stores. We configure the node by selecting the Geo column "geom", configuring the Resolution value to 8 and enabling the option to **Keep input table columns**.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-36c4fbae3db39959c37c586121d5a1833e917a6a%2F18.png?alt=media" alt=""><figcaption></figcaption></figure>

19. Next step is to join both tables based on their H3 indices. For that, we will use the **Join** component. We select the columns named h3 present in both tables to perform the join operation.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-57355dbae82ebd2ed95627710056f4eeede38901%2F19.png?alt=media" alt=""><figcaption></figcaption></figure>

20. Check in the results tab that now you have joined data coming from the retail\_stores table with data from CARTO's spatial features dataset.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-82a54c135ec1616f7c8ccf8846cf7fb752408ebb%2F20.png?alt=media" alt=""><figcaption></figcaption></figure>

21. As we now have multiple H3 grid cells for each retail store, what we want to do is to aggregate the population associated with the area around each store (the H3 polyfilled isoline). In order to do that we are going to use the **Group By** component, and we are going to aggregate the `population_joined` column with a SUM as the aggregation operation and we are going to group by the table by the `store_id` column.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-5501a48e8395a4e447ecee443409a8b9c0709e78%2F21.png?alt=media" alt=""><figcaption></figcaption></figure>

22. Now, check that in the results what we have again is one row per retail store (i.e. 100 rows) and in each of them we have the store\_id and the result of the sum of the population\_joined values for the different H3 cells that were associated with the isoline around each store.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-0eef416fbcf2e90c282d1c5eb0ae1f2595fdbce8%2F22.png?alt=media" alt=""><figcaption></figcaption></figure>

23. We are going to re-join with a **Join** component the data about the retail\_stores (including the point geometry) with the aggregated population we have now. We take the output of the previous **Limit** component and we add it to a new **Join** component together with the data we generated in the previous step. We will use the column `store_id` to join both tables.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-edcc215fde9524d5f69f2bc84d72327cf63c1046%2F23.png?alt=media" alt=""><figcaption></figcaption></figure>

### Adding annotations to your workflow

A cool feature in CARTO Workflows is the possibility to add [annotations](https://docs.carto.com/carto-user-manual/workflows/workflow-canvas#annotations) in any area of the canvas, supporting the [Markdown syntax](https://www.markdownguide.org/basic-syntax/) (allowing for different levels of headers, text formats, images, etc.). This allows users to better explain the different steps performed in a workflow so other users can understand them.

In order to add an annotation to your canvas you only need to click on the corresponding icon on the top toolbar and select the location of the canvas where you want to add it.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-a1654fd20f1b74985e7f3f4e5b1f691d414d69f5%2FCaptura%20de%20pantalla%202023-09-18%20a%20las%2013.23.11.png?alt=media" alt=""><figcaption></figcaption></figure>

###

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-8642d06fdae8e54824c23867b36733c3f476bae8%2FCaptura%20de%20pantalla%202023-09-18%20a%20las%2013.24.45.png?alt=media" alt=""><figcaption></figcaption></figure>

### Sharing and further exploring the results of your workflow

There are multiple ways to share the results of your workflows, from [saving the results in a table](https://docs.carto.com/carto-user-manual/workflows/components/import-export#save_as_table) to [sending them via e-mail](https://docs.carto.com/carto-user-manual/workflows/components/import-export#send-by-email) to your colleagues. Additionally, note that from any step of your workflow (including that with the final saved table), you can create a map in [CARTO Builder](https://docs.carto.com/carto-user-manual/maps) in order to build an interactive dashboard with the result of your workflow plus any of your other spatial data sources.

24. Finally we use the **Save as table** component to save the results as a new table in our data warehouse. We can then use the "Create map" option to build an interactive map to explore this data further.

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-dbc3d31ea62f60064a59f656724f586779c68735%2F24.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3029946802-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FybPdpmLltPkzGFvz7m8A%2Fuploads%2Fgit-blob-414d702de2b7b9215955919f54aa0d62801cb9df%2F25.png?alt=media" alt=""><figcaption></figcaption></figure>

### What next?

Check our [gallery of workflow examples](https://academy.carto.com/creating-workflows/workflow-templates) to keep learning how to get the most of this tool for your data transformation and analysis pipelines. The examples showcase a wide range of scenarios and applications: from simple building blocks for your geospatial analysis to more complex, industry-specific workflows tailored to facilitate running specific geospatial use-cases.
