Skip to main content

#Integration66 diskutieren mit

I am looking into integrating student enrollment/registration data from Modern Campus (Lumens) into Salesforce EDA. Because we do not currently have an enterprise middleware platform (like MuleSoft or Boomi) in place, we are planning on using an automated nightly CSV export dropped onto a secure SFTP server. Has anyone successfully mapped Lumens data into the EDA Interactions staging object using a flat-file method? I would love to hear any recommendations for lightweight, budget-friendly ETL tools (or native Salesforce workarounds) you used to automate the SFTP pickup and ingestion. Any insights, lessons learned, or object mapping tips would be greatly appreciated!   

1 Antwort
  1. 19. Juni, 13:30

    Greetings, @Carissa Hansen

      

     

    I have a few clarifying questions that will hopefully paint a clearer picture of your volumes and technical constraints. 

    1. What is the average and peak volume of student registration records expected in each nightly CSV file? (If it's under 50,000 records daily, native/free workarounds are highly viable; if it's much larger, API limits and processing times become a major factor). 

     

    2. Is the nightly export a "delta" file (only new/changed records) or a "full system extract" of all active enrollments?  

     

    3. Do you have an on-premise server or a secure VM available that can run scheduled scripts? (If yes, you can actually automate the Salesforce Data Loader CLI for free using a script to pull from SFTP and push to Salesforce). 

     

    4. Are you restricted to entirely cloud-hosted solutions, or are powerful open-source desktop/server ETL tools on the table? 

     

    5. Does the Lumens CSV output match the formatting required by the EDA Interaction object, or will it require significant data transformation (e.g., splitting names, parsing strings, changing date formats)? 

     

    6. Do you already have a shared unique key (like a Lumens Student ID) populated on your existing Salesforce Contact records to facilitate the EDA matching rules? 

     

    7. Do you have a developer on staff who can write Apex, or are you looking for a strictly declarative (no-code) configuration? 

     

    Be well - Katende

0/9000

Hi All,

 

I am a Salesforce admin and have been instructed by my client to integrate Microsoft Dynamics Nav with Salesforce. The Sales Team creates quotes out of Microsoft Nav, but they want these quotes to be visible in Salesforce on the Opportunity object.

 

Example

Quote is created in Microsoft Dynamics Nav then this data is transferred into Salesforce

  • Nav Account Name = Salesforce Account Name
  • Nav Total Dollar Amount = Salesforce Opportunity Amount
  • Nav Opp Quote Number = Salesforce Opp Quote Number (custom field)

I've mainly worked with declarative tools in Salesforce and have a little experience in development. I was provided with the web service for the Nav and the overall requirements, there isn't a budget for app exchange solutions or any already built out solutions so it would need to be created from scratch. I'm looking to see if there is a good resource that I can use to follow for this integration. I've been going through Trailhead's Apex Integration Services Module, but I'm not sure if this is the right path.

 

Any insight would be greatly appreciated. Thank you!

1 Antwort
0/9000
Hello, I have a scenario where we have to transfer Case data from Salesforce to an external SFTP server. Case data will be in XML file format and has to use a SFTP service instead of an API. One XML file can have data for max 10 cases and this transfer should happen every 30 minutes and pickup New cases with a particular status.

Also, there will be a reverse transfer from SFTP to salesforce in same format. 

Kindly help 
3 Antworten
0/9000

Hi, 

 

I am trying to connect to sf hosted mcp server using named query api as a tool(was trying something related to headless 360). 

 

Not able to connect MCP Server which uses Named Query API as tool

 

Above is screenshot for Named Query API in org. I have enabled this in API catalog too. I have tried connecting this MCP server as a claude connector. Still getting issues. Am I missing something here ?  

 

image.png

 

Can someone please suggest if I am missing something here ? 

 

 

 

#Integration

1 Antwort
  1. 14. Juni, 17:45

    @A D

    Look at the parameter name versus the SOQL bind variable. Your endpoint defines the parameter as amtthreshold (all lowercase). But your SOQL uses :amtThreshold (camelCase, capital T). Those have to match exactly. Right now the named query receives amtthreshold from the request but the bind variable :amtThreshold never gets populated, so the query fails the same way every time regardless of what value or type you pass. 

    Two more things to check once that's done: 

    The parameter binds as text by default. Amount is a number field. If the comparison throws a type error after you fix the casing, cast it in the SOQL or confirm the API catalog parameter type is set to number, not string. 

    Confirm the running user behind the MCP connection has read access to Opportunity and the Amount field. A permission gap here also fails silently through the named query layer. 

    But the casing mismatch is your culprit. Fix that first and retest before touching anything else.  

    - SP

0/9000

Hi all,

I am on my search of a good data quality tool which should not be expensive.

Which data quality tool would you recommend from your experience?.

 

#Sales Cloud  #Integration  #Data Management

4 Antworten
  1. Ajaypreet Singh Saini (Grantbook) Forum Ambassador
    15. Feb. 2024, 17:46

    Hey @Lena Wong, have you tried Salesforce optimizer and Health Check tools in salesforce?

     

    https://www.salesforceben.com/salesforce-health-check/

    https://www.apexhours.com/salesforce-health-check/

0/9000

Hi,

 

We need to integrate my client's sales into CRMA. The integration runs once daily at midnight, but it's possible that sales are manually added during the workday due to integration errors.

Currently, we have the CRMA sales connection running at 3 am, and we want to establish the correct entry condition to avoid duplicate sales.

Here are some questions and considerations:

 

  1. Duplicate Records in CRMA:
    • If we run multiple connections and 'Append' sales in the recipe, will it create duplicate records in CRMA?
  2. Handling Duplicates:
    • If duplicates are created, how can we handle this situation?
    • Is there a way to perform an upsert instead of an append? We noticed there is only an 'Update' function in the recipe.
  3. Ideal Entry Condition:
    • Should the entry condition be created date = today or yesterday? If so, it might result in adding the same sales multiple times.
    • What could be an alternative entry criterion considering sales run at midnight (TODAY) but may also be updated during the day? If we set the entry criteria to only TODAY at 3 am, we might miss some sales.

We need a solution that ensures all sales are captured accurately without duplication, even when updates occur during the day.

 

Thank you for your assistance.

5 Antworten
  1. 14. Juni, 02:49

    SBX Retail

    You need to make few custom changes in recipe

    1) Append new data

    2) Run Recipe multiple times a day

    3) Creates duplicate records

    This is the problem

    Solution

    1) Add multirow formula to identify duplicate records after each run

    Partition By unique Id , order by record modify or created date desc

    case when current (uniqueid+modifydate or snapshot date ) = lead( uniqueid+modifydate or snapshot date) the duplicate else non duplicate end

    2) Use the flag in filter

    Like Duplicate Flag - Yes or No

    This way no matter how many times you run your recipe it will always keep non duplicate entries with new values

    Let me know if it helps

0/9000

We are a continuing education center that uses Destiny One, now called Modern Campus: Lifelong Learning. We are looking to integrate this system with Salesforce using the webhooks they offer, but are looking for direction on how long this may take to set up and what the limits of the system are. Anyone out there using this product as well as Salesforce? 

 

#Integration  #Higher Education  #K-12 Education  #Webhooks

3 Antworten
  1. 10. Juni, 22:47

    That's helpful, thanks! There are many considerations here, especially if the integration is bi-directional as the source of truth/ownership for each field would need to be strictly defined to prevent potential data overwrites and other issues. Choosing to stay on standard Sales cloud instead of Education Cloud means you'll be building out a custom course data model as well.  

     

    What are the limits you're wondering about? I just realized I missed that in your original post.

0/9000

Hi everyone,

I'm looking to integrate RingCentral call recordings with Conversation Insight for Einstein. Specifically, I want to automatically generate conversation summaries from these call recordings. Has anyone done this before or can provide a step-by-step guide on how to set this up?

Here are the key points I'm interested in:

  1. How to connect RingCentral with Salesforce Einstein.
  2. Setting up Conversation Insight to analyze call recordings.
  3. Generating and accessing conversation summaries.

Any insights, detailed instructions, or resources would be greatly appreciated. Thanks in advance!

2 Antworten
0/9000

Trying to integrate the Agentforce Conversation Client (ACC) SDK. Stuck on auth.

 

External Client App → OAuth scopes selected: api, web, lightning. Client Credentials Flow enabled with an active Run-As user(System Admin profile)

 

POST /services/oauth2/token   (grant_type=client_credentials)

→ 200 OK,  "scope": "lightning api"   ← web is missing

 

POST /services/oauth2/singleaccess  (Bearer <token>)

→ 403  body: Invalid_Scope

 

Sending scope=web on the token request is rejected ("scope parameter not supported" — expected for client_credentials).

 

Question: What controls whether "web" actually ends up in the issued token? Does the Run-As user's license (e.g. Salesforce Integration) silently strip web/lightning scopes? What license/profile do you use for a Run-As user that needs /services/oauth2/singleaccess to work for Lightning Out 2.0 / ACC?

1 Antwort
0/9000

Hello Trailblazers,

I'm new to Salesforce and currently working on a project where we need to connect Salesforce with other applications, like marketing tools and ERP systems. I have a few questions and would appreciate any guidance you can offer:

  1. Which Integration Tools to Use: What tools or platforms are best for integrating Salesforce with other applications (e.g., MuleSoft, Zapier)?
  2. Ensuring Data Synchronization: How can we make sure that data stays consistent and updated between Salesforce and other systems?
  3. Security Measures: What security steps should we take to protect our data during integration?
  4. Challenges and Solutions: What common problems might we face during integration, and how can we solve them?
  5. General Tips: Are there any best practices or tips for a smooth integration process?

Thank you for your help!

Best regards,

Hills dot

18 Antworten
  1. 6. Juni, 07:56

    import { LightningElement, track } from 'lwc';

    import { NavigationMixin } from 'lightning/navigation';

    import executeQuery from '@salesforce/apex/DataExplorerController.executeQuery';

    import getObjectFields from '@salesforce/apex/DataExplorerController.getObjectFields';

     

    export default class DataExplorer extends NavigationMixin(LightningElement) {

     

        @track soqlQuery = '';

        @track tableData = [];

        @track tableColumns = [];

        @track fieldSuggestions = [];

        @track errorMessage = '';

        @track isLoading = false;

        @track loadingSuggestions = false;

        @track showTable = false;

        @track showNoRecords = false;

        @track detectedObject = '';

        @track showSuggestions = false;

     

        _debounceTimer;

        _lastFetchedObject = '';

     

        get isRunDisabled(){

            return !this.soqlQuery ||this.soqlQuery.trim() === ''|| this.isLoading;

        }

     

        get recordCount() {

            return this.tableData ?this.tableData.length :0;

        }

     

        handleQueryChange(event){

            this.soqlQuery = event.target.value;

            this.errorMessage = '';

     

            clearTimeout(this._debounceTimer);

            this._debounceTimer = setTimeout(() =>{

                this.fetchFieldSuggestions();

            }, 400);

        }

     

        fetchFieldSuggestions(){

            const objectName = this.extractObjectName(this.soqlQuery);

     

            if (!objectName){

                this.showSuggestions = false;

                this.fieldSuggestions = [];

                this.detectedObject = '';

                this._lastFetchedObject = '';

                return;

            }

     

            if (objectName.toLowerCase() === this._lastFetchedObject.toLowerCase()){

                return;

            }

     

            this._lastFetchedObject = objectName;

            this.detectedObject = objectName;

            this.loadingSuggestions = true;

            this.showSuggestions = false;

     

            getObjectFields({ objectApiName: objectName })

                .then(result =>{

                    this.fieldSuggestions = result;

                    this.showSuggestions = result && result.length > 0;

                    this.loadingSuggestions = false;

                })

                .catch(() =>{

                    this.fieldSuggestions = [];

                    this.showSuggestions = false;

                    this.loadingSuggestions = false;

                });

        }

     

        extractObjectName(query){

            if (!query) return null;

            const match = query.match(/\bFROM\s+([a-zA-Z_][a-zA-Z0-9_]*)/i);

            return match ? match[1] : null;

        }

     

        handleClear(){

            this.soqlQuery = '';

            this.tableData = [];

            this.tableColumns = [];

            this.fieldSuggestions = [];

            this.errorMessage = '';

            this.showTable = false;

            this.showNoRecords = false;

            this.showSuggestions = false;

            this.detectedObject = '';

            this._lastFetchedObject = '';

        }

     

        handleRunQuery(){

            const query = this.soqlQuery.trim();

     

            if(!query){

                this.errorMessage = 'Please enter a SOQL query.';

                return;

            }

     

            if(!this.isValidQuery(query)){

                this.errorMessage = 'Invalid query. DML statements (INSERT, UPDATE, DELETE, UPSERT, MERGE) are not allowed.';

                return;

            }

     

            this.isLoading = true;

            this.showTable = false;

            this.showNoRecords = false;

            this.errorMessage = '';

     

            executeQuery({ soqlQuery: query })

                .then(result =>{

                    if (result && result.length > 0){

                        this.buildTable(result);

                        this.showTable = true;

                        this.showNoRecords = false;

                    } else{

                        this.showNoRecords = true;

                        this.showTable = false;

                    }

                    this.isLoading = false;

                })

                .catch(error =>{

                    this.errorMessage = error.body ? error.body.message : 'An error occurred while executing the query.';

                    this.isLoading = false;

                    this.showTable = false;

                });

        }

     

        isValidQuery(query){

            const forbidden = /\b(INSERT|UPDATE|DELETE|UPSERT|MERGE)\b/i;

            return !forbidden.test(query);

        }

     

        buildTable(records){

            const columns = [];

            const firstRecord = records[0];

     

            Object.keys(firstRecord).forEach(field =>{

                if (field === 'Id'){

                    columns.unshift({

                        label: 'Record ID',

                        fieldName: 'Id',

                        type: 'button',

                        typeAttributes: {

                            label: { fieldName: 'Id'},

                            variant: 'base',

                            name: 'navigate'

                        },

                        initialWidth: 180

                    });

                } else if(typeof firstRecord[field] !== 'object'){

                    columns.push({

                        label: field,

                        fieldName: field,

                        type: 'text',

                        wrapText: true

                    });

                }

            });

     

            this.tableColumns = columns;

            this.tableData = records;

        }

     

        handleRowAction(event){

            const actionName = event.detail.action.name;

            const row = event.detail.row;

     

            if (actionName === 'navigate'){

                this[NavigationMixin.Navigate]({

                    type: 'standard__recordPage',

                    attributes: {

                        recordId: row.Id,

                        actionName: 'view'

                    }

                });

            }

        }

    }

0/9000