Skip to main content

Feed

Connect with fellow Trailblazers. Ask and answer questions to build your skills and network.

I am trying to extract HTML content from multiple Pardot (Marketing Cloud Account Engagement) email templates in bulk.

I reviewed the Pardot Email Template API documentation, but it appears there are limitations when retrieving HTML-related fields through the GET endpoints. My goal is to avoid manually opening each template and copying the HTML content one by one.

Could you please clarify:

  1. Is there a supported way to retrieve the HTML content for multiple email templates in a single process (bulk extraction)?
  2. Which API endpoint or approach is recommended for extracting HTML content from multiple templates at once?
  3. Are there any alternative APIs, exports, Salesforce objects, or reporting methods that provide access to the full HTML content?
  4. If the Email Template API has limitations on HTML fields, what is the best practice for exporting this data into Excel or CSV format for reporting and analysis?
  5. Has anyone implemented an automated solution to extract HTML from all Pardot email templates without making individual requests for each template?

I am looking for the most efficient and scalable approach to export HTML content from a large number of Pardot email templates rather than manually copying each template's HTML.    @* MC Account Engagement (fka Pardot) * 

0/9000

We're trying to track the number of emails that we're sending during the case journey. These emails are getting triggered by flows. For instance, if a case gets moved into a particular status, an email is sent to the client requesting additional information. We would like to track the number of emails that are getting sent by the type of email. Is there a way to track these? I tried the built in HTML email report but didn't work. Thoughts?   

0/9000

Hi all, 

 

Hello fellow SE enthusiasts, 

 

There's a feature that has been requested from my customer's SDR leads: When you create a manual email step, but then you only need to personalize it to some recipients, then can you select the rest (e.g. list view) and just send them as they are with a press of a button?  

 

I cannot find a standard way of doing this, but I can envision a Screen flow that either is used for selecting the targets currently on that manual email step, or gets the selection from a list view, and then triggers the send to the selection. It would need to a) pick the email template from the cadence step, b) send the email (action) and c) mark the step complete. 

 

Does this sound feasible to you? Any alternate paths I should consider? 

1 answer
  1. May 29, 10:44 AM

    @Jouni Hult my standard approach would be to use an Automated Email step when the email does not need personalization. A manual email step is designed for rep review/personalization, so using Flow to bulk-send it is possible, but it becomes custom automation and needs careful testing. 

     

    For your "some need personalization, most do not" scenario, the best design is usually to split the audience before the email step. Put the non-personalized group into an automated email step, and keep only the recipients that need editing on the manual email step. That keeps Sales Engagement reporting, cadence progression, templates, limits, and engagement tracking much closer to standard behavior. Salesforce’s cadence data model has separate step types for AutoSendAnEmail and SendAnEmail, so this distinction matters (https://developer.salesforce.com/docs/sales/sales-engagement/guide/sales-cadence-objects.html

     

    A Flow-based approach is technically possible, but I would treat it as a custom build, not a simple configuration. The Flow would need to identify the active ActionCadenceStepTracker records, retrieve the cadence step template, send the email, then call the standard Send Cadence Event action with ManualComplete. Salesforce’s Actions API includes sendSalesCadenceEvent for skipping or manually completing a step, and also includes selectTemplateForSalesCadenceStepTracker to retrieve the template/variant assigned to a cadence step (Actions Developer Guide

     

    The main risk is that a custom Flow email may not behave exactly like a native Sales Engagement manual email. Before using this in production, validate email logging, opt-out handling, sender identity, daily limits, engagement tracking, reply/listener behavior, and whether cadence analytics still show the result correctly. 

     

    So it would be like: use Automated Email for the no-personalization path, keep Manual Email only where reps truly need to edit, and use Flow only if the business accepts the custom behavior and testing effort.

0/9000

I'd like to export every newsletter email I've ever sent (I send 5 days a wee) to a text file (or pdf) so that I can find a specific section in each newsletter and copy it into an Google sheet.  It's a trivia question I ask in every newsletter, and I want to go back and grab every question I've ever asked.    Is there an easy way to do this?    

1 answer
  1. Apr 8, 6:12 PM

    To export Salesforce email sends/newsletter history to a file you can search through, here are the main approaches depending on where your newsletter emails are stored:

     

    If you're sending through Salesforce standard Email (not Marketing Cloud): The EmailMessage object stores all sent emails. You can run a SOQL query or Salesforce report to export EmailMessage records including Subject, TextBody, HtmlBody, FromAddress, ToAddress, and MessageDate. From a Report, export to CSV or Excel, then you can search the content.

     

    If you're sending through Marketing Cloud: Use the "Send Log" data extension or the Tracking Extracts feature to export send data and email content. You can access individual email renders through CloudPages or use the Email Tracking reports.

     

    Quick options for search: (1) Salesforce Reports - create a report on Email Messages, export to Excel, and use Excel search. (2) Use the Salesforce Data Export (Setup > Data Export > Export Now) to export EmailMessage as a CSV. (3) If using Marketing Cloud, the Automation Studio tracking extracts can export HTML content.

     

    Note: The body text of emails in Salesforce is stored in TextBody (plain text) and HtmlBody (HTML) fields on the EmailMessage object. A SOQL query like: SELECT Subject, TextBody, MessageDate FROM EmailMessage WHERE FromAddress = 'your@email.com' ORDER BY MessageDate DESC will get all your sent emails.

     

    Mani G | Principal/Founder | https://Keneland.com

0/9000

Hello Guys, 

 

How to handle multiple inbound interests for an existing Lead/Contact without creating duplicates?

The Scenario: A prospect (Lead or Contact) exists in the CRM but submits a new webform for a different product/service (captured in a custom "Inbound Request" object).

The Conflict: * If we use a single Lead record, we risk overwriting the original "Lead Source" and "Status," making it hard for Sales to track new, active interests vs. old, dead ones.

• If we create duplicate Leads, we fragment the Customer 360 view, break Account Engagement (Pardot) syncing/scoring, and create massive data debt.

The Goal: Find a way to route the new request to the right specialist and track Marketing Campaign ROI (Attribution) for each specific interest, while keeping a unique "Identity" record and using the standard Salesforce "Convert" button.

What is the best architectural approach to balance Sales UX, Marketing Attribution, and Data Integrity?

2 answers
  1. Mar 8, 4:45 PM

    Best Architectural Approach for Multiple Inbound Interests

    This is a classic Salesforce challenge, and you're right to be concerned about data integrity vs. sales UX. Here's the recommended architecture that balances all three goals:

    Recommended Solution: Custom "Inbound Request" Object Pattern

    Core Architecture

    1. Single Lead/Contact Record (Identity Layer)

    • Maintain one Lead or Contact record per person (your "identity" record)
    • Use duplicate matching rules to prevent creation of duplicate Leads/Contacts
    • Keep the original Lead Source and Status intact on this record

    2. Custom "Inbound Request" Object (Interest Layer)

    • Create a child object related to Lead/Contact: Inbound_Request__c
    • Each web form submission creates a new Inbound Request record, not a new Lead
    • This object captures:
      • Product/Service of interest
      • Campaign attribution (via Campaign Member)
      • Request date/time
      • Lead Source for this specific request
      • Status (New, Contacted, Qualified, Dead, Converted)
      • Assigned specialist/owner

    3. Campaign Members (Attribution Layer)

    • Link each Inbound Request to a Campaign for marketing attribution
    • Use Campaign Member to track ROI per product/interest
    • Maintain full marketing funnel visibility

    How It Works

    Scenario: Existing Lead Submits New Form

    1. Web form submitted → Apex/Flow checks for existing Lead/Contact by email
    2. Match found → Create new Inbound_Request__c record linked to existing Lead
    3. Campaign Member created → Link to the campaign for this specific product
    4. Assignment rules fire → Route Inbound Request to appropriate specialist based on product/service
    5. Sales works the request → Specialist updates Inbound Request status, not Lead status
    6. Conversion → When ready, use standard Lead Convert (or custom conversion for Contacts)

    Benefits of This Approach

    No duplicate Leads

    → Single identity record per person 

    Preserve Lead Source

    → Original attribution stays intact 

    Track multiple interests

    → Each Inbound Request = one interest 

    Proper routing

    → Assignment rules on Inbound Request object 

    Marketing attribution

    → Campaign Members per request 

    Sales UX

    → Clear view of active vs. old interests 

    Standard Convert button → Still works on the Lead record

    Object Schema

    HTML

     

    Lead/Contact (Identity)

    ├── Inbound_Request__c (Interest 1)

    │ ├── Campaign_Member__c → Campaign A

    │ ├── Product__c: "Service A"

    │ ├── Status__c: "Dead"

    │ └── Lead_Source__c: "Webinar 2024"

    ├── Inbound_Request__c (Interest 2)

    │ ├── Campaign_Member__c → Campaign B

    │ ├── Product__c: "Service B"

    │ ├── Status__c: "New"

    │ └── Lead_Source__c: "Web Form 2025"

    └── Inbound_Request__c (Interest 3)

    ├── Campaign_Member__c → Campaign C

    ├── Product__c: "Service C"

    ├── Status__c: "Qualified"

    └── Lead_Source__c: "Referral"

    Key Fields on Inbound_Request__c

    FieldTypePurpose

    Lead__c / Contact__c | Lookup | Link to identity record 

    Product_Service__c | Picklist | What they're interested in 

    Request_Status__c | Picklist | New, Contacted, Qualified, Dead, Converted 

    Lead_Source__c | Text | Source for

    this

    request 

    Campaign__c | Lookup | Marketing campaign attribution 

    Assigned_Specialist__c | Lookup (User) | Who's working this request 

    Request_Date__c | DateTime | When submitted 

    Notes__c | Long Text | Specialist notes

    Automation & Routing

    1. Web-to-Lead/Web-to-Case Flow:

    HTML

     

    Web Form Submission

    Check for existing Lead/Contact (by email)

    If exists → Create Inbound_Request__c (linked to existing)

    If new → Create Lead + Inbound_Request__c

    Create Campaign Member

    Assignment Rule: Route Inbound_Request to specialist based on Product__c

    Email notification to specialist

    2. Lead Conversion:

    • When specialist qualifies the request, they can convert the Lead (standard button)
    • Post-conversion: Inbound Request links to the new Contact/Opportunity
    • Historical requests remain visible on Contact record

    Sales UX: What Reps See

    Lead/Contact Record:

    • Related List: "Inbound Requests" (all interests, current and historical)
    • Quick view: Which requests are active vs. dead
    • Original Lead Source preserved

    Inbound Request Record:

    • Clear status per interest
    • Specialist assignment
    • Campaign attribution
    • Product/service details

    Reports & Dashboards:

    • Active requests by product
    • Conversion rates per campaign
    • Specialist workload
    • Marketing ROI by product line

    Marketing Attribution

    Use Campaign Influence or custom reporting:

    • Each Inbound Request → Campaign Member
    • Track first touch, last touch, multi-touch attribution
    • Report on ROI per product/campaign
    • Maintain full funnel visibility

    Alternative Considerations

    Why NOT use Opportunities for this?

    • Opportunities imply qualified sales stage
    • Inbound Requests may be early-stage inquiries
    • You want to track interest before opportunity

    Why NOT use Cases?

    • Cases are for support, not sales inquiries
    • Doesn't integrate well with Lead conversion
    • Marketing attribution is harder

    Why NOT use multiple Leads?

    • Fragments Customer 360 view (your concern)
    • Breaks Pardot/Account Engagement scoring
    • Creates massive data debt
    • Duplicate management nightmare

    Implementation Checklist

    1. ✅ Create Inbound_Request__c custom object
    2. ✅ Build web-to-lead/form handler (Apex/Flow)
    3. ✅ Configure duplicate matching rules (Lead/Contact)
    4. ✅ Set up assignment rules on Inbound Request
    5. ✅ Create Campaign Member automation
    6. ✅ Build related lists on Lead/Contact layouts
    7. ✅ Train sales team on new process
    8. ✅ Build reports/dashboards for visibility
    9. ✅ Integrate with Pardot/Account Engagement

    Copado DevOps Consideration

    When deploying this solution through Copado:

    • Metadata: Custom object, fields, flows, assignment rules
    • Data: May need data templates for testing in sandboxes
    • Testing: Use Copado Robotic Testing to automate form submission scenarios
    • Quality Gates: PMD checks on Apex handlers, flow best practices

    This architecture gives you the best of all worlds: clean data, proper attribution, sales efficiency, and the ability to use standard Salesforce features like Lead conversion. It's a proven pattern used by many organizations facing the same challenge.

0/9000
5 answers
  1. Mar 8, 4:43 PM

    Flow to Notify Case Team When New Case is Opened

    Overview

    This guide walks you through creating a Record-Triggered Flow that automatically notifies the Case Team whenever a new case is created in Salesforce.

    Flow Configuration

    1. Flow Type and Trigger Setup

    Flow Type: Record-Triggered Flow

    Object: Case

    Trigger: A record is created

    Entry Conditions:

    • No additional conditions needed (triggers on all new cases)
    • Alternatively, add conditions if you only want notifications for specific case types:
      • Example: Case.Priority EQUALS High
      • Example: Case.Status NOT EQUAL TO Closed

    Optimize the Flow For: Actions and Related Records

    Run: After the record is saved

    Flow Elements

    2. Get Records - Retrieve Case Team Members

    Element Type: Get Records

    Label: Get Case Team Members

    Object: Case Team Member

    Conditions:

    How Many Records: All records

    Store Output: Yes - Create a collection variable called varCaseTeamMembers

    Fields to Store:

    3. Decision - Check if Team Members Exist

    Element Type: Decision

    Label: Team Members Found?

    Outcome 1: Yes - Team Members Exist

    • Condition: {!varCaseTeamMembers} Is Null {!$GlobalConstant.False}

    Default Outcome: No Team Members

    • (Optional: You can add logging or alternative notification here)

    4. Loop - Iterate Through Team Members

    Element Type: Loop

    Label: Loop Through Case Team Members

    Collection Variable: {!varCaseTeamMembers}

    Direction: First item to last item

    5. Send Email - Notify Each Team Member

    Element Type: Action - Send Email (or Email Alert)

    Label: Send Notification Email

    Recipient Email Addresses: {!varCaseTeamMembers.Member.Email}

    Subject: New Case Opened: {!$Record.CaseNumber} - {!$Record.Subject}

    Body (Plain Text or Rich Text):

    HTML

     

    Hello {!varCaseTeamMembers.Member.Name},

    A new case has been opened and assigned to the Case Team:

    Case Number: {!$Record.CaseNumber}

    Subject: {!$Record.Subject}

    Priority: {!$Record.Priority}

    Status: {!$Record.Status}

    Created Date: {!$Record.CreatedDate}

    Case Owner: {!$Record.Owner.Name}

    Description:

    {!$Record.Description}

    Please review this case in Salesforce:

    [Link to Case: {!$Record.Id}]

    Thank you,

    Salesforce Automated Notifications

    Alternative - Use Email Template:

    • Create a custom Email Template for better formatting
    • Reference it in the Send Email action

    Best Practices & Considerations

    Performance Optimization

    • Bulkification: This flow is bulkified by default since it processes records individually but can handle bulk inserts
    • Governor Limits: Be mindful of email limits (5,000 emails per day for standard orgs)
    • Avoid Recursion: Since this triggers on create only, recursion isn't a concern

    Enhanced Features You Can Add

    1. Conditional Notifications

    Add criteria to only notify for specific case types:

    HTML

     

    AND(

    OR(

    TEXT({!$Record.Priority}) = "High",

    TEXT({!$Record.Priority}) = "Critical"

    ),

    TEXT({!$Record.Status}) != "Closed"

    )

    2. Use Chatter Instead of Email

    Replace the Send Email action with a Post to Chatter action:

    3. Create Task for Team Members

    Add a Create Records element to create tasks:

    • Object: Task
    • Subject: "Review New Case: {!$Record.CaseNumber}"
    • WhoId: {!varCaseTeamMembers.MemberId}
    • WhatId: {!$Record.Id}
    • Status: "Not Started"
    • Priority: "Normal"

    4. Use Platform Events for Scalability

    For high-volume orgs, consider publishing a Platform Event instead of direct emails to avoid governor limits.

    Alternative Approach: Email Alert (Simpler)

    If you prefer a simpler approach without looping:

    Create an Email Alert

    1. Setup → Email Alerts → New Email Alert
    2. Object: Case
    3. Email Template: Select or create template
    4. Recipients:
      • Add "Case Team" as recipient type
      • This automatically sends to all Case Team members

    Create Process Builder or Flow

    1. Trigger on Case creation
    2. Add immediate action: Send Email Alert
    3. Select the email alert created above

    Testing Your Flow

    Test Scenarios

    1. Create a new case with Case Team members assigned
    2. Verify emails are sent to all team members
    3. Test with no team members - ensure flow doesn't error
    4. Bulk test - create multiple cases simultaneously to verify bulkification

    Debug Tips

    • Enable Debug Mode in Flow Builder
    • Check Email Logs in Setup → Email Log Files
    • Review Flow Interview Logs for any errors
    • Use Flow Fault Emails to catch runtime errors

    Deployment Considerations

    When Using Copado for Deployment

    1. Commit the Flow to your user story
    2. Include Dependencies:
      • Email Templates (if custom)
      • Custom Fields referenced in the flow
      • Case Team Member object permissions
    3. Test in Lower Environments before production
    4. Activate Flow only after successful validation
    5. Document the flow purpose in the Description field for future reference

    Required Permissions

    • Users need Read access to Case Team Member object
    • Flow runs in System Context by default (recommended)
    • Email deliverability settings must be configured

    Maintenance & Monitoring

    • Monitor Flow Errors: Setup → Process Automation Settings → Enable Flow Fault Emails
    • Review Email Deliverability: Check bounce rates and spam reports
    • Update Email Templates: Keep messaging current with business needs
    • Version Control: Use Copado to track flow changes over time

    Summary

    This Record-Triggered Flow provides automated notifications to Case Team members whenever a new case is created, ensuring immediate awareness and faster response times. The solution is scalable, maintainable, and follows Salesforce best practices for automation.

0/9000

Hi everyone,

This is my first time posting, and I’m looking for architectural advice and real-world examples on handling credits and corrections. 

 

Our Current Setup:

  • Salesforce Field Service (No Billing module).
  • Work Orders with Work Order Line Items (WOLI) for labor/actions.
  • Products Consumed linked to Assets (via WOLIs) for parts, and some "loose" Products Consumed on the Work Order level (e.g., travel costs).
  • Future state: We plan to implement Inventory Management in Salesforce.
  • Volume: Approx. 20 credit requests per month.

The Challenge: I am investigating how to implement a process to credit or correct completed Work Orders—either the entire Work Order or specific parts of it (certain hours or specific parts). 

 

I am currently weighing two main approaches and would love to hear how you have set this up in your own environment:

  1. Keeping the original records unchanged (for historical tracking) so we can see what was initially reported by the technician versus what was corrected later.
  2. Using negative numbers/quantities directly on the Work Order or Products Consumed.

We also require an approval flow for these corrections before Finance processes the credit in our external ERP. Currently, we export the data via a Salesforce report which Finance then imports/processes manually. 

 

I would love your insights on:

  • How did you design this process? I’m very curious to hear about your actual implementation and why you chose that route.
  • Given that we link parts/labor to Assets and plan to use Inventory Management later, what do you consider the "Best Practice" for logging (partial) credits?
  • Should we avoid "negative" Products Consumed to prevent messy inventory logic in the future? Is a separate "Credit/Correction" object a better path?
  • How do you ensure that a credit on a WOLI also correctly reflects the history/valuation of the linked Asset?
  • What are the pros and cons of the method you chose (e.g., reporting ease for Finance vs. data complexity)?
  • Does anyone have experience with a simple Approval Flow for these requests that Finance can easily report on?

I want to build something that is "Finance-proof" now, but won't break our future Inventory implementation. 

 

Thank you in advance for sharing your expertise!

5 answers
  1. Mar 1, 11:46 PM

    I'll help you design a robust credit/correction process for your Field Service setup. Based on Salesforce best practices and your specific requirements, here's my architectural guidance:

    Recommended Approach: Separate Credit Object with Audit Trail

    For your use case, I strongly recommend avoiding negative quantities and instead implementing a dedicated Credit/Correction object that maintains full historical integrity. Here's why and how:

    Architecture Overview

    Create a custom Work_Order_Credit__c object that references the original Work Order and tracks all correction details:

    HTML

     

    Work_Order_Credit__c

    ├── Original_Work_Order__c (Lookup to Work Order)

    ├── Credit_Type__c (Picklist: Full Credit, Partial Credit, Correction)

    ├── Reason__c (Picklist: Technician Error, Customer Request, Billing Adjustment, etc.)

    ├── Status__c (Picklist: Draft, Pending Approval, Approved, Rejected, Processed)

    ├── Approval_Date__c

    ├── Approved_By__c (Lookup to User)

    ├── Finance_Processed__c (Checkbox)

    ├── Finance_Processed_Date__c

    └── Related Lists:

    ├── Work_Order_Line_Item_Credits__c

    └── Product_Consumed_Credits__c

    Detailed Design Recommendations

    1. Work Order Line Item Credits

    Create WOLI_Credit__c junction object:

    • Links to original WOLI
    • Credit quantity/hours (positive number representing amount to credit)
    • Reason for credit
    • Maintains link to Asset (critical for your asset history requirement)

    2. Product Consumed Credits

    Create Product_Consumed_Credit__c junction object:

    • Links to original Product Consumed record
    • Credit quantity (positive number)
    • Inventory adjustment flag (for future Inventory Management)
    • Asset reference (if applicable)

    Why This Approach is "Finance-Proof" and Inventory-Ready

    ✅ Advantages:

    1. Complete Audit Trail: Original technician work remains untouched; all corrections are additive records
    2. Asset History Integrity: Credit records maintain Asset lookups, so you can report:
      • Original work performed on Asset
      • Corrections/credits applied
      • Net labor/parts for Asset valuation
    3. Inventory Management Compatible: When you implement Inventory:
      • Original Product Consumed = inventory deduction
      • Product Consumed Credit = inventory addition (return to stock)
      • No negative inventory transactions that confuse stock levels
    4. Finance Reporting: Easy to generate reports showing:
      • Gross work performed
      • Credits applied
      • Net billable (even though you're non-billing, this helps cost accounting)
    5. Approval Flow Ready: Credit object has its own lifecycle independent of completed Work Orders

    ❌ Why Negative Quantities Fail:

    • Inventory systems typically reject negative stock movements
    • Confuses reporting (is -5 a credit or a data error?)
    • Asset history becomes unclear (did we remove parts or credit them?)
    • Salesforce Field Service Mobile app may not handle negatives well

    Approval Flow Design

    Implement a simple approval process on Work_Order_Credit__c:

    HTML

     

    1. Technician/Dispatcher creates Credit record (Status = Draft)

    2. Submit for Approval → Status = Pending Approval

    3. Approval Process:

    - Approver: Service Manager (for credits <$500)

    - Approver: Finance Manager (for credits ≥$500)

    4. Approved → Status = Approved

    5. Finance exports via Report → Marks Finance_Processed__c = TRUE

    Finance Report View: Create a report type: "Work Order Credits with Line Items" filtered by:

    • Status = Approved
    • Finance_Processed__c = FALSE

    This gives Finance a clean export of unprocessed credits for ERP import.

    Asset History & Valuation

    To answer your question about Asset history:

    Create a custom Asset History related list using a Lightning component or report that shows:

    SQL

     

    SELECT

    WorkOrder.WorkOrderNumber,

    WOLI.LineItemNumber,

    WOLI.Quantity,

    ProductConsumed.QuantityConsumed,

    (SELECT Credit_Quantity__c, Reason__c FROM WOLI_Credits__r),

    (SELECT Credit_Quantity__c, Reason__c FROM Product_Consumed_Credits__r)

    FROM Asset

    WHERE Id = :assetId

    This gives you:

    • Original work: What the technician reported
    • Credits applied: What was corrected
    • Net result: Calculated field for true asset service history

    Implementation Roadmap

    Phase 1: Core Objects (Week 1-2)

    • Create Credit object and junction objects
    • Build page layouts and record types
    • Create validation rules (e.g., credit quantity ≤ original quantity)

    Phase 2: Approval Process (Week 2-3)

    • Configure approval process
    • Build email templates for approvers
    • Create Finance report view

    Phase 3: User Training & Rollout (Week 3-4)

    • Train dispatchers/service managers on credit creation
    • Train Finance on new export process
    • Monitor first 20 credits closely

    Phase 4: Inventory Prep (Future)

    • Add inventory location fields to Product Consumed Credits
    • Build "Return to Stock" automation
    • Test with Inventory Management pilot

    Real-World Example

    Scenario: Technician reports 4 hours labor + 2 parts on Work Order WO-12345 for Asset A-5678. Finance later discovers only 3 hours were actually worked, and 1 part was defective (should be credited).

    Without Credit Object (negative approach):

    • Modify WOLI to 3 hours (loses history of original 4)
    • Create Product Consumed with -1 quantity (confusing, may break inventory)
    • Asset history shows 3 hours (not the full story)

    With Credit Object (recommended):

    • Original WOLI: 4 hours (unchanged)
    • WOLI Credit: 1 hour credit, Reason = "Overbilling correction"
    • Original Product Consumed: 2 parts (unchanged)
    • Product Consumed Credit: 1 part, Reason = "Defective part"
    • Asset history shows: 4 hours performed, 1 hour credited = 3 net hours
    • Finance report shows both transactions for ERP reconciliation

    Pros & Cons Summary

    ApproachProsConsSeparate Credit Object

    (Recommended) | ✅ Complete audit trail 

    ✅ Inventory-compatible 

    ✅ Asset history clarity 

    ✅ Approval flow ready 

    ✅ Finance reporting flexibility | ⚠️ More objects to maintain 

    ⚠️ Slightly more complex data model 

    Negative Quantities

    | ✅ Simpler data model | ❌ Loses original technician data 

    ❌ Inventory issues 

    ❌ Asset history unclear 

    ❌ Reporting complexity 

    Modify Original Records

    | ✅ Simplest approach | ❌ No audit trail 

    ❌ Compliance risk 

    ❌ Can't distinguish tech error from correction

    Next Steps

    1. Validate with Finance: Confirm the Credit object export format meets their ERP import needs
    2. Prototype: Build Credit object in sandbox with 5 test scenarios
    3. Asset History Mock-up: Show stakeholders how Asset history will look with credits
    4. Inventory Team Input: If you have inventory stakeholders, get their review now
    5. Pilot: Run parallel (old manual process + new Credit object) for first month
0/9000

I am trying to use tabcmd command to login to tableau cloud. But getting the below error -

 

tableauserverclient\models\server_info_item.py:41: UserWarning: Unexpected response for ServerInfo: b'<!doctype html><html xmlns:ng="" xmlns:tb=""><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1,maximum-scale=2,width=device-width,height=device-height,viewport-fit=cover"><meta name="format-detection" content="telephone=no"><meta name="vizportal-config" data-buildid="2023_2_13_45okfkuyfo5" data-staticassetsurlprefix=""><link href="vendors-vizportal.css?6fe910e5f5e2a7ef44c8" rel="stylesheet"><link href="vizportal.css?6fe910e5f5e2a7ef44c8" rel="stylesheet"><script src="/javascripts/api/tableau-2.min.js?6fe910e5f5e2a7ef44c8"></script><script src="jquery.min.js?6fe910e5f5e2a7ef44c8"></script><script src="rsa.js?6fe910e5f5e2a7ef44c8"></script><script src="underscore-min.js?6fe910e5f5e2a7ef44c8"></script><script src="q.min.js?6fe910e5f5e2a7ef44c8"></script><script src="canvas-to-blob.min.js?6fe910e5f5e2a7ef44c8"></script><script src="js.cookie.min.js?6fe910e5f5e2a7ef44c8"></script><script src="mousetrap.js?6fe910e5f5e2a7ef44c8"></script><script src="core.min.js?6fe910e5f5e2a7ef44c8"></script><script src="vendors-vizportal.js?6fe910e5f5e2a7ef44c8"></script><script src="vizportal.js?6fe910e5f5e2a7ef44c8"></script></head><body class="tb-body"><div class="tb-app" id="app-root"></div></body></html>'

Invalid version: 'Unknown'

Exiting...

 

I am not the server administrator, i have creator license. Is it only for administrator who can login?

 

Actually I am looking for a workaround solution to send excel/csv report via automated email, as the subscription only has pdf option I cant send the excel/csv. Found that tabcmd can help to download workbook. But tabcmd is giving this error.

Any help/guidance would be appreciated....

5 answers
  1. Jul 6, 2023, 3:52 PM

    @Nabina Roy​ 

    Hi, To use Tabcmd, you must use Tabcmd 2.0 (I guess you are using it)

    https://tableau.github.io/tabcmd/docs/

     

    Are you trying to login using username and password?. If this is the situation, for Tableau Cloud you should use PAT.

    https://help.tableau.com/current/online/en-us/security_personal_access_tokens.htm

     

    and also, you should use it in tabcmd:

    https://tableau.github.io/tabcmd/docs/tabcmd_cmd.html#login

    @Nabina Roy​ Hi, To use Tabcmd, you must use Tabcmd 2.0 (I guess you are using it) Are you trying to login using username and password?. If this is the situation, for Tableau Cloud you should use PAT.If this post resolves the question, would you be so kind to "Select as Best"?. This will help other users find the same answer/resolution and help community keep track of answered questions. Thank you.

     

    Regards,

     

    Diego Martinez

    Tableau Visionary and Forums Ambassador

0/9000

I have a question about embedding Tableau views in our application.

 

Until now, we have been using Tableau Cloud's authentication and row-level security with published data sources, so each user can only see the data relevant to them. We're now in the process of embedding the views into our internal application, which also requires users to log in using the same email address associated to their Tableau licenses.

 

We created a connected app under the Tableau Cloud site owner's account. The documentation https://help.tableau.com/current/api/embedding_api/en-us/docs/embedding_api_user_attributes.html gives an example of how to include user attributes in the JWT:

 

Suppose you have an employee, Fred Suzuki, who is a manager located in the South region. You want to ensure that, when Fred reviews reports, he is only able to see data for the South region. In a scenario like this, you might include the Region user attribute in your JWT like in the Python example below.

 

import jwt

token = jwt.encode(

{

"iss": connectedAppClientId,

"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=5),

"jti": str(uuid.uuid4()),

"aud": "tableau",

"sub": user,

"scp": ["tableau:views:embed", "tableau:metrics:embed"],]

"Region":["South"],

},

connectedAppSecretKey,

algorithm = "HS256",

headers = {

'kid': connectedAppSecretId,

'iss': connectedAppClientId

}

)

 

The username column in the data source is Username, so it seems like instead of

 

"Region":["South"],

 

We'd need to have

 

"Username":["Username"],

 

Is that correct? Would that filter the data for that user only?

 

The documentation also says:

 

To ensure the user attributes from the JWT are passed to Tableau, the content must contain one of the following userattribute functions:

 

USERATTRIBUTE('attribute_name')

USERATTRIBUTEINCLUDES('attribute_name', 'expected_value')

 

To show only the data associated with the South region in the embedded workbook, the author can create a filter and customize it to show values when the South region is “True.” When the filter is applied, the workbook becomes blank as expected because the function is returning “False” values and the filter is customized to show “True” values only.

 

Does that mean that I need to apply that to every workbook?

 

In the example, the filter is applied to one sheet. If I have a workbook with 15 sheets, can I apply the filter at the data source level instead?

 

Finally, under "Known issues" it says

 

User attributes not available in published data sources

Support for published data sources that contain user attribute functions is not available today. As a temporary workaround, consider creating an embedded data source. An embedded data source allows the workbook to be published along with the data source instead of connecting to the published data source directly.

 

We only work with published data sources for privacy reasons (to ensure that each user can only access the data available to them.) What should we do? Does anyone know if this will be supported in the future, and when?

 

----

 

In summary, I'd like the same functionality we have now with Tableau Cloud authentication (i.e. users can only access their data) but have them log in to our application instead. What's the best approach to accomplish that?

 

Thank you very much for your help!

 

Zeke

5 answers
  1. May 24, 2023, 8:03 PM

    @Zeke Camusio​ 

    Hi, in this case you have two scenarios. The first one is the one you already have, and you don't need anything else.

     

    Your published data sources already have RLS implemented

    In this case, when you generate the JWT, you have to make sure to create it using the tableau user which already have the RLS configured in your data sources/workbooks (no need to encode attributes in your JWT):

    import jwt

     

    token = jwt.encode(

    {

    "iss": connectedAppClientId,

    "exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=5),

    "jti": str(uuid.uuid4()),

    "aud": "tableau",

    "sub": user,

    "scp": ["tableau:views:embed", "tableau:metrics:embed"],]

    },

     

    connectedAppSecretKey,

    algorithm = "HS256",

    headers = {

    'kid': connectedAppSecretId,

    'iss': connectedAppClientId

    }

    )

    In this case, the session will be signed in with the user you have used in the sub clause (sub: user). So, if you have already configured RLS in your data sources, then wonderful, RLS will keep working as usual.

     

    You want to pass info from your app, to the Tableau workbook

    User Attribute Function are a great way to communicate info from your web app to Tableau. The examples you would find in Tableau would include a Region attribute, but other options is that you could pass a number (budget, or a goal), you could pass a text (description of the team, position, a URL to load the picture of the person).

     

    If you use that info as a RLS or in a calculated field or as an image role, that depends on your dashboard and the use case you want to give to the info. You can retrieve the info with UAFs from the JWT you created.

     

    If your RLS does not depend on info stored in your Web App ((i.e you are using an entitlement table, or user filters already built in your data sources, or Virtual Connections with policies), then I don't think you should use JWT with extra attributes and UAFs

     

    If this post resolves the question, would you be so kind to "Select as Best"?. This will help other users find the same answer/resolution and help community keep track of answered questions. Thank you.

     

    Regards,

     

    Diego Martinez

    Tableau Visionary and Forums Ambassador

0/9000

I would like to send emails out to users with the links to the reports.

 

I have setup subscriptions but users just look at the attachments and don't click through to dive in the data.

 

we want to improve our usage, and having the users actually need to go to tableau online is what we want.

1 answer
  1. Mar 28, 2023, 4:24 PM
    • First create a new workbook...it must have some sort of data source but doesn't need to be real data
    • Within the workbook, create a calculated field called 'Header' with 'Click link below to view report' as the Calculation body

     

    First create a new workbook... 

    • Drop the newly created Header field on the Text mark (may need to adjust font of Header i.e. larger and bold)

     

    image 

    • Publish this workbook (Note: the name of the View will appear in the subscription email)
    • Go to the actual report you want to share and copy the share link

     

    imageimage 

    • Go to the published version of the Header view and Subscribe to the View

     

    image

    • Subscribe the appropriate users, Edit Subject accordingly (Subject name will appear in the email), paste the copied Share link in the Message (I like to add "Report link:" before the Share link) and finally set the subscription schedule

     

    image 

    • Users will receive an email that looks like this:

     

    image

    • Unfortunately Tableau disabled HTML subscription messages a few versions of Tableau Server/Online ago. Previously, we could create really nice custom massages without the default Tableau content. Hopefully they bring back HTML messages someday but "Security" was cited so it's probably a done deal.
0/9000

I am wondering if anyone had successfully integrated SF.  The criteria is that users' personal and private Info (private events/meetings) shouldn't flow down to SF from outlook.  with Private events/meetings should not sync 

0/9000

We have meetings showing as Salesforce Event records that was sent from an external user that includes multiple internal users that I don't want to appear in Salesforce.   After the event was created in Salesforce, I added all the external domains to the excluded domains over 12 hours ago, but these records are still in Salesforce.  So, why haven't these Salesforce events been removed from Salesforce?

 

The Office 365 event details are as follows:

Organizer: jsmith@excludeddomain1.com (excludeddomain1.com added to excluded domains)

Attendees: 

internaluser1@internaldomain.com (Salesforce user, but not a EAC user)

internaluser2@internaldomain.com (Salesforce & EAC user)

partner@excludeddomain2.com (exludeddomain2.com has also been added to excluded domains)

 

And none of the excluded domain attendees have contact or lead records in Salesforce.

0/9000

We are looking to replace Salesforce for Outlook with Outlook Integration and Einstein Activity Capture.

Using Salesforce for Outlook our users can  currently flag just those events that they want to be captured and any subsequent updates to those events in Outlook (date, time, location etc) are automatically synced across into Salesforce.

So far in my testing of Outlook Integration and Einstein Activity Capture it would not appear that this is possible. 

Capturing events manually can be achieved using Outlook Integration but any subsequent updates are not synced across. 

In Einstein Activity Capture it only appears that its possible to set it up to Capture/sync ALL events (apart from those marked private) or nothing.

Has anybody managed to use a combination of OI and EAC to allow selective capture with subsequent syncing of updates?

It had been suggested to us by a Salesforce rep early last year that we could achieve this by enabling EAC but having Autocapture of events switched off but I've since been advised that this is not the case.

Thanks

0/9000
Has anyone who implemented Lightning Sync experienced a new 'Birthdays' calendar which shows up in Outlook after the sync? Our users now see a Birthdays calendar, which when deleted immediately reappears upon sync. Upon reading some similar issues, the main suggestion is to edit the field mappings in the lightning sync configuration to not include the birthdate field, however, I have tried this and am still experiencing the issue.

 

I'm looking for anyway to prevent this calendar from syncing and showing up any longer as we do not want this enabled, primarily, because it creates automatic reminders for all these birthday events...when you have a lot of contact data, this is frustrating to have reminders everyday!
0/9000

Hello everyone, 

 

We have several meetings syncing where the only people in them are internal. I have always had our internal domain in the excluded list, and they are coming anyway. Any other ideas on how to prevent those? I doubt I'll be able to reliably get the company to set some meetings to private so that is not a viable solution in this case. Thanks.

0/9000

Hello Experts,

 

Tableau sever version - 2019.4.1

 

We are facing problem with Tableau dashboard embedded in web portal. It was working fine but from few days we started facing issue. Whenever the user tries to open the dashboard embedded on web portal it shows login page of tableau server even after clicking on login and goes through the normal login procedure it goes back to same login page.

 

The link of the dashboard embedded in web looks like this ( link I have manipulated )

 

https://SERVERNAME/CA/views/MyDashboard_v1_2/MyDashboard?:embed=y&:display_count=no&:showAppBanner=false&%20iframeSizedToWindow=true&:showVizHome=no?:embed=yes&:toolbar=no&supervisoremailid={{Email}}

 

Even our technical team worked on testing this link on simple web portal and it is not working.

 

For unknown to us reason reports does not work in iframes any more.

 

Even just pure static HTML with 2 iframes and it has exactly the same issue as in web tool.

 

Your help on this is much appreciated!

 

Thanks

Sandesh

4 answers
  1. Dec 4, 2020, 8:15 PM

    RESOLVED! Mine was an issue with the URL. When I copied and pasted the URL into my Desktop Tableau, I pasted the entire URL with a fully qualified domain name:

    https://server.company.com/#/views/workbook...

    It works there because it has to cross server boundaries, BUT when I move it to the online server, I have to edit the URL to REMOVE part of the domain:

    https://server.company.com/#/views/workbook...

    It is now:

    https://server/#/views/workbook...

    This is because it is all on the same server. (I am going to assume if someone held dashboards on another server, they would need to include the entire fully qualified domain name.)

0/9000

I need to plug my JS library to report.

About my task:

This library will send information about report height to window.parent and I'll change iframe height

 

I can't find something of this

But I found "Extention" and I made this (see uploaded file)

But on my screen I see:

The DataSources Sample extension (url: https://tensorzuev.github.io/tableau.html) is not on the safe list for this site, and is therefore not allowed to run. Contact your site administrator to add this extension to the safe list.

 

Is it about CORS? Or is it something about tableau settings?

 

<?xml version="1.0" encoding="utf-8"?><manifest manifest-version="0.1" xmlns="http://www.tableau.com/xml/extension_manifest">  <dashboard-extension id="com.tableau.extensions.samples.datasources" extension-version="0.6.0">    <default-locale>en_US</default-locale>    <name resource-id="name"/>    <description>DataSources Sample</description>    <author name="tableau" email="github@tableau.com" organization="tableau" website="https://www.tableau.com"/>    <min-api-version>0.8</min-api-version>    <source-location>      <url>https://tensorzuev.github.io/tableau.html</url>    </source-location>    <icon>iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAlhJREFUOI2Nkt9vy1EYh5/3bbsvRSySCZbIxI+ZCKsN2TKtSFyIrV2WuRCJuBiJWxfuxCVXbvwFgiEtposgLFJElnbU1SxIZIIRJDKTrdu+53Uhra4mce7Oe57Pcz7JOULFisViwZ+29LAzOSjQYDgz1ZcCvWuXV11MJpN+OS/lm6179teqH0yDqxPTCyKSA8DcDsyOmOprnCaeP7459pdgy969i0LTC3IO/RQMyoHcQN+3cnljW3dNIFC47qDaK3g7BwdTkwBaBELT4ZPOUVWgKl4ZBnjxJPUlMDnTDrp0pmr6RHFeEjjcUUXPDGeSEwDN0Xg8sivxMhJNjGzbHd8PkM3eHRfkrBM5NkcQaY2vUnTlrDIA0NoaX+KLXFFlowr14tvVpqb2MICzmQcKqxvbumv+NAhZGCCIPwEw6QWXKYRL/VUXO0+rAUJiPwAk5MIlgVfwPjjHLCL1APmHN94ZdqeYN+NW/mn6I4BvwQYchcLnwFhJMDiYmlRxAzjpKWZkYkUCcZ2I61wi37tLbYyjiN0fHk5Oz3nGSLSzBbNHCF35R7f6K1/hN9PRhek11FrymfQQQKB4+Gl05P2qNRtmETlXW7e+b2z01dfycGNbfFMAbqNyKp9Jp4rzOT8RYFs0njJkc2iqsCObvTsOsDWWqA5C1uFy+Uz/oXJeKwVT4h0RmPUXhi79vuC0Ku6yOffTK3g9lfxfDQAisY516sg5kfOCiJk7HoLt2cf9b/9LANAc7dznm98PagG1fUOZ9IP5uMB8Q4CPoyNvausapkTt3rNMuvdf3C/o6+czhtdwmwAAAABJRU5ErkJggg==</icon>    <permissions>      <permission>full data</permission>    </permissions>  </dashboard-extension>  <resources>    <resource id="name">      <text locale="en_US">DataSources Sample</text>    </resource>  </resources></manifest>The DataSources Sample extension (url: https://tensorzuev.github.io/tableau.html) is not on the safe list for this site, and is therefore not allowed to run. Contact your site administrator to add this extension to the safe list.
3 answers
  1. Jul 14, 2019, 10:18 AM

    Hi,

     

    Have a look at the documentation of the Tableau Javascript API; this will help you embed a Tabelau visualisation on a webpage, even on different domains.

    Tableau JavaScript API - Tableau

     

    You can do some really nice stuff with it!

     

    Kind regards,

    Johan de Groot

0/9000

Hi, I’m setting up Einstein Activity Capture (EAC) between Outlook and Salesforce and have encountered an issue:

  • When a user creates events in Outlook, they sync correctly to the related Contact and Account records.
  • However, these events are not syncing to the related Opportunity record.
  • I can confirm that emails sync perfectly to Opportunities, so the issue seems specific to events.

 

Here’s what we’ve confirmed so far:

  • We are using Opportunity Contact Roles.
  • The configuration is set to sync Events in both directions.
  • The event and opportunity meet the 60-day date-range criteria.
  • The “Relate synced events to Salesforce records” setting is enabled.
  • All EAC settings are turned on, including Sync Email as Salesforce Activity”.
  • Emails sync to Opportunities, so the issue seems specific to events.

 

We have also considered creating a custom record-triggered flow to relate new events to Opportunities. However, this would then trigger for all events, including those created manually by users, which we don't want. If there were a way to distinguish EAC-created events from manually created ones, this approach might work - but we haven’t found such an option yet. 

 

Questions:

  • Is it possible to sync EAC events to Opportunities? 
  • Has anyone experienced this issue and found a good solution?

 

Thanks in advance for your help!

0/9000

We are currently utilizing Tableau Server Cloud for our reporting needs and would like to enhance our subscription email capabilities. Specifically, we are looking to:

  1. Include Excel (.xlsx) files as attachments in subscription emails.
  2. Embed report images directly into the body of the email as HTML content, rather than just including a link or PDF.

Could you please let us know if these features are currently supported? If not, are there any available workarounds or planned roadmap items that address these functionalities?

Your support and guidance on this matter would be greatly appreciated.

0/9000

I have a visualforce page that allows me to select a Service Appointment from a Work Order and generate the Service Report for it. The Apex in the background saves the Service Appointment as a pdf to the Work Order record. When I go to create an email and send the pdf as an attachment, the email is received, but the attachment is an html link to the file in Salesforce. We are emailing this to non-salesforce users, so that is not working so well. Is there a native way to get the PDF and send t as a true attached document without buying a third-party app?   

1 answer
  1. Sep 19, 2025, 7:34 PM

    You need to change Email Attachment settings.  

      

    Go To

    Setup | Email Attachments

     

    New Setting:

    Include as attachment up to Salesforce email size limit or as links if more

     

    Click

    Save

    -

    Salesforce's Email size limit is 25MBYou need to change Email Attachment settings. Go To Setup | Email Attachments New Setting: Include as attachment up to Salesforce email size limit or as links if more Click Save.

0/9000

We are facing an issue with Engagement Splits in Journey Builder.

We have a journey with 8 emails. In each step, we add Engagement Splits to track clicks on specific links (using link alias such as agenda or campus). The configuration process works fine at first — we select the email, choose the link, save, and activate.

However, in some of the emails, when we go back and reopen the Engagement Split, the link configuration disappears (no link selected, folder location sometimes missing). This doesn’t happen in all emails — for some, the configuration stays saved and works as expected, but for others, it looks as if the split is not configured anymore, even though we already saved it.

We tested with published emails, duplicated versions, added waits before the split, and ensured alias is properly set in the HTML. The problem persists randomly only with some emails, not all.

Has anyone experienced this behavior? Could this be a caching or asset reference issue in Journey Builder? Any best practices to ensure Engagement Split configurations remain stable after saving?

Thanks in advance!   

1 answer
  1. Sep 18, 2025, 9:00 AM

    Hi @Rosendo Silva

    - This is a known quirk in Marketing Cloud when Engagement Split loses its saved link reference. 

    Things that usually prevent it:

    • Publish the email before linking 

      – Make sure the email is fully published (not just saved) and you’re selecting the latest published version when configuring the split.

    • Use a stable link alias 

      – Every link you track needs a unique, lowercase alias in the HTML. If the alias is changed later or reused elsewhere, the split can’t find it and the config disappears.

    • Avoid moving or renaming assets 

      – Don’t move the email to another folder or rename it after it’s referenced in a journey. That breaks the stored path.

    • Clear cache / re-open journey carefully 

      – Edit the journey in a fresh browser session or incognito window and save/activate again. Some users report that stale browser cache causes the UI to drop the link on reopen even though the backend still tracks it.

    If none of this stabilizes the configuration, open a Salesforce Marketing Cloud support case.

0/9000
Hi Guys,

 

I have created a Salesforce Web-to-Lead Form (ensuring first that the "Web-To-Lead" Enabled" checkbox is ticked).

 

I have embedded the HTML into my website and included the "<input type="hidden" name="debug" value=1>" code to ensure that I get a report if there are any issues.

 

I received an email "Salesforce Could Not Create This Lead" with the Reason of:

 

"You Must Enter a State".

 

Does anyone know what this means exactly? Is it calling for the addition of a "State" field in my form i.e. Australian States such as "NSW", "VIC" etc?

 

Any help would be appreciated.

 

 
0/9000
Hi Salesforce World,

 

This seems so simple on the surface, but I have not figured out a setting or method to implement.

 

Within simple Sales Cloud (that is, without employing elaborate tools like Pardot or Marketing Cloud), when one sends an List Email to a Campaign list is there any way to (automatically) track which Campaign Members have responded?  In theory one could then apply very basic automation, such as removing those who responded from one Campaign and adding them to a follow-up Campaign, or creating a Task to call them, or some other action.

 

Anyone?  :-) 
9 answers
  1. Michael Brown (Salesforce) Forum Ambassador
    Oct 26, 2020, 8:05 PM
    Hey Gene. Good news! I think I found a way to identify opens. If you use the report type HTML Email Status, this appears to work on List Emails, allowing you to see which of the recipients opened that email

     

    Hey Gene. Good news! I think I found a way to identify opens.

     

    You should be able to use this report to help identify which of those Campaign Members you wish to update. Unfortunately, it doesn't show the actual Contact/Lead record the email is associated with. Instead, it gives an email address, which you could then use to pinpoint the Contact/Lead. 

     

    Thanks,

     

    Mikey
0/9000

When we send eblasts in Pardot, we always go to the “test” page and send a test email to ourselves and share it with the team for proofreading/another set of eyes. When one sends a test email, you receive two emails; an HTML and a text version. It appears that our team is not receiving the HTML versions and only the text versions are coming through. They indicate that they are not seeing them in the Spam report either. Any ideas on what steps we should take to resolve this? (Note: When the team sends those proofs over to me, two came with both HTML and Text and the rest were text version only.)

0/9000

Hello,

 

With the help of @Keiji Otsubo, I was able to get the url hack to work to download a report in CSV format per this thread: 

 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X6C9ZSAV

 

The next step is I want to be able to automate this view PowerShell.  I know this would be all based on url hacks which could fail in the future, but in the meantime I want to try :)

 

I was able to use the Salesforce CLI to authenticate, so that's good. But looking at this: https://salesforce.stackexchange.com/questions/381515/retrieve-a-report-via-sfdx but as noted, this seems to be the report metadata, so I think this is a dead end right? 

 

Alternatively I tried to use the Invoke-WebRequest per a link like this: https://adamtheautomator.com/powershell-download-file/ but that ends up downloading an HTML file that starts with this: 

 

"

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

    <meta HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

 

<script src="/jslibrary/1699262264248/ui-sfdc-javascript-impl/SfdcCore.js"></script><script src="/jslibrary/1698336665248/sfdc/AuraAlohaFrameNavigator.js"></script>

 

<script>

function redirectOnLoad() {"

 

Instead of the actual CSV I get when going to that same url in a web browser that I put in the Invoke-WebRequest line.

 

Unfortunately I can't use the subscription and standard email route because I have exhausted the number of reports I can subscribe to as a user. 

 

Any thoughts on this? I feel like I'm actually pretty close!

7 answers
0/9000