> ## Documentation Index
> Fetch the complete documentation index at: https://pipedream.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow Development

Sign up for a [free Pipedream account](https://pipedream.com/auth/signup) (no credit card required) and complete this quickstart guide to learn the basic patterns for workflow development:

<Steps>
  <Step title="Create a project">
    Workflows must be created in **Projects**. Projects make it easy to organize your workflows and collaborate with your team.

    Go to [https://pipedream.com/projects](https://pipedream.com/projects) and click on **Create Project**.

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/0383dce2-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=4187df594b32e90d9429e9017f5230b8" width="2880" height="1630" data-path="images/0383dce2-image.png" />
    </Frame>

    Next, enter a project name and click **Create Project**. For this example, we’ll name our project **Getting Started**. You may also click the icon to the right to generate a random project name.

    <Frame>
      <img src="https://mintcdn.com/pipedream/nKh6d_6A4aXFb6xD/images/f69659f5-image.png?fit=max&auto=format&n=nKh6d_6A4aXFb6xD&q=85&s=81e63dfa892ce9a3844bbe71ada12dd5" width="2880" height="1630" data-path="images/f69659f5-image.png" />
    </Frame>

    <Note>
      [Configure GitHub Sync](/workflows/git/) for projects to enable git-based version control and unlock the ability to develop in branches, commit to or pull changes from GitHub, view diffs, create PRs and more.
    </Note>
  </Step>

  <Step title="Create a workflow">
    After the project is created, use the **New** button to create a new workflow.

    <Frame>
      <img src="https://mintcdn.com/pipedream/xnRKrRxEtt3vxd6I/images/d1a8e34a-image.png?fit=max&auto=format&n=xnRKrRxEtt3vxd6I&q=85&s=72e23ed588f44755fa7f89402392fc39" width="2880" height="1630" data-path="images/d1a8e34a-image.png" />
    </Frame>

    Name the workflow and click **Create Workflow** to use the default settings. For this example, we’ll name the workflow **Pipedream Quickstart**.

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/080b4cd4-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=3cfb2cffc7134b232b9875c0f4633721" width="2880" height="1630" data-path="images/080b4cd4-image.png" />
    </Frame>
  </Step>

  <Step title="Add an HTTP / Webhook trigger">
    Next, Pipedream will launch the workflow builder and prompt you to add a trigger.

    <Frame>
      <img src="https://mintcdn.com/pipedream/anb6FA0wpd8jtdUB/images/704d32fb-image.png?fit=max&auto=format&n=anb6FA0wpd8jtdUB&q=85&s=4d606457eb93ff0a6b3cf054e5b9f009" width="1701" height="1323" data-path="images/704d32fb-image.png" />
    </Frame>

    Clicking the trigger opens a new menu to select the trigger. For this example, select **New HTTP / Webhook Requests**.

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/1561da86-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=193757b46d7afa227cbf407dc622599f" width="1335" height="808" data-path="images/1561da86-image.png" />
    </Frame>

    Click **Save and continue** in the step editor on the right to accept the default settings.

    <Frame>
      <img src="https://mintcdn.com/pipedream/anb6FA0wpd8jtdUB/images/536311b8-image.png?fit=max&auto=format&n=anb6FA0wpd8jtdUB&q=85&s=4987e7681d9d2041553947aa51f2dd40" width="814" height="672" data-path="images/536311b8-image.png" />
    </Frame>

    Pipedream will generate a unique URL to trigger this workflow. Once your workflow is deployed, your workflow will run on every request to this URL.

    <Frame>
      <img src="https://mintcdn.com/pipedream/xnRKrRxEtt3vxd6I/images/c3730ea2-image.png?fit=max&auto=format&n=xnRKrRxEtt3vxd6I&q=85&s=bf2f3cb6936fa1d81d29444f86e56dc2" width="782" height="533" data-path="images/c3730ea2-image.png" />
    </Frame>
  </Step>

  <Step title="Generate a test event">
    Next, generate a test event to help you build the workflow.

    <Note>
      The test event will be used to provide autocomplete suggestion as you build your workflow. The data will also be used when testing later steps. You may generate or select a different test event at any time when building a workflow.
    </Note>

    For this example, let’s use the following test event data:

    ```json theme={null}
    {
      "message": "Pipedream is awesome!"
    }
    ```

    Pipedream makes it easy to generate test events for your HTTP trigger. Click on **Generate Test Event** to open the HTTP request builder. Copy and paste the JSON data above into the **Raw Request Body** field and click **Send HTTP Request**.

    <Frame>
      <img src="https://mintcdn.com/pipedream/grEzwYhEB2vZSwGw/images/925ee912-image.png?fit=max&auto=format&n=grEzwYhEB2vZSwGw&q=85&s=09dd966c51cdd477bcd20d6b1bf3ae18" width="1111" height="517" data-path="images/925ee912-image.png" />
    </Frame>

    Pipedream will automatically select and display the contents of the selected event. Validate that the `message` was received as part the event `body`.

    <Frame>
      <img src="https://mintcdn.com/pipedream/h8oodpUDiyR1Ssvt/images/47ea0e36-image.png?fit=max&auto=format&n=h8oodpUDiyR1Ssvt&q=85&s=148aaaa6654f5851c546b67c22974216" width="792" height="648" data-path="images/47ea0e36-image.png" />
    </Frame>

    <Note>
      You may also send live data to the unique URL for your workflow using your favorite HTTP tool or by running a `cURL` command, e.g.,

      ```bash theme={null}
      curl -d '{"message": "Pipedream is awesome!"}' \
        -H "Content-Type: application/json" \
        YOUR_ENDPOINT_URL
      ```
    </Note>
  </Step>

  <Step title="Enrich trigger data using Node.js and npm">
    Before we send data to Google Sheets, let’s use the npm [`sentiment`](https://www.npmjs.com/package/sentiment) package to generate a sentiment score for our message. To do that, click **Continue** or the **+** button.

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/2175294e-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=8f3d51045c578afd01d85b8d99a30c14" width="1247" height="762" data-path="images/2175294e-image.png" />
    </Frame>

    That will open the **Add a step** menu. Select **Run custom code**.

    <Frame>
      <img src="https://mintcdn.com/pipedream/grEzwYhEB2vZSwGw/images/794dfad9-image.png?fit=max&auto=format&n=grEzwYhEB2vZSwGw&q=85&s=7f0a6a2479ae38134e73936e982cd3c5" width="1375" height="829" data-path="images/794dfad9-image.png" />
    </Frame>

    Pipedream will add a Node.js code step to the workflow.

    <Frame>
      <img src="https://mintcdn.com/pipedream/h8oodpUDiyR1Ssvt/images/3ceefd01-image.png?fit=max&auto=format&n=h8oodpUDiyR1Ssvt&q=85&s=26ed942e3ad01b838a7974a79815e8f7" width="412" height="429" data-path="images/3ceefd01-image.png" />
    </Frame>

    Rename the step to **sentiment**.

    <Frame>
      <img src="https://mintcdn.com/pipedream/Acz4Z1ch6TM7-aI8/images/9b8b2433-image.gif?s=d9526fb92f6b57818d181a19f636e997" width="296" height="204" data-path="images/9b8b2433-image.gif" />
    </Frame>

    Next, add the following code to the code step:

    ```javascript theme={null}
    import Sentiment from "sentiment"
     
    export default defineComponent({
      async run({ steps, $ }) {
        let sentiment = new Sentiment()
        return sentiment.analyze(steps.trigger.event.body.message)
      },
    })
    ```

    This code imports the npm package, passes the message we sent to our trigger to the `analyze()` function by referencing `steps.trigger.event.body.message` and then returns the result.

    <Note>
      To use any npm package on Pipedream, just `import` it. There’s no `npm install` or `package.json` required.
    </Note>

    <Note>
      Any data you `return` from a step is exported so it can be inspected and referenced it in future steps via the `steps` object. In this example, return values will be exported to `steps.sentiment.$return_value` because we renamed the step to **sentiment** .
    </Note>

    Your code step should now look like the screenshot below. To run the step and test the code, click the **Test** button.

    <Frame>
      <img src="https://mintcdn.com/pipedream/grEzwYhEB2vZSwGw/images/90fb2b20-image.png?fit=max&auto=format&n=grEzwYhEB2vZSwGw&q=85&s=c972979095a2aea77cbc6c7e1e887912" width="801" height="411" data-path="images/90fb2b20-image.png" />
    </Frame>

    You should see the results of the sentiment analysis when the test is complete.

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/242558b3-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=077b4437043c31dc1e680b8a7f37d39f" width="785" height="848" data-path="images/242558b3-image.png" />
    </Frame>

    <Note>
      When you **Test** a step, only the current step is executed. Use the caret to test different ranges of steps including the entire workflow.
    </Note>
  </Step>

  <Step title="Save data to Google Sheets">
    Next, create a Google Sheet and add **Timestamp**, **Message** and **Sentiment Score** to the first row. These labels act as our column headers and will help us configure the Google Sheets step of the workflow.

    <Frame>
      <img src="https://mintcdn.com/pipedream/grEzwYhEB2vZSwGw/images/8e48dec3-image.png?fit=max&auto=format&n=grEzwYhEB2vZSwGw&q=85&s=55ebd2b3a8922d118b4b264f00b3d205" width="1984" height="670" data-path="images/8e48dec3-image.png" />
    </Frame>

    Next, let’s add a step to the workflow to send the data to Google Sheets. First, click **+** after the `sentiment` code step and select the **Google Sheets** app.

    <Frame>
      <img src="https://mintcdn.com/pipedream/Acz4Z1ch6TM7-aI8/images/bd45e785-image.png?fit=max&auto=format&n=Acz4Z1ch6TM7-aI8&q=85&s=f35a7ccb07affcb14db6d01bf72f0f19" width="1334" height="804" data-path="images/bd45e785-image.png" />
    </Frame>

    Then select the **Add Single Row** action.

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/18ee59cb-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=f184f756b896425dd3e087ea2447e38a" width="1358" height="810" data-path="images/18ee59cb-image.png" />
    </Frame>

    Click to connect you Google Sheets account to Pipedream (or select it from the dropdown if you previously connected an account).

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/0d484497-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=4dd92e0c0d7c8f8afd49a0458cdf65b3" width="788" height="728" data-path="images/0d484497-image.png" />
    </Frame>

    Pipedream will open Google’s sign in flow in a new window. Sign in with the account you want to connect.

    <Frame>
      <img src="https://mintcdn.com/pipedream/Acz4Z1ch6TM7-aI8/images/a1b32d55-image.png?fit=max&auto=format&n=Acz4Z1ch6TM7-aI8&q=85&s=115007315cfbfa478c363f50d7b3f462" width="1192" height="1500" data-path="images/a1b32d55-image.png" />
    </Frame>

    <Warning>
      If prompted, you must check the box for Pipedream to **See, edit, create and delete all of your Google Drive files**. These permissions are required for configure and use the pre-built actions for Google Sheets.
    </Warning>

    <Frame>
      <img src="https://mintcdn.com/pipedream/Acz4Z1ch6TM7-aI8/images/9d20b830-image.png?fit=max&auto=format&n=Acz4Z1ch6TM7-aI8&q=85&s=c2c015fc60f03ae5d1183d9fa95ae844" width="1194" height="1500" data-path="images/9d20b830-image.png" />
    </Frame>

    Learn more about Pipedream’s [privacy and security policy](/privacy-and-security/).

    When you complete connecting your Google account, the window should close and you should return to Pipedream. Your connected account should automatically be selected. Next, select your spreadsheet from the dropdown menu:

    <Frame>
      <img src="https://mintcdn.com/pipedream/grEzwYhEB2vZSwGw/images/8de3f441-image.png?fit=max&auto=format&n=grEzwYhEB2vZSwGw&q=85&s=7008b9f06131e615160245245abd9a09" width="769" height="492" data-path="images/8de3f441-image.png" />
    </Frame>

    Then select the sheet name (the default sheet name in Google Sheets is **Sheet1**):

    <Frame>
      <img src="https://mintcdn.com/pipedream/grEzwYhEB2vZSwGw/images/76dc4441-image.png?fit=max&auto=format&n=grEzwYhEB2vZSwGw&q=85&s=e4c82ce66a27f656877b8636fe0aa837" width="796" height="669" data-path="images/76dc4441-image.png" />
    </Frame>

    Next, select if the spreadsheet has headers in the first row. When a header row exists, Pipedream will automatically retrieve the header labels to make it easy to enter data (if not, you can manually construct an array of values). Since the sheet for this example contains headers, select **Yes**.

    <Frame>
      <img src="https://mintcdn.com/pipedream/h8oodpUDiyR1Ssvt/images/4a8514fa-image.png?fit=max&auto=format&n=h8oodpUDiyR1Ssvt&q=85&s=84d161fadce2bc97ecd5ca9c0ac3ff1f" width="785" height="807" data-path="images/4a8514fa-image.png" />
    </Frame>

    Pipedream will retrieve the headers and generate a form to enter data in your sheet:

    <Frame>
      <img src="https://mintcdn.com/pipedream/anb6FA0wpd8jtdUB/images/6fc82996-image.png?fit=max&auto=format&n=anb6FA0wpd8jtdUB&q=85&s=38e8b583e175aa2edb9111f0b4004b09" width="792" height="458" data-path="images/6fc82996-image.png" />
    </Frame>

    First, let’s use the object explorer to pass the timestamp for the workflow event as the value for the first column. This data can be found in the context object on the trigger.

    When you click into the **Timestamp** field, Pipedream will display an object explorer to make it easy to find data. Scroll or search to find the `ts` key under `steps.trigger.context`.

    <Frame>
      <img src="https://mintcdn.com/pipedream/Acz4Z1ch6TM7-aI8/images/b4bc3560-image.png?fit=max&auto=format&n=Acz4Z1ch6TM7-aI8&q=85&s=41967316a6ad49fbeee57c832273db25" width="795" height="515" data-path="images/b4bc3560-image.png" />
    </Frame>

    Click **select path** to insert a reference to `steps.trigger.context.ts`:

    <Frame>
      <img src="https://mintcdn.com/pipedream/anb6FA0wpd8jtdUB/images/50fe1675-image.png?fit=max&auto=format&n=anb6FA0wpd8jtdUB&q=85&s=0a59a26b5746fa29ac09b4bda79ce2ad" width="788" height="645" data-path="images/50fe1675-image.png" />
    </Frame>

    Next, let’s use autocomplete to enter a value for the **Message** column. First, add double braces `{{` — Pipedream will automatically add the closing braces `}}`.

    Then, type `steps.trigger.event.body.message` between the pairs of braces. Pipedream will provide autocomplete suggestions as you type. Press **Tab** to use a suggestion and then click `.` to get suggestions for the next key. The final value in the **Message** field should be `steps.trigger.event.body.message`.

    <Frame>
      <img src="https://mintcdn.com/pipedream/grEzwYhEB2vZSwGw/images/901a453e-image.png?fit=max&auto=format&n=grEzwYhEB2vZSwGw&q=85&s=7fa20ba34dfa23f27f3c76e171cbca1a" width="786" height="511" data-path="images/901a453e-image.png" />
    </Frame>

    Finally, let’s copy a reference from a previous step. Click on the `sentiment` step to open the results in the editor:

    <Frame>
      <img src="https://mintcdn.com/pipedream/Acz4Z1ch6TM7-aI8/images/b2fbad9c-image.png?fit=max&auto=format&n=Acz4Z1ch6TM7-aI8&q=85&s=32d214dbbd794ec5b935679d0b7d28db" width="1376" height="848" data-path="images/b2fbad9c-image.png" />
    </Frame>

    Next, click the **Copy Path** link next to the score.

    <Frame>
      <img src="https://mintcdn.com/pipedream/h8oodpUDiyR1Ssvt/images/2d48abd7-image.png?fit=max&auto=format&n=h8oodpUDiyR1Ssvt&q=85&s=5c63dcedb8b962f7e43b185b2d756993" width="779" height="560" data-path="images/2d48abd7-image.png" />
    </Frame>

    Click the Google Steps step or click the open tab in the editor. Then paste the value into the **Sentiment Score** field — Pipedream will automatically wrap the reference in double braces `{{ }}`.

    <Frame>
      <img src="https://mintcdn.com/pipedream/h8oodpUDiyR1Ssvt/images/2ea2943d-image.png?fit=max&auto=format&n=h8oodpUDiyR1Ssvt&q=85&s=022371a0ec1f76239d89078ff9d2b0c9" width="1384" height="818" data-path="images/2ea2943d-image.png" />
    </Frame>

    Now that the configuration is complete, click **Test** to validate the configuration for this step. When the test is complete, you will see a success message and a summary of the action performed:

    <Frame>
      <img src="https://mintcdn.com/pipedream/nKh6d_6A4aXFb6xD/images/e5d42c23-image.png?fit=max&auto=format&n=nKh6d_6A4aXFb6xD&q=85&s=22deaa4c5114404688ee23eb9f7b1cd2" width="863" height="662" data-path="images/e5d42c23-image.png" />
    </Frame>

    If you load your spreadsheet, you should see the data Pipedream inserted.

    <Frame>
      <img src="https://mintcdn.com/pipedream/Acz4Z1ch6TM7-aI8/images/a77d4612-image.png?fit=max&auto=format&n=Acz4Z1ch6TM7-aI8&q=85&s=43d029fd635a4aafeaed957c5dfb25af" width="1814" height="624" data-path="images/a77d4612-image.png" />
    </Frame>

    Next, return to your workflow and click **Deploy** to run your workflow on every trigger event.

    <Frame>
      <img src="https://mintcdn.com/pipedream/h8oodpUDiyR1Ssvt/images/2eb1e11a-image.png?fit=max&auto=format&n=h8oodpUDiyR1Ssvt&q=85&s=53170ff2f60822ba83af7f4fac7a9d78" width="793" height="505" data-path="images/2eb1e11a-image.png" />
    </Frame>

    When your workflow deploys, you will be redirected to the **Inspector**. Your workflow is now live.

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/1f60b1ec-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=1f8cc72dbbf5a60a7e1e70b891ad4bff" width="2880" height="1630" data-path="images/1f60b1ec-image.png" />
    </Frame>

    To validate your workflow is working as expected, send a new request to your workflow: You can edit and run the following `cURL` command:

    ```bash theme={null}
    curl -d '{ "message": "Pipedream is awesome!" }' \
      -H "Content-Type: application/json" \
      YOUR-TRIGGER-URL
    ```

    The event will instantly appear in the event list. Select it to inspect the workflow execution.

    <Frame>
      <img src="https://mintcdn.com/pipedream/anb6FA0wpd8jtdUB/images/6b9cb011-image.png?fit=max&auto=format&n=anb6FA0wpd8jtdUB&q=85&s=f4f43e94a144aee0899395174d0fcf34" width="2880" height="1630" data-path="images/6b9cb011-image.png" />
    </Frame>

    Finally, you can return to Google Sheets to validate that the new data was automatically inserted.

    <Frame>
      <img src="https://mintcdn.com/pipedream/NF77kliJSewMqg65/images/0fe3c2b4-image.png?fit=max&auto=format&n=NF77kliJSewMqg65&q=85&s=89138681987b7470880fef5a95e8735c" width="1872" height="580" data-path="images/0fe3c2b4-image.png" />
    </Frame>
  </Step>
</Steps>

## Next Steps

Congratulations! You completed the quickstart and should now understand the basic patterns for workflow development. Next, try creating your own [workflows](/workflows/building-workflows/), learn how to [build and run workflows for your users](/connect/workflows/) or check out the rest of the [docs](/)!
