Skip to main content

#Experience Cloud43 debatiendo

Hi there! We recently made out Knowledge base articles public so they can be indexed by Google and other search engines. Are there any best practices that you all can recommend to improve SEO performance? Also, has anyone been able to get Google to create Featured Snippets from your Experience Cloud site and Knowledge base?

5 respuestas
  1. 10 sept, 12:48

    I’d focus on writing concise answers directly matching search intent, then add clear titles and unique meta descriptions. Keeping content fresh and using internal links helps too. Google Search Console can show which queries already bring impressions to optimize further.

0/9000

1. We have a community site. 

 2. There we have a page. 

 3. In that page, we have a link. 

 4. On click of that link a file opens up. the requirement is that only 'logged in user' should be able to open and see the file. 

 5. Nobody else should able to see it. 

 

More info using scenerio:- File should only opened with the help of click within the community site. After opening the file. If somebody copy the URL from address bar and then pasted in the 'incognito mode' then file should not be opened.  

 

Current progress:- 

 

I researched about and got solution related to pre-signed Url but i think it's the solution with help of code. I searching for any workaround using configuration within the AWS account.  

 

Any help would be appreciated. 

 

#Trailhead  #Experience Cloud  #Experience Site  #AWS S3  #AWS  #Lightning Aura Components  #Salesforce Developer  #Salesforce Admin

5 respuestas
  1. Ayer, 15:42

    Hi Kushagra, 

     

    Yes, creating an IAM user is the correct path, and it's confirmed by AWS's own official documentation, not just common practice. AWS explicitly recommends creating an IAM user with least-privilege permissions first, then generating access keys under that IAM user, never using your AWS root account credentials for this. 

     

    Steps to get your Access Key and Secret Key (official AWS process): 

     

    1. Log into the AWS Console with your root/admin account (only for this setup step, not for ongoing use). 

    2. Go to IAM > Users > click "Create user". 

    3. Give it a descriptive name, e.g. salesforce-s3-integration. 

    4. Do NOT enable AWS Management Console access, this user only needs programmatic access, not console login. 

    5. Attach a permission policy scoped only to what's needed, ideally a custom policy limited to s3:GetObject on your specific bucket/prefix, not full S3 access. This follows AWS's least-privilege guidance. 

    6. After the user is created, go to that user > Security credentials tab > Access keys section > "Create access key". 

    7. Select the use case (choose "Application running outside AWS" or similar, matching your Apex callout scenario). 

    8. AWS shows you the Access Key ID and Secret Access Key ONCE. Download the CSV or copy both immediately, the Secret Access Key cannot be retrieved again after this screen, you'd have to delete and recreate the key if lost. 

     

    Official reference:

    https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html

     

     

    Important note on "is this the only way": Technically no, AWS's own best-practice guidance actually recommends AGAINST long-term access keys where avoidable, and prefers IAM Roles with temporary/short-term credentials (via AWS STS) since those auto-expire and reduce risk if leaked. 

    Official reference:

    https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds-programmatic-access.html

     

     

    However, for a Salesforce Apex integration specifically, since Apex runs outside AWS and can't assume an IAM role directly the way an EC2/Lambda service can, using a scoped-down IAM user with long-term access keys (stored securely in Named Credential/Protected Custom Metadata, as I mentioned earlier) is the practical and accepted approach here. Just make sure to: 

    - Scope the policy to only that one bucket/prefix 

    - Rotate the access key periodically 

    - Never commit it to code, always pull from Named Credential/Custom Metadata at runtime 

     

    So to directly answer: yes, IAM user + access key is the right and standard way for your use case.

0/9000

Trying to embed or host a SCORM file on my Experience Cloud site. I partner with our Training team who uses an external LMS for Learning, but they created a module that would be great to have on a specific page.

 

I'm wondering what the easiest way to do this is? I keep running into issues with the top 2 apps I came across:

 

Daniwoo - multiple repeated errors installing package (reached out to them)

Appinium - the components are deprecated and I don't see a way to update them (reached out to them)

 

Is there a way I could embed an iframe into the site using HTML from the LMS, or is there another way to play SCORM files directly on the site?

3 respuestas
0/9000

Hi everyone,

I'm currently working on an Experience Cloud site using the LWR template.

When the "Fix theme header" option is enabled in the Theme Layout settings, any lightning/toast notifications are rendered underneath the fixed header, making them barely visible or completely hidden. (Please see the attached screenshot for reference.)

This behavior occurs consistently and affects usability, especially when showing important success/error messages to users.

Has anyone encountered this issue? 

 Is there a recommended workaround or CSS override to ensure the toast appears above the fixed header?

Thanks in advance!

 

 

LWR + Fixed Header causes lightning/toast to be hidden underneath the header

 

 

 

SCR-20250620-nkjj.png

 

 

 

3 respuestas
  1. 7 sept, 11:00

    lightning-toast-container { 

      z-index: 100001 !important; 

     

    in your stylesheet should fix this, or something similar depending on the class you're using for your toast.

0/9000

Hi Everyone,

I have an Experience Cloud site where the users are using the Customer Community Plus license.

I have a requirement to create a new Customer Community Plus user from an LWC/Apex component. As part of the user creation process, I need to select the appropriate Customer Community Plus Profile.

To populate the Profile selection, I need to fetch the available Profiles from the org using Apex.

I tried the following SOQL:

List<Profile> profiles = [

SELECT Id, Name

FROM Profile

];

However, when this code executes in the context of a Customer Community Plus user, I receive the following error:

sObject type 'Profile' is not supported

I also understand that Experience Cloud users have restrictions on accessing certain standard objects.

My questions are:

  1. Is there any way to grant a Customer Community Plus user access to the Profile sObject through a Profile, Permission Set, or any other Salesforce configuration?
  2. If direct access to the Profile object is not supported for Customer Community Plus users, what is the recommended Salesforce approach for retrieving the appropriate Customer Community Plus Profile when creating another user?
  3. Is there any supported Apex/API approach to retrieve the available Customer Community Plus Profiles without directly querying the Profile object?

My requirement is specifically:

Existing Customer Community Plus user → LWC/Apex → Create a new Customer Community Plus user → Select the appropriate Customer Community Plus Profile

Any guidance or recommended approach would be greatly appreciated.

Thanks! 

 

#Salesforce Developer  #LWC  #Profiles  #Experience Cloud

7 respuestas
  1. 7 sept, 10:13

    I am getting this below error  when I use Site.createExternalUser() .

    common.apex.runtime.impl.ExecutionException: [You are already logged in.]

      

    Please suggest

0/9000

Give the use for enabling knowledge user checkbox to any user   

2 respuestas
  1. 4 sept, 04:25

    Hi @Rohit .

     

     The Knowledge User checkbox enables a user to work with Salesforce Knowledge. It is required for users who need to create, edit, publish, archive, or manage Knowledge articles, based on the permissions assigned to them.  

     

    For example, Support Agents can use Knowledge to find and share articles with customers, while Knowledge Managers can create, update, and publish articles.  

     

    The checkbox alone does not grant all Knowledge permissions; the required object permissions, field access, and permission sets must also be configured.  

      

    Hope this Helps!!

0/9000
Sara Blair publicó en #Jobs

☁️ Salesforce Developers — Ready for Your Next Adventure? 🚀 

 

Innovate! Inc. is looking for a Mid-Level Salesforce Developer to join our team and help build scalable, user-focused Salesforce solutions. 

 

If you enjoy turning business requirements into great Salesforce experiences and have hands-on experience with Experience Cloud, Apex, LWC, Flow, and integrations, this could be a great next step! 💻✨ 

 

🔹 What we’re looking for:

 

☁️ 3+ years of hands-on Salesforce development experience 

🌐 Hands-on Experience Cloud development, including authenticated external-user experiences 

💻 Experience with Apex, Lightning Web Components, Flow & SOQL

🔗 Experience developing or supporting REST/SOAP integrations

🛡️ Understanding of Salesforce security, sharing, profiles, permission sets & external-user access 

🧪 Experience with code reviews, testing, troubleshooting & production support 

🚀 Familiarity with Git, Salesforce CLI/SFDX, deployments & CI/CD processes 

🤝 Ability to collaborate with business analysts and technical teams to build scalable solutions

➕ Experience with Service Cloud and MuleSoft is a plus!

🏅 Preferred certifications include Experience Cloud Consultant, Platform App Builder, Platform Developer I, and JavaScript Developer I

 

🏠 Remote within the U.S. 

💰 Salary Range: $100,000–$120,000 

🇺🇸 U.S. Citizenship required

 🔐 Must be able to obtain a Public Trust clearance

📋 Position is contingent upon contract award. 

 

Interested? Take a look! 👇 

 

👉 Learn more and apply:

 

https://innovateteam.my.salesforce-sites.com/InnovatePublicJobBoard/PublicJobPosting?id=a1KVJ00001nrZKf2AM

 

And if someone in your Trailblazer network comes to mind, please tag or share! 🙌☁️ 

 

#Jobs #Salesforce Developer #Experience Cloud #MuleSoft #Lightning Web Components #Remote Opportunities

0/9000

I am trying to create a new page in my Salesforce Experience Site, but I am getting the following error:

“An error has occurred while processing your request. The salesforce.com support team has been notified of the problem.”

Because of this error, I am unable to create the new Experience Site page.

I have attached a screenshot of the error for reference.

Please help me understand why this error is occurring and how I can resolve it. 

 

#Salesforce Developer  #Salesforce Admin  #Experience Cloud  #Experience Site  #Ask An Expert  #Digital Experience

1 respuesta
  1. 26 ago, 16:57

    Hey Vishal, 

     

    This matches a documented Salesforce Known Issue: Internal Server Error in Experience Builder when creating/accessing page variations. It's a recognized platform bug tied to how the builder handles new page creation for certain page types, not something wrong with your API name or setup. 

     

    Workaround from Salesforce's own known issue documentation: 

    1. Open Experience Builder, open the Pages menu 

    2. Locate the affected page, click the three dots next to it, go to Page Properties 

    3. From there, try creating the page fresh as a page variation with a basic/blank layout rather than through the standard "New Page" flow 

     

    If this workaround doesn't resolve it for you, per the same known issue, the recommended next step is opening a case with Salesforce Support directly, referencing this as matching the known "Internal Server Error in Experience Builder when accessing page variations" issue and providing your specific Error ID (628191604-286554) so they can trace it against the root cause already on file. 

     

    Reference:

    https://trailblazer.salesforce.com/issues_view?id=a1p3A00000031dFQAQ&title=internal-server-error-in-community-builder-when-accessing-page-variations-for-salesforce-object-pages

0/9000

Hi Community Members,   

I'm currently setting up a Salesforce Experience Cloud site and have configured the Login Discovery Page as the login page type. My goal is to allow users to log in using either mobile number or email, and receive an OTP instead of being redirected to enter a password.

However, I'm running into an issue:

  • When I enter a mobile number (e.g., 7972101144, 07972101144, or +917972101144), it redirects me to the password entry page instead of triggering OTP verification.
  • I want the system to send an OTP whether the user logs in with email or mobile number.

Additionally, I'm seeing the following error:  'Check your entry. If you still can't log in, contact your BankServices administrator.' in  AutocreatedDiscLoginHandler1747659242240 code:-  // This auto-generated class contains the default logic for login discovery by SMS or email.   // You can customize the code to ensure it meets your needs. The requestAttributes parameter   // provides additional information you can use in the discovery logic. Attributes include CommunityUrl,   // IpAddress, UserAgent, and location information (such as Country and City).     global class AutocreatedDiscLoginHandler1747659242240 implements Auth.LoginDiscoveryHandler {    global PageReference login(String identifier, String startUrl, Map<String, String> requestAttributes) {    if (identifier != null && isValidEmail(identifier)) {      // Search for user by email       List<User> users = [SELECT Id FROM User WHERE Email = :identifier AND IsActive = TRUE];      if (!users.isEmpty() && users.size() == 1) {        // User must have verified email before using this verification method. We cannot send messages to unverified emails.         // You can check if the user has email verified bit on and add the password verification method as fallback.        List<TwoFactorMethodsInfo> verifiedInfo = [SELECT HasUserVerifiedEmailAddress FROM TwoFactorMethodsInfo WHERE UserId = :users[0].Id];        if (!verifiedInfo.isEmpty() && verifiedInfo[0].HasUserVerifiedEmailAddress == true) {          // Use email verification method if the user's email is verified.          return discoveryResult(users[0], Auth.VerificationMethod.EMAIL, startUrl, requestAttributes);        } else {          // Use password verification method as fallback if the user's email is unverified.          return discoveryResult(users[0], Auth.VerificationMethod.PASSWORD, startUrl, requestAttributes);        }      } else {        throw new Auth.LoginDiscoveryException('No unique user found. User count=' + users.size());      }    }    if (identifier != null) {      String formattedSms = getFormattedSms(identifier);      if (formattedSms != null) {        // Search for user by SMS         List<User> users = [SELECT Id FROM User WHERE MobilePhone = :formattedSms AND IsActive = TRUE];        if (!users.isEmpty() && users.size() == 1) {          // User must have verified SMS before using this verification method. We cannot send messages to unverified mobile numbers.           // You can check if the user has mobile verified bit on or add the password verification method as fallback.          List<TwoFactorMethodsInfo> verifiedInfo = [SELECT HasUserVerifiedMobileNumber FROM TwoFactorMethodsInfo WHERE UserId = :users[0].Id];          if (!verifiedInfo.isEmpty() && verifiedInfo[0].HasUserVerifiedMobileNumber == true) {            // Use SMS verification method if the user's mobile number is verified.            return discoveryResult(users[0], Auth.VerificationMethod.SMS, startUrl, requestAttributes);          } else {            // Use password verification method as fallback if the user's mobile number is unverified.            return discoveryResult(users[0], Auth.VerificationMethod.PASSWORD, startUrl, requestAttributes);          }        } else {          throw new Auth.LoginDiscoveryException('No unique user found. User count=' + users.size());        }      }    }    if (identifier != null) {      // You can customize the code to find user via other attributes, such as SSN or Federation ID    }    throw new Auth.LoginDiscoveryException('Invalid Identifier');  }      private boolean isValidEmail(String identifier) {      String emailRegex = '^[a-zA-Z0-9._|\\\\%#~`=?&/$^*!}{+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}$';      // source: http://www.regular-expressions.info/email.html       Pattern EmailPattern = Pattern.compile(emailRegex);      Matcher EmailMatcher = EmailPattern.matcher(identifier);      if (EmailMatcher.matches()) { return true; }      else { return false; }    }      private String getFormattedSms(String identifier) {      // Accept SMS input formats with 1 or 2 digits country code, 3 digits area code and 7 digits number      // You can customize the SMS regex to allow different formats      String smsRegex = '^(\\+?\\d{1,2}?[\\s-])?(\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4})$';      Pattern smsPattern = Pattern.compile(smsRegex);      Matcher smsMatcher = SmsPattern.matcher(identifier);      if (smsMatcher.matches()) {        try {          // Format user input into the verified SMS format '+xx xxxxxxxxxx' before DB lookup          // Append US country code +1 by default if no country code is provided          String countryCode = smsMatcher.group(1) == null ? '+1' : smsMatcher.group(1);          return System.UserManagement.formatPhoneNumber(countryCode, smsMatcher.group(2));        } catch(System.InvalidParameterValueException e) {          return null;        }      } else { return null; }    }    private PageReference getSsoRedirect(User user, String startUrl, Map<String, String> requestAttributes) {    // You can look up if the user should log in with SAML or an Auth Provider and return the URL to initialize SSO.    return null;  }    private PageReference discoveryResult(User user, Auth.VerificationMethod method, String startUrl, Map<String, String> requestAttributes) {    //Only external users with an External Identity or community license can login using Site.passwordlessLogin    //Use getSsoRedirect to enable internal user login for a community    PageReference ssoRedirect = getSsoRedirect(user, startUrl, requestAttributes);    if (ssoRedirect != null) {      return ssoRedirect;    } else {      if (method != null) {        List<Auth.VerificationMethod> methods = new List<Auth.VerificationMethod>();        methods.add(method);        PageReference pwdlessRedirect = Site.passwordlessLogin(user.Id, methods, startUrl);        if (pwdlessRedirect != null) {          return pwdlessRedirect;        } else {          throw new Auth.LoginDiscoveryException('No Passwordless Login redirect URL returned for verification method: ' + method);        }      } else {        throw new Auth.LoginDiscoveryException('No method found');      }    }  }  }   

I'm a beginner in Experience Cloud, and haven’t found any helpful videos or documentation online explaining how to achieve this. I'm attaching a screenshot of the error and mentioning the auto-generated login code here for reference.

Could someone please guide me step-by-step on how to solve this issue and implement OTP login for both email and mobile number through the Login Discovery Page?

Thanks in advance for your help!  

 

@* Experience Cloud *  @* Salesforce Developers * 

3 respuestas
  1. 18 ago, 18:00

    Hi Any luck in finding out the solution?  

    Got stuck on the same issue while implementing Login Discovery in my domain.

0/9000

I am trying to modify an application form LWC, I have the source code for XML, HTML, JS, and APEX. I don't know how to upload and institute the changed files. Can anyone walk me through the process? Trying to learn stuff I didn't know I needed to know when the developers were around. :(

2 respuestas
  1. 14 ago, 09:14

    Hey, don't stress, this is more mechanical than it looks. Here's the quick version: 

     

    Traditional route (VS Code): 

    1. Install VS Code + Salesforce Extension Pack + Salesforce CLI
    2. Authorize your org (SFDX: Authorize an Org)
    3. Place your LWC files in force-app/main/default/lwc/yourComponentName/ (HTML, JS, XML together) and Apex in force-app/main/default/classes/
    4. Right-click the folder → SFDX: Deploy Source to Org
    5. Check the Output panel for errors, then test in your org

     

    Easier option:

     

    If setting all that up feels like overkill for one change,

    BOFC's Dev Studio

    lets you edit and deploy Apex, LWC, and Aura directly inside Salesforce, no VS Code, no CLI, no auth setup. You'd just open the component in the org, paste your changes, and deploy right there. 

     

0/9000