« All posts

Slash Command Displays Client’s Google Analytics Goals Directly Within Slack

At WebMechanix my team has built an internal web app that oAuths into various services we use, including HubSpot, Harvest, Google Analytics, Slack, Quickbooks and Asana.  This dashboard aggregates and outputs all this data in amazingly helpful ways.  Dashboard is built on Laravel 5.

I built this Slack slash command ( /goals [client-code] ) to return Google Analytics goals for a client who’s configured and connected to GA within Dashboard.  The goals display within Slack after the slash command is entered by one of my marketing teammates:

Slack Google Analytics Slash Command Output

This code assumes pre-configured oAuth to both Slack and GA, and includes custom database references and certain functions defined elsewhere within the framework:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
public function slashGoals()
{
   
    // got this from Slack when configuring the slash command:
    $slackToken = 'xXxxXXxxXXXXxXXXXxxxXXXx';
   
    // set POST var for posted token:
    $postedToken = Request::get('token');
   
    // validate the posted token against what we know the token to be (otherwise return Access Denied):
    if(!isset($postedToken) || $postedToken !== $slackToken) {
        return 'Access denied';
    } else {
        // set POST var for "text," which is what the user enters after the slash command:
        $client_code = Request::get('text');
       
        // if client code is set and not an empty string, continue; otherwise return helper message:
        if($client_code != null && $client_code != '') {
            // get client harvest id given client code:
            $client_hid = Dashboard::getHarvestIDFromClientCode($client_code);
           
            if(! $client_hid > 0) {
                die('Please try again using a VALID client code e.g. "/hours WMX"');
            }
           
            // get client's first GA profile given client harvest id:
            $ga_profile_id = Dashboard::getGAProfileIDFromClientID($client_hid);
           
            // if getHarvestClientIDFromClientCode() doesn't return false, continue; otherwise return helper message:
            if($ga_profile_id != null) {
               
                // get GA goal data given client's first GA profile:
                $data = GoogleController::getGoalCompletionsTable($ga_profile_id, true);
               
                if($data == 'Configure goals in Dashboard to view data.') {
                    die('Configure goals for ' . strtoupper($client_code) . ' in Dashboard to view data.');
                }
               
                // return to slack as an array so we can post into the channel:
                $return = [
                    'response_type' => 'in_channel',
                    'attachments'   => [ (object) [
                        'fallback'  => '(This slash command not supported here. Try on a desktop.)',
                        'title'     => "<https://dash.webmechanix.com/clients/" . $client_hid . "#analytics|" . strtoupper($client_code) . " GOALS> (GA Profile ID $ga_profile_id, per toggled Goals in Dashboard)",
                        'fields' => [
                            (object) [
                                'title' => 'Timeframe',
                                'value' => '',
                                'short' => true
                            ],
                            (object) [
                                'title' => 'This Month',
                                'value' => '',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Week',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => $data['Week']['this'],
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Month',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => $data['Month']['this'],
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Quarter',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => $data['Quarter']['this'],
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Year',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => $data['Year']['this'],
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => '______________________________________________________________________________________',
                                'short' => false
                            ],
                            (object) [
                                'title' => 'Timeframe',
                                'value' => '',
                                'short' => true
                            ],
                            (object) [
                                'title' => 'Last Month',
                                'value' => '',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Week',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => Dashboard::getPercentageChange($data['Week']['this'], $data['Week']['last']) . '% (' . $data['Week']['last'] . ')',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Month',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => Dashboard::getPercentageChange($data['Month']['this'], $data['Month']['last']) . '% (' . $data['Month']['last'] . ')',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Quarter',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => Dashboard::getPercentageChange($data['Quarter']['this'], $data['Quarter']['last']) . '% (' . $data['Quarter']['last'] . ')',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Year',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => Dashboard::getPercentageChange($data['Year']['this'], $data['Year']['last']) . '% (' . $data['Year']['last'] . ')',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => '______________________________________________________________________________________',
                                'short' => false
                            ],
                            (object) [
                                'title' => 'Timeframe',
                                'value' => '',
                                'short' => true
                            ],
                            (object) [
                                'title' => 'Last Year',
                                'value' => '',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Week',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => Dashboard::getPercentageChange($data['Week']['this'], $data['Week']['lastYear']) . '% (' . $data['Week']['lastYear'] . ')',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Month',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => Dashboard::getPercentageChange($data['Month']['this'], $data['Month']['lastYear']) . '% (' . $data['Month']['lastYear'] . ')',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Quarter',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => Dashboard::getPercentageChange($data['Quarter']['this'], $data['Quarter']['lastYear']) . '% (' . $data['Quarter']['lastYear'] . ')',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => 'Year',
                                'short' => true
                            ],
                            (object) [
                                'title' => '',
                                'value' => Dashboard::getPercentageChange($data['Year']['this'], $data['Year']['lastYear']) . '% (' . $data['Year']['lastYear'] . ')',
                                'short' => true
                            ],
                        ],
                        ] ]
                    ];
                   
                    return $return;
                } else {
                    return 'Please try again using a VALID client code e.g. "/hours WMX". (And are GA Goals configured in Dashboard for this client?)';
                }
            } else {
                return 'Please try again using a valid client code e.g. "/hours WMX". (And are GA Goals configured in Dashboard for this client?)';
            }
        }
    }

Leave a Reply

Your email address will not be published. Required fields are marked *