Professional Documents
Culture Documents
Description Integrate Solstice data into Nexus CRM-Analytics and publish the Royalty Sales & Invoice Dashboard.
Developer
QA
Table of Contents:
Business Purpose
Development Items
Development Details
Systems & Tools Involved
Salesforce Object and Fields
CRMA Assets
'Licensee Stores & Community Users v3' Recipe
Royalty Invoice Recipe
Branding
Metadata
LS Star Royalty Invoicing Support Request Process
Store Errors Support Request Process
Automation
Users
Deployment
Video Documentation
Support Team FAQ
JIRA Stories/Tasks/Bugs
Wireframes
Additional Dashboard Details
Business Purpose
Original Pain Points
No dashboard existed to provide a high-level analysis of sales and transaction counts on a month-by-month basis.
The SBUX Accounting team had to manually send PDFs of royalty invoices to every user that requested it, thus, the PDF request
process became inefficient.
Solution
Royalty Sales and Invoice Dashboard: This dashboard enables external LS Star users with Royalty Invoicing access to interact with
a high-level snapshot of the business across key metrics and access PDFs of royalty invoices in an interactive data table. It brings
together key metrics such as Gross Sales, Net Sales, Total Transactions, as well as more specific metrics such as Net Sales based
on Beverage, Food, and Merchandise. These views and tables can also be filtered down by Licensee, Store, Invoice Month, and
Channel (MOP or Cafe). The dashboard also brings convenience to the invoice record process and will alleviate the manual process
of invoice requests submitted to the accounting team. This invoice data table can be filtered down by Year, Period, Licensee, Store,
Invoice Number, and Invoice Type. The Royalty Sales and Invoice dashboard lives in LS Star under the Digital Services page.
Persona
External LS Star users with specific store/licensee access can access the Royalty Sales & Invoice dashboard and see relevant store
/licensee data. Internal users can view all data on the Royalty Sales & Invoice dashboard.
Development Items
Configuration
System / Tools
Salesforce Objects
CRMA Assets
Branding
Metadata
LS Star Support Request Process
Store Errors Support Request Process
Automation and Schedules
Users
Permission Sets
Permission Set Groups
Public Groups
Deployment
Videos
FAQs
Jira Stories
Wireframes
Additional Details
Development Details
Required Capabilities of the Royalty Sales & Invoice Dashboard:
The following is a list of fields created on the Royalty Object which get loaded by the integration:
Oracle EBS JSON Attributes Salesforce Object Salesforce Field Name Salesforce Field Label
CRMA Assets
The Royalty Sales & Invoice Dashboard is made up of a few CRM Analytics Assets:
Royalty Sales & Invoice Dashboard Dashboard Functions as the dashboard users will use.
Starbucks Community App Analytics Controls access to all CRMA Assets related to the capability. This app is set to be
App viewable by the Royalty Sales & Invoice CRMA Access Public Group.
Royalty Object and Content Version Periodic Full Used to pull invoice related data into CRMA. The Royalty Object is configured with
Data Syncs in the SFDC Local Data Sync Sharing Inheritance turned on.
Revenue Sales Store Data Errors Dataset Used to load store errors manually into CRMA.
Royalty Invoice Recipe Recipe Used to take data from the Royalty and Content Version data syncs and transform the
data in a way that it is ready for the dashboard.
Licensee Stores and Community Recipe Used to take the Revenue Sales Dataset and transform the data in a way that it is ready
Users v3 for the dashboard.
Royalty Invoice Dataset Dataset The output of the Royalty Invoice Recipe that feeds into the dashboard.
Store – Daily Revenue v2 Dataset The output of the Licensee Stores and Community Users V3 recipe that feeds into the
dashboard.
The following is a list of fields created on the DailyStoreSalesTransactions which get loaded by the integration:
STORESALERECORDID
STORENUMBER
BUSINESSDATE
CURRENCYCODE
CUSTOMERORDERCHANNELNAME
Input Dataset
Daily Store Sales Transactions
1. This data is provided by the Solstice team in the form of a CSV. It follows the same structure as the data design above with
all the same columns.
Recipe
Transformations
1. Create Revenue Sales Join Key: Transform Store Number to text and create an Error Key column that concatenates Store
Number, Year, and Month.
2. Create Dashboard Show Date Logic: Transformed the input dataset by creating a new column that adds 1 month to the
business date. This column will be used to filter the data in the dashboard so that after the 5th of the current month, the
previous completed month in addition to months before that are only shown in the dashboard.
Join – Store Account Information
1. Left Joined the Account object with the input dataset to match the Store Number field in both datasets. This join helps us
look up and identify relevant information about stores from their number such as the Store Name, Account ID, Account
Name, and Parent Account.
Join – Licensee Account Information
1.
1. Left Joined the Account object with the input dataset to match the Account ID field in both datasets. This join helps us look
up and identify relevant information about stores from their account ID such as Licensee Account Store Number, Licensee
Account ID, Licensee Account Name, and the Licensee Account Parent ID.
Join – Revenue Sales Store Data Errors
1. Transformed the Revenue Sales Store Data Errors dataset to change the Store Number column into text and create an
Error Key column that concatenates Store Number, Year, and Month.
2. Left joined the Revenue Sales Store Data Errors dataset with the input dataset to match the Error Keys in both datasets as
the unique identifier for a custom error message for specific store in a specific year-month.
Join – Royalty Data
1. Transformed the Royalty object by creating the Royalty Invoice Join Key that concatenates the Store Number, Royalty
Start Date - Year, and Royalty Start Date - Month.
2. Lookup Joined the input dataset to the Royalty object and match the Revenue Sales join key to the Royalty Invoice join key.
Week Formatting
1. Created a Week Formula column that groups the day of the business date field by 5 weeks. Week 1 = Days 1-7, Week 2 =
8-14, Week 3 = 15-21, Week 4 = 22-28, and Week 5 = 29-31 (week 5 may become optional depending on month). This
column is used as the date axis in the visualizations on the Sales home page.
Output Dataset
The output dataset that drives this dashboard includes all the fields in the data design in addition to 4 joins and 5 transformations.
Input Object
Royalty Object
1. The Royalty object data sync has the following fields that are synced daily.
Record ID
Currency ISO Code
Transaction Class
Type
Invoice Number
Term Name
Invoice Date
Amount
Due Date
Creation Date
Store Number
Period
Original Invoice
Royalty Start Date
Royalty End Date
Invoice Type
Expired PDF Invoice
External Id
Recipe
Joins
1. Join Store Attributes
Lookup Join the Store Object to match the Store Number fields on both the Royalty and Store Objects. This join
helps us look up and identify relevant information about stores from their number such as the Store Name,
Account ID, Account Name, and Parent Account.
2. Join Content Details
ContentVersion object has the following fields that are synced daily: ContentVersion ID, ContentDocument ID, and
External Id.
Lookup Join the ContentVersion object to match External Id fields on both the Royalty and ContentVersion objects.
3. Join Store Errors
Transformed the Revenue Sales Store Data Errors dataset to change the Store Number column into text and
create a Join Key column that concatenates Store Number, Year, and Month.
3.
Left joined the Revenue Sales Store Data Errors dataset to match the Join Keys in both datasets as the unique
identifier for a custom error message for specific store in a specific year-month.
Transformations
1. Created a Content Link column that dynamically updates the PDF link for an invoice number in any environment. Also
added the Join Key column that concatenates Store Number, Year, and Month.
2. Transformed the input dataset (after all joins and 1st transformation) by creating a new column that adds 1 month to the
business date. This Dashboard Show Date column is used to filter the data in the dashboard so that after the 5th of the
current month, the previous completed month in addition to months before that are only shown in the dashboard. When the
column returns false for a row, that row of data should be seen on the dashboard.
Output Dataset
The output dataset that drives this dashboard includes 3 objects (Royalty, Store, and ContentVersion), and 1 joined dataset
(Revenue Sales Store Data Errors).
Branding
Royalty Sales & Invoice Dashboard follows branding information provided by the business and wireframes provided at the bottom of this page.
Color Codes:
UI/UX enhancements have been made to keep the dashboard cohesive with LS Star design standards.
Metadata
CRM Analytics Datasets Metadata files can be downloaded from the dataset in CRM Analytics by going to the dataset, and under Extended Metadata,
clicking download. These can be manually loaded to new environments, or migrated via change set, however CRM Analytics can sometime show to
be inconsistent deploying metadata via change sets or Copado.
There are 3 new support types for the Royalty Sales and Invoice dashboard in the LS Star Support Request Form.
Royalty Invoicing Dashboards Access
Royalty Invoicing Dashboards Data
Royalty Invoicing Dashboards Other
These support types can only be viewed in the support request form if you have access to the dashboard.
All support requests for the Royalty Sales and Invoice dashboard will be routed to the DBS team.
Please refer to the LS Star documentation for a detailed look into the LS Star support request process: https://docs.starbucks.com/display
/APM/Nexus+-+LS+STAR+Support
Overview:
Automation
Job Time Duration
ContentDocumentLinkTrigger (countAttachment): A logic to share PDF files with external user is added to Before Insert method on
ContentDocumentLinkTriggerHandler class. When PDFs files are uploaded by Integration user, title of PDF starts with “RoyaltyInvoicing” and attached
to Royalty records then File visibility is set to “AllUsers” and Sharetype is updated to I(sharing set by record).
Flow: Royalty Invoice - Expire PDF Invoices: It is a scheduled flow on Royalty object to identify Royalty records whose PDFs need to be expired /
deleted.
Flow: Royalty Invoice - Populate Lookups: It is a scheduled flow on Royalty object to populate Store and Licensee lookups upon create and update.
Flow: SL Update Royalty Invoicing Flag: It is a record trigger flow (before insert/update) on AccountContactRelation(ACR) obj. This flow updates Roya
lty Invoicing Updated Today? custom field to true when following conditions are met:
ManageRoyaltySharingforACRBatch: This batch class provide access to Royalty records to user if following conditions are met:
1. Royalty Records were created today: Query all ACR records where Royalty Invoicing Dashboards =’Full Access’ and Active=true, that are
associated with Store and Licensee associated with Royalty records created today, to get Contact.User Information. Share Royalty Share
records with Contact User.
2. If on AccountContanctRelation record, Royalty Invoicing Updated Today? =TRUE AND Royalty Invoicing Dashboards = ‘Full Access’ AND
Active =true and Account.RecordType=Licensee, then query all Royalty records where Royalty__c.Account__c = AccountId to provide an
access to Contact.User.
3.
3. If on AccountContanctRelation record, Royalty Invoicing Updated Today? =TRUE AND Royalty Invoicing Dashboards = ‘Full Access’ AND
Active =true and Account.RecordType=Non-Licensee, then query all Royalty records where Royalty__c.Store__c = Account.Store__c to
provide an access to Contact.User.
4. RoyaltySharingTime: This is a custom label used in batch apex that stores number of months. 0 is default value.
If value is 0, then in point 2 and 3 above, all Royalty records are queried that were created all time.
If value is greater than 0, then in point 2 and 3 above, all Royalty records are queried that were created in those month. So, if value
is 12, then in point 2 and 3 above, all Royalty records are queried that were created in last 12 months.
ManageRoyaltySharingforACRBatch use iterables over sObjects rather than using Database.queryLocator in the Batch apex as records are pulled
from AccountContactRelation and Royalty records. Following Iterators and Iterables are implemented for Batch Class:
CustomIterator: This apex class implements the Iterator interface for the list of Royalty__c records
RShareIterable: This apex class creates a reference to the iterator that is used to traverse the data structure. We are calling the
CustomIterator class.
Parameters are passed to handle large data volume as well as handle governor limits so, batch class executes logic to share Royalty records for
Licensee and Store separately.
Database.executeBatch(b,100);
RemoveRoyaltySharingBatch: This batch class unshare Royalty records with user if following conditions are met:
If on AccountContanctRelation record, Royalty Invoicing Updated Today? =TRUE AND Royalty Invoicing Dashboards = ‘Full Access’ AND
Active =false
If on AccountContanctRelation record, Royalty Invoicing Updated Today? =TRUE AND Royalty Invoicing Dashboards! = ‘Full Access’ AND
Active =true
This batch apex class is invoked from finish() method of ManageRoyaltySharingforACRBatch class.
UpdateACRRoyaltyInvoicingFlag: This batch class updates and set Royalty Invoicing Updated Today? =FALSE on AccountContactRelation records
once Royalty records are shared and unshared.
scheduleRoyaltySharingforACRBatch: This is a scheduled batch apex class that executes ManageRoyaltySharingforACRBatch. This class is
scheduled to run as System user and will be invoked at 4:00 am PST.
e.
2.
Users
The table below details the security built to meet the following personas:
1. Licensee Persona: An external user who has an Account Contact Relationship to a Licensee Account with the Analytics Licensee User Role,
and thus should be able to see the data for all stores associated to that Licensee.
2. Store Persona: An external user who has an Account Contact Relationship to a Store with the Analytics Licensee User Role, and thus should
be able to see that store’s data.
3. Internal Persona: An internal user who should be able to see all data for all stores and licensees.
CRM Analytics License Permissio All users need a CRM Analytics License to interact with the Royalty Sales & Invoice Dashboard
n Set
License
B2B Store Performance Permissio External users should be assigned this Permission Set Group to be able to access the dashboard in LS
Full Access Permission Set n Set Star. The assignment of this PSG is automated upon the contact receiving the Analytics Licensee User
Group Group Role.
Royalty Sales and Invoice Public All users need a to be added to the public group to access the Digital Services page on the LS Star
CRMA Access Group platform that contains the Royalty Sales & Invoice Dashboard.
The 3 above mentioned components are granted via the automation driven by the Royalty Invoicing Dashboards picklist on the Account Contact
Relationship and will be granted when the picklist is set to “Full Access”. For more information on LS Star Account Contact Relationship automation,
see Nexus Onboarding Documentation.
Deployment
No pre-deployment steps.
Post-deployment steps below:
Video Documentation
Video Documentation Folder in Starbucks Teams
Embed Dashboard in LS Star Video
CRMA Demo Video - Info on Data Syncs, Datasets, Recipes, Sbux Community App & Analytics Studio
Royalty Invoicing Dashboard Security - Info on Apex Class
Royalty Invoicing Dashboards Hypercare
1. Go to the Setup page and search for All Sites in the Quick Find search.
2. Click on the All Sites page under Digital Experiences.
3. Click on the 'Builder' link next to LS Star.
4. Click on the top left where it says Home to navigate through pages.
a. Scroll down to or search for 'Store Analytics' and click on it.
5. In the top left, click on the lightning bolt called Components.
6. Drag the 'CRM Analytics Dashboard' component to place it under the Royalty Invoicing Dashboard header.
a. After you have placed it, it is a little slow and takes some time for it to show up.
7. Once it shows up, a box will pop up on the right. Make sure the dashboard selected is the Royalty Sales & Invoice Dashboard.
8. Change the height to 1500.
9. In the checkboxes towards the bottom, check the boxes for Open Links in New Windows and Hide on Error, leave everything else unchecked.
10. In the top right, click Publish and click Publish again in the pop up.
a. You will get a confirmation email when the dashboard is successfully published.
If I want to see what users currently are shared with Royalty records, what query should I run?
The following will get you all Royalty External Ids and the Name of the User they are shared with.
select Parent.External_Id__c, UserOrGroup.Name from Royalty__Share
Additional Scenarios:
To add more Royalty fields, add Parent.[Field_Name]
To add more User fields, add UserOrGroup.[Field_Name]
To filter by a certain store number:
To filter by a certain licensee name:
To filter by a user’s name:
When I need the dashboard to show as unavailable to all users via the error message constructed, how do I do that?
If the whole dashboard needs to be down, an internal admin can right click + unhide and move the hidden "Dashboard Unavailable"
page all the way to the left to prevent navigation to the rest of the dashboard while it is under maintenance. The message on the
unavailable page can be modified by editing the text box. After maintenance is completed, the page can be re-hidden and moved
back to the right again to make the dashboard available for use.
JIRA Stories/Tasks/Bugs
If you are unable to open a Jira story linked below, please contact your Jira administrator and request access to Project = LSB2BTECH - thank you!
LSB2BTECH
SBUX Market CRMA – All Standard Issues
SBUX Market CRMA - Stories
SBUX Market CRMA – Bugs
SBUX Market CRMA – Tasks
Wireframes
These are the wireframes we received from the client during the requirements gathering period of design sessions.
Sales Wireframes
Royalty Invoice Wireframes
The following images below are from the dashboard after build was complete. There are notable formatting and structural changes between the
wireframe and the dashboard such as combining Revenue Sales and Royalty Invoice dashboards together, branding, filter choices, etc. These are all
decisions made through discussing with the SBUX team.
Help page
Invoice Home Glossary
Sa The Home Tab provides a user-friendly interface that Created 4 charts on the home tab – Net Sales, Gross Sales, Transactions,
les Net Sales enables LS Star users to view and interact with sales and Net Sales by Channel. Each chart was queried to show the data by
Ho Widget - Bar and transaction data by charts/widgets and filters. Users calendar week. Each visualization also has a visual tooltip that shows a bar
m Chart can filter the data in an intuitive way and see real-time graph breaking down the week by calendar days in that week.
e Gross Sales updates on the Home Tab, giving them the ability to
Tab Widget - Bar quickly gain insights and make informed decisions.
Chart
Transactions
Count
Widget -
Line Graph
Net Sales by
Channel
Widget - Pie
Chart
Tr LS Star users are able to view and analyze up-to-date Created 3 tables on the transactions details tab – Total Sales by Store, Daily
an Total Sales sales data across different time periods, including past Sales, and Daily Sales by Channel and Category. Each table’s numeric fields
sa by Store - data, using the specified date grouping and being able can be clicked on to drill down on the data for a specific store or specific date
cti Table to filter by additional dimensions such as store number, (faceting/selections is turned on in those widgets).
on Daily Sales - month, licensee, and channel. The users can facet the
De Table tables using the click-path displayed in the wireframe at
tail Daily Sales the bottom of this page.
s by Channel
Tab & Category -
Table
Inv The Invoice Home Tab provides a user-friendly invoice Created the invoice data table with the following columns: Store Number,
oic Invoice Data data table to view and interact with invoice PDFs and Invoice Number, Invoice Type, Period, Invoice Date (descending), Amount,
e Table relevant invoice information. LS Star community users Currency, and Due Date. Widget actions were left on for this table.
Ho can filter the data table in a way that quickly provides
m them with specific insights on invoices.
e
Tab
Inv From the table in the Royalty Invoice Dashboard in LS In the Royalty Invoice Recipe, the Content Document object was added to pull
oic Invoice Data Star, external contacts with the Store Performance Full the IDs and joined to the Royalties data. Also added a formula transformation
e Table > Access Permission should be able to click on the to create the link to the file dynamically based on the row. In the dashboard
Nu Invoice invoice number to open/download their invoice PDFs for table, a column was added for the invoice number and the link (the link column
m Number the last 24 months. After the 24th month after the was hidden). Linked the invoice number to the hyperlink in the dataset to allow
be Column period, the PDF invoice should be removed from Nexus, the PDF to open when clicked.
r and the external contact will need to work with the
Fi collections team to receive their invoice.
eld
wit
h
Hy
pe
rlink
He LS Star community users are able to find detailed These pages contain screenshots of the dashboard (with sensitive names
lp Help Home explanations and instructions on every widget present /numbers edited out) and red numbered bubbles with arrows to call out each
Pa Page on the dashboard, including its purpose, functionality, feature on the dashboard. This is accompanied by corresponding definitions
ge All hidden and how to interact with it. The content on the glossary and use cases for each feature on the dashboard provided/confirmed by the
glossary tab uses a mixture of images and text to guide users business. Each section of the dashboard has its own glossary page. The
tabs (Invoice through the information. Users can also find dashboard Requesting Support page was added to provide dashboard FAQs and guide
Home FAQs and guidance on submitting a support request users through the process of submitting a support request through LS Star.
Glossary, through the LS Star support request form.
Sales Home
Glossary,
Trx Details
Glossary,
Store Errors
Glossary,
and
Requesting
Support)
Sa These filters are present on all dashboard pages except Created 4 list selector widgets and queried each field a filter is needed for.
les Invoice the glossary. For Store and Licensee filters, depending Invoice month is in the month-year format (e.g., May 2023). Store filter has
Filt Month on the external user and their security permissions, they both the store number and name in the list. All filters appear on and apply to
ers Store will only be able to see the stores/licensee they have all Sales pages in the dashboard.
Licensee access to.
Channel
Ro These filters are present on all dashboard pages except Created 6 list selector widgets and queried each field a filter is needed for.
yal Year the Help page. For Store and Licensee filters, Period filter is using epoch seconds to sort the dates descending. Store filter
ty Period depending on the external user and their security has both the store number and name in the list. All filters appear on and apply
Inv Store permissions, they will only be able to see the stores to the Invoice Home page and Store Errors page.
oic Licensee /licensee they have access to.
e Invoice
Number
Filt Invoice Type
ers
Al LS Star community users are able to see an indicator in Created a URL button on the dashboard called View Alerts that linked to a
ert View Alerts the dashboard when there are data failures or when page on the dashboard called Store Errors. This page is only visible by
s button invoices for the previous month cannot be produced. clicking on this button. On this button, there is also a query that counts the
/N Store numbers that have issues in the selected month number of errors on the dashboard and populates that number next to the
otif are consolidated in a separate table with custom error View Alerts text. If there are any errors at that time in that month, the number
ica messages when the "View Alerts" button is clicked. will be greater than zero.
tio
ns On the Store Errors page (after clicking on View Alerts), there is a table that
displays the store number and the custom error message associated with that
store. This query was generated after the Revenue Sales Store Data Errors
dataset was joined to the input dataset, so after deployment, if Solstice finds
errors in certain stores and wants to alert users, they can replace the Revenue
Sales Store Data Errors dataset with their own custom error messages for
specific stores. This table will populate those messages and the View Alerts
button will count the number of errors.
Da - Default view (after the 5th of the current month) should For more detail on input/output datasets and the recipe, see the Data Flow
ta be the previous completed month. E.g.: On Feb 4th, section below.
2023, the default view will be Dec 2022. On Feb 5th, it
would be Jan 2023.