An open API service indexing awesome lists of open source software.

https://github.com/tpitale/staccato-ex

Google Analytics Collection API in Elixir
https://github.com/tpitale/staccato-ex

Last synced: over 1 year ago
JSON representation

Google Analytics Collection API in Elixir

Awesome Lists containing this project

README

          

# Staccato

Elixir library to track into the official Google Analytics Measurement Protocol

https://developers.google.com/analytics/devguides/collection/protocol/v1/

**NOTE:** The Measurement Protocol is part of Universal Analytics, which is currently available in public beta. Data from the measurement protocol will only be processed in Universal Analytics enabled properties.

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `staccato` to your list of dependencies in `mix.exs`:

```elixir
def deps do
[
{:staccato, "~> 0.1.0"}
]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/staccato](https://hexdocs.pm/staccato).

## TODO: ##

* [x] Basic hit types
* [ ] Session control
* [ ] Measurements
* [ ] Handle boolean fields
* [ ] Timing w/ block
* [ ] Custom Dimensions and Metrics
* [ ] Global hit defaults
* [ ] HTTP Adapters
* [ ] Image URLs

## Usage ##

```elixir
tracker = Staccato.tracker('UA-XXXX-Y') # REQUIRED, your Google Analytics Tracking ID
```

`#tracker` optionally takes a second param for the `client_id` value.
By default, the `client_id` is set to a random UUID with `SecureRandom.uuid`

### Track some data ###

```elixir
import Staccato.Hit

# Track a Pageview (all values optional)
tracker
|> pageview(path: "/page-path", hostname: "mysite.com", title: "A Page!")
|> track!

# Track an Event (all values optional)
tracker
|> event(category: "video", action: "play", label: "cars", value: 1)
|> track!

# Track social activity (all values REQUIRED)
tracker
|> social(action: 'like', network: 'facebook', target: '/something')
|> track!

# Track exceptions (all values optional)
tracker
|> exception(description: 'RuntimeException', fatal: true)
|> track!

# Track timing (all values optional, but should include time)
tracker
|> timing(category: 'runtime', variable: 'db', label: 'query', time: 50) # time in milliseconds
|> track!

# Track transaction (transaction_id REQUIRED)
tracker
|> transaction(%{
transaction_id: 12345,
affiliation: 'clothing',
revenue: 17.98,
shipping: 2.00,
tax: 2.50,
currency: 'EUR'
})
|> track!

# Track transaction item (matching transaction_id and item name REQUIRED)
tracker
|> transaction_item(%{
transaction_id: 12345,
name: 'Shirt',
price: 8.99,
quantity: 2,
code: 'afhcka1230',
variation: 'red',
currency: 'EUR'
})
track!
```

### Setting SSL on a tracker ###

```elixir
# passing nil as the second argument lets Staccato build the client id, as the default
tracker = Staccato.tracker('UA-XXXX-Y', nil, ssl: true)
```

### "Global" Options ###

Any of the options on the parameters list (https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters) that are accepted on ALL hit types can be set as options on any of the hits.

```elixir
tracker
|> pageview(path: '/video/1235', flash_version: 'v1.2.3')
```

`flash_version` is a **global option** in the example above.

The complete list at this time:

```elixir
Staccato::Hit::GLOBAL_OPTIONS.keys # =>

[:anonymize_ip,
:queue_time,
:data_source,
:cache_buster,
:user_id,
:user_ip,
:user_agent,
:referrer,
:campaign_name,
:campaign_source,
:campaign_medium,
:campaign_keyword,
:campaign_content,
:campaign_id,
:adwords_id,
:display_ads_id,
:screen_resolution,
:viewport_size,
:screen_colors,
:user_language,
:java_enabled,
:flash_version,
:document_location,
:document_encoding,
:document_hostname,
:document_path,
:document_title,
:link_id,
:application_name,
:application_version,
:application_id,
:application_installer_id,
:experiment_id,
:experiment_variant,
:product_action,
:product_action_list,
:promotion_action,
:geographical_id]
```

Boolean options like `anonymize_ip` will be converted from `true`/`false` into `1`/`0` as per the tracking API docs.

The `data_source` option can take any value, but note that hits sent from other Google tools will have specific values. Hits sent from analytics.js will have `data_source` set to `web`, and hits sent from one of the mobile SDKs will have `data_source` set to `app`.

#### Non-Interactive Hit ####

```elixir
# Track a Non-Interactive Hit
tracker
|> event(category: 'video', action: 'play', non_interactive: true)
|> track!
```

Non-Interactive events are useful for tracking things like emails sent, or other
events that are not directly the result of a user's interaction.

The option `non_interactive` is global, accepted for all hit types.

#### Session Control ####

```elixir
# start a session
tracker
|> pageview(path: '/blog', start_session: true)
|> track!

# end a session
tracker
|> pageview(path: '/blog', end_session: true)
|> track!
```

Other options are acceptable to start and end a session: `session_start`, `session_end`, and `stop_session`.

#### Content Experiment ####

```elixir
# Tracking an Experiment
# useful for tracking A/B or Multivariate testing
tracker
|> pageview(%{
path: '/blog',
experiment_id: 'a7a8d91df',
experiment_variant: 'a'
})
|> track!
```

### Screenview (as in mobile) ###

```elixir
tracker
|> screenview(screen_name: 'user1')
|> track!
```

## Google Documentation ##

https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide
https://developers.google.com/analytics/devguides/collection/protocol/v1/reference
https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters

## Contributing ##

1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request