I need to send a survey link to a list of contacts, from a lightning component. It does send the link, with the right template. But with the wrong data. We use survey force. So i have:

apex controller:

// this is the method that the component uses to submit the Survey__c information
public static String submitSurvey(String surveyId, String contacsIdsListJSON, String Lang, String oppId){
        objectSubmitReturn obj = new objectSubmitReturn();

        List<String> contactIdsList = (List<String>) System.JSON.deserialize(contacsIdsListJSON, List<String>.class);

        Set<String> contactIdSet = new Set<String>(contactIdsList);

        List<Contact> contactList = [SELECT Id, LastName, OppId__c, FirstName, Name, AccountId, Email FROM Contact where id in : contactIdSet];

        Survey__c surveys = [SELECT Id, Name FROM Survey__c where id = :surveyId];

        String langConcat = '%_' + Lang;
        EmailTemplate template = [
            SELECT Id, Name, DeveloperName
            FROM EmailTemplate where DeveloperName like :langConcat  limit 1];

        List<Messaging.SingleEmailMessage> emailsMsgs = new List<Messaging.SingleEmailMessage>();

        Map<String, SurveyInvitation> mapInvitations = new Map<String, SurveyInvitation>();

        for(Contact cont: contactList){
            Messaging.SingleEmailMessage singleEmail = new Messaging.SingleEmailMessage();

            List<String> emailList = new List<String>();


            singleEmail.setSenderDisplayName('Salesforce Ideas!');


            Messaging.SingleEmailMessage[] messages = new List<Messaging.SingleEmailMessage> {singleEmail};

            Messaging.SendEmailResult[] results = Messaging.sendEmail(messages);

            if (results[0].success){
                obj.status = true;
                System.debug('The email was sent successfully.');
            } else {
                obj.status = false;
                obj.errorMsgReturn = 'The email failed to send: ' +  results[0].errors[0].message;
                System.debug('The email failed to send: ' +  results[0].errors[0].message);

        // custom field in contact, should have the current Survey__c id
        for(Contact cont: contactList){
            cont.OppId__c = oppId;
        update contactList;

        // verifying Contact information
        List<Contact> verify = [SELECT Id, LastName, OppId__c, Email FROM Contact where id in : contactIdSet];


        return JSON.serialize(obj);

the template in use, has this code


OppId__c 123: {!Contact.OppId__c}
Email: {!Contact.Email}
LastName. {!Contact.LastName}
Contact: {!Contact.Id}

Then i get this in my email: enter image description here:

The thing i'm passing an id to Contact.OppId__c, which is lookup field, it gets filled in the contact object, and i can even click in the interface, taking me to the right opportunity. But in the template, {!Contact.OppId__c} becomes the opprtunity 's name, which of course isnt a valid id.

finally i get this in my logs enter image description here

That is, i can't understand why oppid, in the link sent to the email, is "SE ISANG 400kV / SE MORUPULE B 400kV / LINHA 218kM 400kV" and not "0060C000004i4EXQAY"

And as you can see the id of OppId__c is valid. Any hints?

1 Answer 1


I found a solution, even if unsatisfying. Because it's lookupfield, the template engine replaces the id with the name. So i create a formula in Contact that outputs the Opportunity id, and instead if using the field directly, i use that formula. I was surprised, given it's very different behavior to Apex. Worst, i believe.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.