A Step-by-Step Guide: Integrating Outlook Emails with NetSuite using SSIS and KingswaySoft

29 August 2025
KingswaySoft Team

Email is a vital channel for customer communication, but that valuable data often remains siloed in inboxes, disconnected from your core business systems. On the other hand, NetSuite is one such capable ERP/CRM application, designed to work with complex relational data for optimal efficiency. Manually saving emails and attachments to your ERP or CRM, like NetSuite, is possible, but it would be a tedious process and is prone to errors. The challenge lies in efficiently creating those email communication records in NetSuite and having them properly linked to the corresponding customer records in the ERP application. For instance, when a client sends an email inquiry, a purchase order document, or any other files, these need to be accurately saved in NetSuite while associated with the proper customer records in order to effectively track client communications. This process involves not only linking the data but also managing details such as the date received, email order, priority, and any attachments, all while ensuring no data loss. This is where KingswaySoft solution makes a difference. With our components, you can quickly design data flows to handle these scenarios through an intuitive drag-and-drop interface, saving time and ensuring a smooth and simplified development experience. In this blog post, we will walk you through how to integrate emails from an Exchange/Outlook mailbox with their respective NetSuite customer records, paying special attention to handling email attachments seamlessly, which is an important aspect of the design in order to be successful.

Key Benefits of This Integration

  • Centralized repository for customer data along with related customer email engagement records. 
  • Enhanced collaboration across teams working on customer cases
  • Improved service efficiency
  • Secure and compliant data handling

This demonstration uses the SSIS Integration Toolkit for NetSuite and the SSIS Productivity Pack, leveraging the following components in the data flow:

For your convenience, we have provided a download of the sample package if you would like to get started quickly. Note that you can customize the package by adding your own connection managers, and it can be tailored for your specific integration needs.

Overall Data Flow Design

The overall design of the flow would look like something below. You can see that the data flow starts off with an Email Source Component, which reads emails and produces two outputs: Primary (email message data) and Attachment (attachment details and binary file content). The flow processes these outputs through a series of lookups and writes them to a NetSuite Destination Component targeting the File object. For the records that succeed, their corresponding reference is written and tagged with the Customer Message endpoint in a second NetSuite Destination. For the emails that have no attachments, those records are directed to another NetSuite Destination, writing to the Message endpoint without attachment references. 

Overall data flow design for Outlook to NetSuite integration

Before we get into the details about the solution, let's have a quick look at the final result. What we should be achieving is, after the designed package is executed, the Customer Messages section in NetSuite should display those emails retrieved from Exchange/Outlook, along with the corresponding attachments associated properly.

NetSuite Customer Messages grid

Now let’s break the flow into two parts for a detailed walkthrough.

Part 1: Lookup and Merge Emails and Attachments

The Email Source Component is an SSIS source component that can be used to read email records from an Exchange server or a POP3/IMAP server. It can be configured to filter emails in various ways. In this example, we configure it to read only unread emails using the "Only Process Unread Messages" option in the component, as shown below.

Email Source component configured to read unread emails

It is very possible that your business requirements dictate that you should read those email records incrementally, so that only unprocessed email records are returned. To achieve so, you can parameterize the component's Search parameters. Refer to our blog post on dynamic component properties for guidance.

The email source component produces two outputs. The Primary Output will contain the list of retrieved email records, and is sent to a Premium Derived Column (PDC) Component, which is designed to get the cleaned email address from the email record using its From field - this is the information that we use to match NetSuite’s customer record in the downstream pipeline component. This is achieved using the following expression in the Premium Derived Column component:

Contains( [From], "<") && Contains( [From], ">") ? GetTokenAtPosition( GetTokenAtPosition( [From], "<", 2 ), ">", 1 ) : [From]

The cleaned email address is then used in a Premium Service Lookup (PSL) Component to find the matching NetSuite customer records. The lookup component will be working on the Customer object, with conditions defined to match on the email field in NetSuite, as shown below.

Premium Service Lookup general configuration

Premium Service Lookup conditions configuration

The Premium Service Lookup component will output the InternalId column for matched NetSuite Customer records, which is a unique identifier used to identify a particular NetSuite record, this is a column that can be seen in NetSuite UI as well.

NetSuite grid showing InternalId

Depending on whether a matching record is returned by the above Premium Service Lookup component, we can tell if the email address has a matching customer record in NetSuite. Our design is that we should only process those email records that have a matching customer. To achieve this, we use a Conditional Split Component to check whether the InternalId output column is empty (NULL) from the above PSL component. Based on that, we know whether there is a matching NetSuite customer record for the email address.

Conditional Split to verify customer existence

Next, we use a Premium Lookup Component to combine the matched Customer records with their respective Attachment records using the MessageId as the key. The Premium Lookup component produces two outputs. The Matched Rows output contains the email records that have an attachment, and the Unmatched Rows output contains those that have no attachments. 

Data flow design for Part 1

It should be noted that NetSuite only supports one attachment record per message, which is the reason that the Premium Lookup is used here. Otherwise, a Merge Join component might be necessary. 

Part 2: Writing to NetSuite Customer Records

With the combined input ready, the flow proceeds to write data to NetSuite Customer records, split into three actions:

Data flow design for Part 2

Step 1: Write to the File Object
The first action writes attachments to the NetSuite File object, a central repository for files accessible to NetSuite records. The configuration maps file-related metadata from the upstream flow.

NetSuite Destination configuration for File object

NetSuite File object column mappings

The folder.internalId field, typically a static value, is hardcoded in the upstream Premium Derived Column Component with the field FolderID.

Step 2: Write to the Message Object
Successful File writes are multicast to provide inputs for the second NetSuite Destination Component, targeting both the Message endpoint and the Message_MediaItemList child endpoint to link attachments to the parent Message record.

NetSuite Destination for Message and MediaItemList

NetSuite Message column mappings

The _LinkId and _parent.LinkId fields link parent and child records, using the MessageId as the unique identifier. Learn more in our blog post on parent-child record linking. The internalId in the Message_MediaItemList metadata would be the ID of the File that was uploaded for its respective Message. And this is available in the default output from the upstream NetSuite Destination component, in the field called NetSuiteRecordID.

Secondary input configuration for NetSuite Destination

Step 3: Handle Emails Without Attachments
Emails without attachments are handled via the Unmatched Output of the Premium Lookup Component. This output connects to a third NetSuite Destination, writing to the Message object without the MediaItemList endpoint. 

Write to Message object

Conclusion

Using KingswaySoft's SSIS components, you can build a robust, automated workflow to seamlessly integrate Outlook emails and attachments with NetSuite. This visual, no-code approach not only saves significant development time but also makes the entire process robust and easy to manage.

We hope this guide has been helpful in demonstrating how to streamline your email integration workflow and unlock the full potential of your business data.

Archive

August 2025 2 July 2025 2 June 2025 1 May 2025 2 April 2025 3 March 2025 1 February 2025 1 January 2025 2 December 2024 1 November 2024 3 October 2024 1 September 2024 1 August 2024 2 July 2024 1 June 2024 1 May 2024 1 April 2024 2 March 2024 2 February 2024 2 January 2024 2 December 2023 1 November 2023 1 October 2023 2 August 2023 1 July 2023 2 June 2023 1 May 2023 2 April 2023 1 March 2023 1 February 2023 1 January 2023 2 December 2022 1 November 2022 2 October 2022 2 September 2022 2 August 2022 2 July 2022 3 June 2022 2 May 2022 2 April 2022 3 March 2022 2 February 2022 1 January 2022 2 December 2021 1 October 2021 1 September 2021 2 August 2021 2 July 2021 2 June 2021 1 May 2021 1 April 2021 2 March 2021 2 February 2021 2 January 2021 2 December 2020 2 November 2020 4 October 2020 1 September 2020 3 August 2020 2 July 2020 1 June 2020 2 May 2020 1 April 2020 1 March 2020 1 February 2020 1 January 2020 1 December 2019 1 November 2019 1 October 2019 1 May 2019 1 February 2019 1 December 2018 2 November 2018 1 October 2018 4 September 2018 1 August 2018 1 July 2018 1 June 2018 3 April 2018 3 March 2018 3 February 2018 3 January 2018 2 December 2017 1 April 2017 1 March 2017 7 December 2016 1 November 2016 2 October 2016 1 September 2016 4 August 2016 1 June 2016 1 May 2016 3 April 2016 1 August 2015 1 April 2015 10 August 2014 1 July 2014 1 June 2014 2 May 2014 2 February 2014 1 January 2014 2 October 2013 1 September 2013 2 August 2013 2 June 2013 5 May 2013 2 March 2013 1 February 2013 1 January 2013 1 December 2012 2 November 2012 2 September 2012 2 July 2012 1 May 2012 3 April 2012 2 March 2012 2 January 2012 1

Tags