diff --git a/lib/index.js b/lib/index.js index 41a90a0..80bee1e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -280,6 +280,62 @@ Mixpanel.prototype.increment = function(track, fn){ } }; +/** + * Group support for Mixpanel by adding users with a property called + * isGroup set to True and forcing the prefix 'group.' on $distinct_id + * + * @param {Group} group + * @param {Function} fn + * @api public + */ + +Mixpanel.prototype.group = function(group, fn){ + if (!this.settings.people) return tick(fn); + var json = group.json(); + var traits = json.traits || {}; + var self = this; + var groupId = 'group.' + group.groupId(); + + traits['$name'] = traits['name']; + traits['isGroup'] = true; + object.del(traits,'name'); + + var group_payload = { + $distinct_id: groupId, // the primary group id + $token: this.settings.token, + $time: group.timestamp().getTime(), + $set: stringifyValues(traits), // set all the traits on group + $ip: 0, + $ignore_time: false, //enable Last Seen for groups + mp_lib: 'Segment: ' + identify.library().name + }; + + this + .get('/engage') + .query({ ip: 0 }) + .query({ verbose: 1 }) + .query({ data: b64encode(group_payload) }) + .end(this.handle(function(err){ + if (err) return fn(err); + + var user_payload = { + $distinct_id: group.userId(), // the primary id + $token: self.settings.token, + $union: stringifyValues({ "groups" : [groupId]}) + }; + + self + .get('/engage') + .query({ ip: 0 }) + .query({ verbose: 1 }) + .query({ data: b64encode(user_payload) }) + .end(self._parseResponse(fn)); + + }) + ); + +}; + /** * Common function for parsing the response from a mixpanel call. *