---
schema_version: "1"
id: 1271b4f3460b78f3d8fca5ad6b0fe032e2144ee712ffeccd3f9e330b64d5cefa
title: "Output Node: Write Recipe Results to a Dataset or External System"
collection: admin
version: current
locale: en-us
portal_url: https://docs.salesforce.com/admin/current/en-us/analytics/264-0-0/bi_integrate_recipe_output_results.md
canonical_url: https://help.salesforce.com/s/articleView?id=analytics.bi_integrate_recipe_output_results.htm&release=264.0.0&type=5
source_site: help.salesforce.com
content_type: documentation
content_hash: ed49e89dc6611a09b0fd4a96db03652053e30943cb0cf5306ac8d11eadf6fdfe
description: In CRM Analytics, use Output nodes with Data Prep recipes to write recipe results to a target, such as a dataset, staged data, .csv, a Data 360 data lake object, or remote location like Amazon S3. A recipe can have more than one Output node. If the recipe writes to a dataset, you can change the API name and label of the dataset in the Output node. If an existing dataset uses the specified API name, the recipe overwrites the existing dataset when it runs.
products:
  - CRM Analytics
  - Cross Cloud
release: "264"
---
# Output Node: Write Recipe Results to a Dataset or External System

In CRM Analytics, use Output nodes with Data Prep recipes to write recipe results to a target, such as a dataset, staged data, .csv, a Data 360 data lake object, or remote location like Amazon S3. A recipe can have more than one Output node. If the recipe writes to a dataset, you can change the API name and label of the dataset in the Output node. If an existing dataset uses the specified API name, the recipe overwrites the existing dataset when it runs.

<table class="slds-table slds-table_bordered slds-max-medium-table_stacked slds-m-bottom_small permission">
          <colgroup>
            <col style="width:50%">
            <col style="width:50%">
          </colgroup>
          <thead class="slds-text-title_caps ">
            <tr class="">
              <th scope="colgroup" class="slds-cell-wrap" colspan="2" style="text-align:center;vertical-align:top;" id="d118903e41">User Permissions
                Needed</th>
            </tr>
          </thead>
          <tbody>
            <tr class="">
              <td data-label="User Permissions Needed" class="slds-cell-wrap" style="vertical-align:top;" headers="d118903e41 ">To manage and create a recipe:</td>

              <td class="slds-cell-wrap" style="vertical-align:top;" headers="d118903e41 ">Edit CRM Analytics Dataset Recipes</td>

            </tr>
          </tbody>
        </table>

![Note](https://sf-zdocs-cdn-prod.zoominsoftware.com/tdta-analytics-bi-264-0-0-production-enus/ec791473-f5b4-4f64-a656-9104f455d966/images/icon_note.png)

Note For an Output node, avoid using data that has multiple unique keys. This can occur when the output results come from an augment, where the each source dataset has a unique id field with the schema. Instead of an augment, ensure the output results come from joins between the source datasets.

1. In the recipe, select the Add Node button (![Add Node button](https://sf-zdocs-cdn-prod.zoominsoftware.com/tdta-analytics-bi-264-0-0-production-enus/ec791473-f5b4-4f64-a656-9104f455d966/resources-global/analytics/images/bi_button_add_node.png)) at the end of the recipe.
2. In the Add Node dialog box, select **Output**.
    
    ![The Add Node modal shows all possible nodes that you can add, including the Output node.](https://sf-zdocs-cdn-prod.zoominsoftware.com/tdta-analytics-bi-264-0-0-production-enus/ec791473-f5b4-4f64-a656-9104f455d966/resources-global/analytics/images/bi_integrate_recipe_node_output.png)
3. In Write To, select the output type, Dataset, Existing Dataset, or CSV.
    
    - For Dataset, add:
        
        - The label, API name, and dataset’s app.
        - Optionally, if using sharing inheritance, select a Sharing Source to apply sharing rules.
        - Optionally, add a security predicate to restrict access to records with row-level security.
            
            ![Note](https://sf-zdocs-cdn-prod.zoominsoftware.com/tdta-analytics-bi-264-0-0-production-enus/ec791473-f5b4-4f64-a656-9104f455d966/images/icon_note.png)
            
            Note After creating a dataset, you must edit it to make changes to its security settings; changes to security settings in the dataflow (rowLevelSharingSource or rowLevelSecurityFilter) or recipe (Security Predicate) have no effect.
        
        ![The Output tab shows the options that you can set when writing to a dataset.](https://sf-zdocs-cdn-prod.zoominsoftware.com/tdta-analytics-bi-264-0-0-production-enus/ec791473-f5b4-4f64-a656-9104f455d966/resources-global/analytics/images/bi_integrate_output_dataset.png)
    - For Existing Dataset:
        
        - Select the operation, Append, Upsert, or Delete.
        - Select the existing dataset to run the operation on. The append operation adds all data from the input to the existing dataset, and records can be duplicated. The upsert operation appends data from the input to the existing dataset if new and overwrites existing rows when they match. The delete operation removes input data from the the existing dataset when existing rows match.
            
            The upsert and delete operations only work with datasets created by external uploads and data syncs, which preserve the required isUniqueKey information.
        - Enter the dataset label and API name.
        - Turn on the disjointed schema option to ensure the dataset updates if the snapshot data schema changes. If the option isn’t selected, the recipe fails when the schema changes
        
        ![The Output tab shows the options that you can set when using Write To Existing Dataset.](https://sf-zdocs-cdn-prod.zoominsoftware.com/tdta-analytics-bi-264-0-0-production-enus/ec791473-f5b4-4f64-a656-9104f455d966/resources-global/analytics/images/bi_integrate_output_existing_dataset.png)
        
        When using this option, remember that:
        
        - The dataset row limits apply. Consider adding and scheduling a recipe to delete old snapshot rows to avoid hitting the limits.
        - When the snapshot schema changes, and the disjointed schema option is active, the recipe takes longer to run as it reregisters all the rows.
    - For CSV:
        
        - Select the user who has permission to download the generated files.
        - Optionally, select whether to include a header in the CSV file.
        - Optionally, determine how to split the CSV over multiple files.
        
        ![The Output tab shows the options that you can set when outputing to CSV.](https://sf-zdocs-cdn-prod.zoominsoftware.com/tdta-analytics-bi-264-0-0-production-enus/ec791473-f5b4-4f64-a656-9104f455d966/resources-global/analytics/images/bi_integrate_output_csv.png)
    - For Output Connection, see the relevant output connector help.
    
    ![Note](https://sf-zdocs-cdn-prod.zoominsoftware.com/tdta-analytics-bi-264-0-0-production-enus/ec791473-f5b4-4f64-a656-9104f455d966/images/icon_note.png)
    
    Note The Dataset API Name can contain only underscores and alphanumeric characters. It must also be unique, begin with a letter, and not include spaces, end with an underscore, or contain two consecutive underscores. If another dataset in the same app uses the API name, the dataset is overwritten. If a dataset in another app uses the name, choose a different, unique name. If an API name isn’t specified, a unique API name is generated.
4. Click **Apply**.
5. Save the recipe.

To create the dataset, run the recipe. As you create more datasets, remember that your org has a row limit for all datasets in your org.

- **[Run Sequential Recipes with Staged Data](https://help.salesforce.com/s/articleView?id=analytics.bi_integrate_recipe_output_staged_data.htm&release=264.0.0&type=5)**  
    When your data strategy involves multiple recipes, you can reduce processing time by using staged data instead of datasets. Place the steps you would otherwise repeat into one recipe that outputs results as staged data. Subsequent recipes can then use the staged data as input nodes to do other work. For example, rather than merge account and opportunity data in several region-specific forecasting recipe, merge in an initial recipe that outputs the results as staged data, and use this data in the other recipes.
- **[Recipe Output to CSV](https://help.salesforce.com/s/articleView?id=analytics.bi_integrate_recipe_output_results_csv.htm&release=264.0.0&type=5)**  
    Use the Data Prep output node in CRM Analytics to save your prepared data as a data and schema file in a Salesforce BPO (storage database). You can then download the data locally using the public API as a CSV file. Use the CSV file to transfer prepared, cleaned, and improved data into your system for analysis, storage, or to inform business processes.
- **[Write Recipe Output to Data 360](https://help.salesforce.com/s/articleView?id=analytics.bi_integrate_recipe_output_results_dc.htm&release=264.0.0&type=5)**  
    Use the Data Prep output node in CRM Analytics to save your prepared data as a Data 360 data lake object (DLO). After your data is in Data 360, you can create calculated insights, semantic models, and Data 360 reports and dashboards.

#### See Also

- [Run a Recipe](https://help.salesforce.com/s/articleView?id=analytics.bi_integrate_data_prep_recipe_run.htm&release=264.0.0&type=5 "Run a CRM Analytics recipe for the first time to create the dataset it defines. Run a recipe again to update the dataset with the latest synced data. You can run a recipe manually or on a schedule.")
- [CRM Anaytics Limits](https://help.salesforce.com/s/articleView?id=analytics.bi_limits.htm&type=5&language=en_US)
- [Set Up Dataset Security to Control Access to Rows](https://help.salesforce.com/s/articleView?id=analytics.bi_security_datasets_row_level.htm&release=264.0.0&type=5 "If a CRM Analytics user has access to a dataset, the user has access to all records in the dataset by default. To restrict access to records, you can implement row-level security on a dataset when you use sharing inheritance and security predicates. Sharing inheritance automatically applies a Salesforce object’s sharing logic to the dataset’s rows. A security predicate is a manually assigned filter condition that defines dataset row access.")
- [Data Prep Date Configuration](https://help.salesforce.com/s/articleView?id=analytics.bi_integrate_dataprep_dateconfiguration.htm&release=264.0.0&type=5 "Use Data Prep’s date configuration to analyze your CRM Analytics data according to a custom year. Date configurations are automatically applied to Data Prep recipe data. Date configurations are ideal for orgs that want to analyze by a custom week start, or by a fiscal year without manually configuring the fiscal month offset or applying a fiscal year to the entire org.")