Meliorainsights.com
  • Home
  • Tableau CRM
  • Blog
  • Non-Profits
  • Our Clients
  • About
  • Trading Studio

​Meliora Insights, LLC

​Data Cloud | CRM Analytics  (TCRM / Einstein Analytics) Consulting
​meliora - 'for the pursuit of the better'


A blog series distilling quantitative concepts /use-cases in CRM Analytics  (Einstein Analytics).

Picture

App versioning regime when developing in production.

4/18/2023

0 Comments

 
Prep Work:
Create 2 apps in CRM Analytics -- one to contain to contain new / modified work for UAT testing (PreProd Testing) and another to contain archived copies (Archived Dashboards). Additional apps may be created to contain the same assets as it moves though varying stages of approval. (example: PreProd > UAT Testing >  Archive)


  • For modification of recipes/dataflow, backup JSON  before modifying.
  • For "new work" involving Dashboards, proceed to Production Deployment, step 3
  • For enhancement / repair requests for current dashboards in production, clone current dashboard, tag the cloned dashboard with the User Story number and save in 'PreProd Testing' app. This will be the replacement and once finished, will be presented to the stakeholder for testing.  After approval, the replacement dashboard will be deployed.


Production Deployment: 
  1. Rename the current dashboard and save in Archived Dashboards app. This copy (aka 'legacy' copy)  will have a  "pre"+ user story number suffix attached to it.
  2. Clone the replacement dashboard and save it in Archived Dashboards app. This will have a "post"+ user story number suffix attached to it.
  3. Rename the replacement dashboard by removing the prefix and saving it in the production app.
  4. Repoint any navigation links to the new dashboard.
  5. Verify the links and the placement of the 3 dashboards. Archived Dashboards should have two new assets-- the legacy and replacement dashboards and the production app should have the new dashboard.


Example:
User Story 1234 requests a color change and 2 additional filters for the 'Top Accounts'  (Dashboard ID 1) contained in the Sales Analytics app.


  • 'Top Accounts' to be cloned as 'Top Accounts_1234'  (Dashboard ID 2) and save in PreProd Testing.


  • Color change and 2 additional filters added to 'Top Accounts_1234' and submitted to stakeholder for approval.


  • After approval,  production deployment steps are done.
    1. Move the legacy dashboard (ID 1) to Archived Production app , renaming it as 'Top Accounts_pre_1234 '.
    2. Clone 'Top_Accounts_1234' (ID 2) as 'Top Accounts_post_1234' (ID 3) and save to Archive Production app.
    3. Remove the suffix and move 'Top Account_1234 (ID 2) to Sales Analytics  app.
    4. Repoint navigation links to point to 'Top Account' (ID 2).
    5. Verify the navigation links and that
 'Top Accounts_pre_1234  (ID 1)  > Archived Dashboards
 'Top Accounts_post_1234' (ID 3) > Archived Dashboards
 'Top Accounts' (ID 2) >  Sales Analytics.
0 Comments

User Story: Surface any trends in oppty amount changes thru time. Code below shows Case statements to detect shifts in oppty changes which can then be rendered in a waterfall chart.

4/9/2023

0 Comments

 
​q_b = load "0Fb1T000000ob0mSAA/0Fc1T000006fBb4SAE";
q_a = load "0Fb1T000000bmx9SAA/0Fc1T000006fHN3SAM";
q_a=filter q_a by !('StageHGI' in ["Dormant", "Duplicate"]);
q_b=filter q_b by 'OpportunityRecordType.Name' in ["Renewal Business - FRR","Cross-sell - FRR", "New Business - FRR", "Upsell/Add-On - FRR"];
q_b= filter q_b by date('Snapshot_Date_Year', 'Snapshot_Date_Month', 'Snapshot_Date_Day') in ["15 days ago".."15 days ago"];
q_a=filter q_a by 'RecordType.Name' in ["Renewal Business - FRR","Cross-sell - FRR", "New Business - FRR", "Upsell/Add-On - FRR"];
--q_a = foreach q_a generate 'Id' as 'Id','StageHGI' as 'StageHGI', case when ( 'StageHGI' == "Closed Won") then "Closed Won" when  ('StageHGI' == "Closed Lost") then "Closed Lost" when('Deal_Status_MASTER__c' != "Forecast") then "Non Forecast"  else  "ok"  end as 'Bins','TotalAACV' as 'TotalAACV', 'CloseDate' as 'CloseDate', case when date( 'CloseDate_Year','CloseDate_Month', 'CloseDate_Day') in  ["current fiscal_quarter".."current fiscal_quarter"] then "ValidDt" else "InvalidDate" end as 'DateFilterA',case when 'RecordType.Name' == "Renewal Business - FRR" then 'TotalAACV' - 'AACV__c' else 'TotalAACV' end as 'RealAACV';
q_a = foreach q_a generate 'Id' as 'Id','StageHGI' as 'StageHGI', case when ('StageHGI' == "Closed Won") then "Closed Won" when ('StageHGI' == "Closed Lost") then "Closed Lost" when ('Deal_Status_MASTER__c' != "Forecast") then "Non Forecast"  else  "ok"  end as 'Bins','TotalAACV' as 'RealAACV', 'CloseDate' as 'CloseDate', case when date( 'CloseDate_Year','CloseDate_Month', 'CloseDate_Day') in  ["current fiscal_quarter".."current fiscal_quarter"] then "ValidDt" else "InvalidDate" end as 'DateFilterA';
res_a= foreach q_a generate 'Id' as 'Id','StageHGI' as 'StageHGI', 'Bins' as 'Bins','RealAACV' as 'RealAACV', 'CloseDate' as 'CloseDate', 'DateFilterA' as 'DateFilterA';
--q_b = foreach q_b generate 'Id' as 'Id','Snapshot_Date' as 'snapB','Bins' as 'Bins','TotalAACV' as 'TotalAACV', 'CloseDate' as 'CloseDate', case when date( 'CloseDate_Year','CloseDate_Month', 'CloseDate_Day') in ["current fiscal_quarter".."current fiscal_quarter"] then "ValidDt" else "InvalidDate" end as 'DateFilterB',case when 'OpportunityRecordType.Name' == "Renewal Business - FRR" then 'TotalAACV' - 'AACV__c' else 'TotalAACV' end as 'RealAACV';
q_b = foreach q_b generate 'Id' as 'Id','Snapshot_Date' as 'snapB','Bins' as 'Bins','TotalAACV' as 'RealAACV', 'CloseDate' as 'CloseDate', case when date( 'CloseDate_Year','CloseDate_Month', 'CloseDate_Day') in ["current fiscal_quarter".."current fiscal_quarter"] then "ValidDt" else "InvalidDate" end as 'DateFilterB';
res_b= foreach q_b generate 'Id' as 'Id','snapB' as 'snapB','Bins' as 'Bins','RealAACV' as 'RealAACV', 'CloseDate' as 'CloseDate', 'DateFilterB' as 'DateFilterB';
combo = group res_a by 'Id' full, res_b by 'Id';
combo= foreach combo generate res_a.'Id' as 'Id',first(res_a.'StageHGI') as 'StageHGI',  sum(res_a.'RealAACV') as 'AmtA', first(res_a.'CloseDate') as 'CloseDateA', first(res_a.'DateFilterA' )as 'DateFilterA',first(res_a.'Bins') as 'BinA', first(res_b.'Bins') as 'BinB',first(res_b.'DateFilterB' )as 'DateFilterB', sum(res_b.'RealAACV') as 'AmtB', first(res_b.'CloseDate') as 'CloseDateB';
combo2= foreach combo generate 'Id' as 'Id', 'AmtA' as 'AmtA', 'CloseDateA' as 'CloseDateA', 'DateFilterA' as 'DateFilterA', 'BinA' as 'BinA', 'BinB' as 'BinB', 'DateFilterB' as 'DateFilterB', 'AmtB' as 'AmtB','CloseDateB' as 'CloseDateB', coalesce((case when 'BinB' !="ok" and 'DateFilterA'=="ValidDt" and 'BinA' =="ok" then 'AmtA' when 'BinB' =="ok" and DateFilterB =="InvalidDate" and 'DateFilterA' == "ValidDt" and 'BinA' == "ok" then  'AmtA' when ('BinB' is null and 'DateFilterA'=="ValidDt" and 'BinA' =="ok") then 'AmtA' when ('BinB' == "ok" and 'DateFilterB'=="ValidDt" and 'BinA' =="ok" and 'DateFilterA' =="ValidDt" and 'AmtA' !='AmtB') then ('AmtA' -'AmtB') when ('BinB' == "ok" and 'DateFilterB'=="ValidDt" and 'BinA' == "Closed Won") then 'AmtB' * (-1) when ('BinB' == "ok" and 'DateFilterB'=="ValidDt" and 'BinA' =="Closed Lost") then 'AmtB' * (-1)  when ('BinB' == "ok" and 'DateFilterB' == "ValidDt" and 'DateFilterA'== "InvalidDate") then 'AmtB' * (-1)  when ('BinB' == "ok" and 'DateFilterB' == "ValidDt" and 'DateFilterA' != "InvalidDate" and 'BinA' != "ok") then  'AmtB' * (-1)end),0) as 'Adjustments', (case when 'BinB' !="ok" and 'DateFilterA'=="ValidDt" and 'BinA' =="ok" then "Status Upgrade" when 'BinB' =="ok" and DateFilterB =="InvalidDate" and 'DateFilterA' == "ValidDt" and 'BinA' == "ok" then "PulledIn"  when ('BinB' is null  and 'DateFilterA' == "ValidDt" and 'BinA' =="ok") then "New" when 'BinB' =="ok" and 'DateFilterB' =="ValidDt" and 'BinA' =="ok" and 'DateFilterA' =="ValidDt" and 'AmtA' !='AmtB' then "Amt Inc or Dec"  when ('BinB' =="ok"and 'DateFilterB'=="ValidDt" and 'BinA' == "Closed Won") then "Closed Won" when ('BinB' =="ok"and 'DateFilterB'=="ValidDt" and 'BinA' =="Closed Lost") then "Closed Lost" when ('BinB' == "ok" and 'DateFilterB' == "ValidDt" and 'DateFilterA' == "InvalidDate") then "Pushedout" when ('BinB' == "ok" and 'DateFilterB' == "ValidDt" and 'DateFilterA' != "InvalidDate" and 'BinA' != "ok") then "Downgraded" end) as 'AdjCode';
combo3 = group combo2 by 'AdjCode';
combo3 = foreach combo3 generate  'AdjCode' as 'AdjCode', sum('Adjustments') as 'Adjustments';
combo4 = filter combo3 by 'Adjustments' != 0;
combo4 = group combo4 by 'AdjCode';
combo4 = foreach combo4 generate 'AdjCode' as 'AdjCode', sum('Adjustments') as 'Adjustments';
snap1 = filter combo by 'BinB' =="ok" and 'DateFilterB' =="ValidDt"and !('StageHGI' in["Dormant","Duplicate"]);
snap1=group snap1 by all;
snap1 = foreach snap1 generate "Starting Forecast" as 'AdjCode', sum('AmtB') as 'Adjustments';
snap2 = filter combo by 'BinA'=="ok" and 'DateFilterA'  == "ValidDt";
snap2= group snap2 by all;
snap2 = foreach snap2 generate "Ending Forecast" as 'AdjCode', sum('AmtA') as 'Adjustments';
finalRes = union snap1,combo4, snap2;​
Picture
0 Comments

Neat CRMA Hack of embedding links inside containers to create selector buttons effect.

4/7/2023

0 Comments

 
Links is a CRMA widget class that is used to navigate between url's,  pages, and layouts. The default of this widget is a button . However, one can also use images embedded in a container to 'house'  links. In this use-case, we will be using 2 links-- 
Link # 1 to go from page 1 to page 2 . This link#1 is located in page 1.
Link # 2  to go from page 2 back to page 1. This link#2 located in page 2.

Step 1: drag container #1 in page 1, pick "deselect " file as its background image.
Step 2: drag a link and maximize it inside container. Make it invisible by widget style>background color>custom and slide color all the way to left. Fill out the 'Link to' dialogue boxes to go from page 1 to page 2.
Step 3: go to page 2, drag container#2,pick 'selected' file as its background image.
Step 4: drag a link and maximize it inside container #2 Make it invisible by widget style>background color>custom and slide color all the way to left. Fill out the 'Link to' dialogue boxes to go from page 2 to page 1.
Step 5: drop a text field next to the 2 containers to label  buttons appropriately. "Show Page 2" and "Show page1"
​Snip below shows 'deselect' and 'select'  images .
Picture
0 Comments

    Archives

    June 2025
    April 2025
    January 2025
    November 2024
    August 2024
    April 2024
    March 2024
    February 2024
    January 2024
    December 2023
    June 2023
    May 2023
    April 2023
    March 2023
    February 2023
    December 2022
    October 2022
    September 2022
    July 2022
    April 2022
    March 2022
    January 2022
    November 2021
    June 2021
    April 2021
    March 2021

Site powered by Weebly. Managed by Hostwinds
  • Home
  • Tableau CRM
  • Blog
  • Non-Profits
  • Our Clients
  • About
  • Trading Studio