rack-tracker 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +11 -5
- data/CHANGELOG.md +7 -0
- data/Gemfile.rails-5.1 +6 -0
- data/README.md +24 -7
- data/lib/rack/tracker.rb +1 -0
- data/lib/rack/tracker/controller.rb +1 -1
- data/lib/rack/tracker/facebook/README.md +3 -0
- data/lib/rack/tracker/facebook_pixel/facebook_pixel.rb +27 -0
- data/lib/rack/tracker/facebook_pixel/template/facebook_pixel.erb +24 -0
- data/lib/rack/tracker/google_tag_manager/template/google_tag_manager.erb +6 -5
- data/lib/rack/tracker/version.rb +1 -1
- data/rack-tracker.gemspec +4 -0
- data/spec/handler/facebook_pixel_spec.rb +61 -0
- data/spec/integration/facebook_pixel_integration_spec.rb +17 -0
- data/spec/support/metal_controller.rb +7 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8b00e842917a8b4a5860ba6b66fc31d007330e4
|
4
|
+
data.tar.gz: ddcef1305f6638771741e5b1dcb0a95093cf1d30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec3e26414ba7877d46661e8f8eca1b2d80192d8f1eedd4d789f06dd5302937ea59f5ebf83a370bfc04d85ca890a242840c95187aaebf3f8b0d27a574494a292a
|
7
|
+
data.tar.gz: 7b9c3a9e365ca61ae867e9a5cc971daad4706d10c96aebffcfb7d65f8de7aa2eaa3a6de95cfc51a39645564657a0e254ddcc13c1829cdbebe0ed13cb1112dea6
|
data/.travis.yml
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
language: ruby
|
2
2
|
sudo: false
|
3
3
|
rvm:
|
4
|
-
- 1.
|
5
|
-
- 2.
|
6
|
-
- 2.
|
7
|
-
- 2.
|
8
|
-
- jruby
|
4
|
+
- 2.1.10
|
5
|
+
- 2.2.7
|
6
|
+
- 2.3.4
|
7
|
+
- 2.4.1
|
8
|
+
- jruby-9.1.10.0
|
9
9
|
gemfile:
|
10
|
+
- Gemfile
|
10
11
|
- Gemfile.rails-3.2
|
11
12
|
- Gemfile.rails-4.2
|
13
|
+
- Gemfile.rails-5.1
|
14
|
+
matrix:
|
15
|
+
exclude:
|
16
|
+
- rvm: 2.1.10
|
17
|
+
gemfile: Gemfile.rails-5.1 # rails 5 needs ruby >= 2.2.2
|
data/CHANGELOG.md
CHANGED
data/Gemfile.rails-5.1
ADDED
data/README.md
CHANGED
@@ -88,10 +88,10 @@ request.env['tracker'] = {
|
|
88
88
|
|
89
89
|
* `:anonymize_ip` - sets the tracker to remove the last octet from all IP addresses, see https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApi_gat?hl=de#_gat._anonymizeIp for details.
|
90
90
|
* `:cookie_domain` - sets the domain name for the [GATC cookies](https://developers.google.com/analytics/devguides/collection/analyticsjs/domains#implementation). If not set its the website domain, with the www. prefix removed.
|
91
|
-
* `:user_id` - defines a proc to set the [userId](https://developers.google.com/analytics/devguides/collection/analyticsjs/user-id). Ex: `user_id: lambda { |env| env['rack.session']['user_id'] }` would return the user_id from the session.
|
91
|
+
* `:user_id` - defines a proc to set the [userId](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#user_id). Ex: `user_id: lambda { |env| env['rack.session']['user_id'] }` would return the user_id from the session.
|
92
92
|
* `:site_speed_sample_rate` - Defines a new sample set size for Site Speed data collection, see https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiBasicConfiguration?hl=de#_gat.GA_Tracker_._setSiteSpeedSampleRate
|
93
93
|
* `:adjusted_bounce_rate_timeouts` - An array of times in seconds that the tracker will use to set timeouts for adjusted bounce rate tracking. See http://analytics.blogspot.ca/2012/07/tracking-adjusted-bounce-rate-in-google.html for details.
|
94
|
-
* `:enhanced_link_attribution` - Enables [Enhanced Link Attribution](https://developers.google.com/analytics/devguides/collection/analyticsjs/
|
94
|
+
* `:enhanced_link_attribution` - Enables [Enhanced Link Attribution](https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-link-attribution).
|
95
95
|
* `:advertising` - Enables [Display Features](https://developers.google.com/analytics/devguides/collection/analyticsjs/display-features).
|
96
96
|
* `:ecommerce` - Enables [Ecommerce Tracking](https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce).
|
97
97
|
* `:enhanced_ecommerce` - Enables [Enhanced Ecommerce Tracking](https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce)
|
@@ -254,16 +254,26 @@ To add events or variables to the dataLayer from the server side, just call the
|
|
254
254
|
|
255
255
|
### Facebook
|
256
256
|
|
257
|
-
* `
|
257
|
+
* `Facebook Pixel` - adds the [Facebook Pixel](https://www.facebook.com/business/help/952192354843755)
|
258
258
|
|
259
|
-
|
259
|
+
Use in conjunction with the [Facebook Helper](https://developers.facebook.com/docs/facebook-pixel/pixel-helper) to confirm your event fires correctly.
|
260
260
|
|
261
|
-
|
261
|
+
First, add the following to your config:
|
262
|
+
|
263
|
+
```ruby
|
264
|
+
config.middleware.use(Rack::Tracker) do
|
265
|
+
handler :facebook_pixel, { id: 'PIXEL_ID' }
|
266
|
+
end
|
267
|
+
```
|
268
|
+
|
269
|
+
#### Standard Events
|
270
|
+
|
271
|
+
To track Standard Events from the server side just call the `tracker` method in your controller.
|
262
272
|
|
263
273
|
```ruby
|
264
274
|
def show
|
265
275
|
tracker do |t|
|
266
|
-
t.
|
276
|
+
t.facebook_pixel :track, { type: 'Purchase', options: { value: 100, currency: 'USD' } }
|
267
277
|
end
|
268
278
|
end
|
269
279
|
```
|
@@ -271,8 +281,9 @@ To track [Conversions](https://www.facebook.com/help/435189689870514) from the s
|
|
271
281
|
Will result in the following:
|
272
282
|
|
273
283
|
```javascript
|
274
|
-
|
284
|
+
fbq("track", "Purchase", {"value":"100.0","currency":"USD"});
|
275
285
|
```
|
286
|
+
|
276
287
|
### Visual website Optimizer (VWO)
|
277
288
|
Just integrate the handler with your matching account_id and you will be ready to go
|
278
289
|
|
@@ -538,6 +549,12 @@ end
|
|
538
549
|
Checkout the existing handlers in `lib/rack/tracker` for some inspiration. :)
|
539
550
|
|
540
551
|
|
552
|
+
## Please note
|
553
|
+
|
554
|
+
Most tracking is done using some kind of Javascript and any tracking data is simply passed on.
|
555
|
+
Using unvalidated user input in the tracking might result in [XSS issues](https://en.wikipedia.org/wiki/Cross-site_scripting). Do only use secure data.
|
556
|
+
|
557
|
+
|
541
558
|
## Contributing
|
542
559
|
|
543
560
|
First of all, **thank** you for your help! :green_heart:
|
data/lib/rack/tracker.rb
CHANGED
@@ -16,6 +16,7 @@ require "rack/tracker/google_analytics/google_analytics"
|
|
16
16
|
require "rack/tracker/google_tag_manager/google_tag_manager"
|
17
17
|
require "rack/tracker/google_adwords_conversion/google_adwords_conversion"
|
18
18
|
require "rack/tracker/facebook/facebook"
|
19
|
+
require "rack/tracker/facebook_pixel/facebook_pixel"
|
19
20
|
require "rack/tracker/vwo/vwo"
|
20
21
|
require "rack/tracker/go_squared/go_squared"
|
21
22
|
require "rack/tracker/criteo/criteo"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Rack::Tracker::FacebookPixel < Rack::Tracker::Handler
|
2
|
+
class Event < OpenStruct
|
3
|
+
def write
|
4
|
+
options.present? ? type_to_json << options_to_json : type_to_json
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def type_to_json
|
10
|
+
type.to_json
|
11
|
+
end
|
12
|
+
|
13
|
+
def options_to_json
|
14
|
+
", #{options.to_json}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
self.position = :body
|
19
|
+
|
20
|
+
def render
|
21
|
+
Tilt.new( File.join( File.dirname(__FILE__), 'template/facebook_pixel.erb') ).render(self)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.track(name, *event)
|
25
|
+
{ name.to_s => [event.last.merge('class_name' => 'Event')] }
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<script type="text/javascript">
|
2
|
+
if (typeof fbq == 'undefined') {
|
3
|
+
|
4
|
+
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
|
5
|
+
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
|
6
|
+
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
|
7
|
+
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
|
8
|
+
document,'script','//connect.facebook.net/en_US/fbevents.js');
|
9
|
+
|
10
|
+
fbq('init', '<%= options[:id] %>');
|
11
|
+
fbq('track', "PageView");
|
12
|
+
}
|
13
|
+
</script>
|
14
|
+
<noscript>
|
15
|
+
<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=<%= options[:id] %>&ev=PageView&noscript=1"/>
|
16
|
+
</noscript>
|
17
|
+
|
18
|
+
<% if events.any? %>
|
19
|
+
<script type="text/javascript">
|
20
|
+
<% events.each do |event| %>
|
21
|
+
fbq("track", <%= event.write %>);
|
22
|
+
<% end %>
|
23
|
+
</script>
|
24
|
+
<% end %>
|
@@ -3,6 +3,12 @@
|
|
3
3
|
dataLayer = [];
|
4
4
|
</script>
|
5
5
|
|
6
|
+
<script>
|
7
|
+
dataLayer.push(
|
8
|
+
<%= events.map(&:write).join(', ') %>
|
9
|
+
);
|
10
|
+
</script>
|
11
|
+
|
6
12
|
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=<%= container %>"
|
7
13
|
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
8
14
|
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
@@ -11,9 +17,4 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
|
11
17
|
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
12
18
|
})(window,document,'script','dataLayer','<%= container %>');</script>
|
13
19
|
|
14
|
-
<script>
|
15
|
-
dataLayer.push(
|
16
|
-
<%= events.map(&:write).join(', ') %>
|
17
|
-
);
|
18
|
-
</script>
|
19
20
|
<% end %>
|
data/lib/rack/tracker/version.rb
CHANGED
data/rack-tracker.gemspec
CHANGED
@@ -28,4 +28,8 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_development_dependency "rspec", "~> 3.2"
|
29
29
|
spec.add_development_dependency "capybara", "~> 2.4"
|
30
30
|
spec.add_development_dependency "pry"
|
31
|
+
if RUBY_VERSION < "2.0"
|
32
|
+
spec.add_development_dependency "mime-types", "< 3.0"
|
33
|
+
spec.add_development_dependency "addressable", "< 2.5"
|
34
|
+
end
|
31
35
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
RSpec.describe Rack::Tracker::FacebookPixel do
|
2
|
+
# describe Rack::Tracker::FacebookPixel::Event do
|
3
|
+
|
4
|
+
# subject { described_class.new({id: 'id', foo: 'bar'}) }
|
5
|
+
|
6
|
+
# describe '#write' do
|
7
|
+
# specify { expect(subject.write).to eq(['track', 'id', {foo: 'bar'}].to_json) }
|
8
|
+
# end
|
9
|
+
# end
|
10
|
+
|
11
|
+
def env
|
12
|
+
{}
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'will be placed in the body' do
|
16
|
+
expect(described_class.position).to eq(:body)
|
17
|
+
expect(described_class.new(env).position).to eq(:body)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'with id' do
|
21
|
+
subject { described_class.new(env, id: 'PIXEL_ID').render }
|
22
|
+
|
23
|
+
it 'will push the tracking events to the queue' do
|
24
|
+
expect(subject).to match(%r{fbq\('init', 'PIXEL_ID'\)})
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'will add the noscript fallback' do
|
28
|
+
expect(subject).to match(%r{https://www.facebook.com/tr\?id=PIXEL_ID&ev=PageView&noscript=1})
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'with events' do
|
33
|
+
def env
|
34
|
+
{
|
35
|
+
'tracker' => {
|
36
|
+
'facebook_pixel' =>
|
37
|
+
[
|
38
|
+
{
|
39
|
+
'type' => 'Purchase',
|
40
|
+
'class_name' => 'Event',
|
41
|
+
'options' =>
|
42
|
+
{
|
43
|
+
'value' => '23',
|
44
|
+
'currency' => 'EUR'
|
45
|
+
}
|
46
|
+
}
|
47
|
+
]
|
48
|
+
}
|
49
|
+
}
|
50
|
+
end
|
51
|
+
subject { described_class.new(env).render }
|
52
|
+
|
53
|
+
it 'will push the tracking events to the queue' do
|
54
|
+
expect(subject).to match(%r{"track", "Purchase", \{"value":"23","currency":"EUR"\}})
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'will add the noscript fallback' do
|
58
|
+
expect(subject).to match(%r{https://www.facebook.com/tr\?id=&ev=PageView&noscript=1})
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'support/capybara_app_helper'
|
2
|
+
|
3
|
+
RSpec.describe "Facebook Pixel Integration" do
|
4
|
+
before do
|
5
|
+
setup_app(action: :facebook_pixel) do |tracker|
|
6
|
+
tracker.handler :facebook_pixel, { id: 'PIXEL_ID' }
|
7
|
+
end
|
8
|
+
visit '/'
|
9
|
+
end
|
10
|
+
|
11
|
+
subject { page }
|
12
|
+
|
13
|
+
it "embeds the script tag with tracking event from the controller action" do
|
14
|
+
expect(page).to have_content("fbq('init', 'PIXEL_ID');")
|
15
|
+
expect(page.body).to include('https://www.facebook.com/tr?id=PIXEL_ID&ev=PageView&noscript=1')
|
16
|
+
end
|
17
|
+
end
|
@@ -29,6 +29,13 @@ class MetalController < ActionController::Metal
|
|
29
29
|
render "metal/index"
|
30
30
|
end
|
31
31
|
|
32
|
+
def facebook_pixel
|
33
|
+
tracker do |t|
|
34
|
+
t.facebook_pixel :track, { id: 'conversion-event', value: '1', currency: 'EUR' }
|
35
|
+
end
|
36
|
+
render "metal/index"
|
37
|
+
end
|
38
|
+
|
32
39
|
def google_analytics
|
33
40
|
tracker do |t|
|
34
41
|
t.google_analytics :ecommerce, { type: 'addTransaction', id: 1234, affiliation: 'Acme Clothing', revenue: 11.99, shipping: 5, tax: 1.29 }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Brillert
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-06-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -153,6 +153,7 @@ files:
|
|
153
153
|
- Gemfile
|
154
154
|
- Gemfile.rails-3.2
|
155
155
|
- Gemfile.rails-4.2
|
156
|
+
- Gemfile.rails-5.1
|
156
157
|
- LICENSE.txt
|
157
158
|
- README.md
|
158
159
|
- Rakefile
|
@@ -161,8 +162,11 @@ files:
|
|
161
162
|
- lib/rack/tracker/criteo/criteo.rb
|
162
163
|
- lib/rack/tracker/criteo/template/criteo.erb
|
163
164
|
- lib/rack/tracker/extensions.rb
|
165
|
+
- lib/rack/tracker/facebook/README.md
|
164
166
|
- lib/rack/tracker/facebook/facebook.rb
|
165
167
|
- lib/rack/tracker/facebook/template/facebook.erb
|
168
|
+
- lib/rack/tracker/facebook_pixel/facebook_pixel.rb
|
169
|
+
- lib/rack/tracker/facebook_pixel/template/facebook_pixel.erb
|
166
170
|
- lib/rack/tracker/go_squared/go_squared.rb
|
167
171
|
- lib/rack/tracker/go_squared/template/go_squared.erb
|
168
172
|
- lib/rack/tracker/google_adwords_conversion/google_adwords_conversion.rb
|
@@ -187,6 +191,7 @@ files:
|
|
187
191
|
- spec/fixtures/views/layouts/application.html.erb
|
188
192
|
- spec/fixtures/views/metal/index.html.erb
|
189
193
|
- spec/handler/criteo_spec.rb
|
194
|
+
- spec/handler/facebook_pixel_spec.rb
|
190
195
|
- spec/handler/facebook_spec.rb
|
191
196
|
- spec/handler/go_squared_spec.rb
|
192
197
|
- spec/handler/google_adwords_conversion_spec.rb
|
@@ -196,6 +201,7 @@ files:
|
|
196
201
|
- spec/handler/zanox_spec.rb
|
197
202
|
- spec/integration/criteo_integration_spec.rb
|
198
203
|
- spec/integration/facebook_integration_spec.rb
|
204
|
+
- spec/integration/facebook_pixel_integration_spec.rb
|
199
205
|
- spec/integration/go_squared_integration_spec.rb
|
200
206
|
- spec/integration/google_adwords_conversion_integration_spec.rb
|
201
207
|
- spec/integration/google_analytics_integration_spec.rb
|
@@ -232,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
232
238
|
version: '0'
|
233
239
|
requirements: []
|
234
240
|
rubyforge_project:
|
235
|
-
rubygems_version: 2.4.
|
241
|
+
rubygems_version: 2.4.8
|
236
242
|
signing_key:
|
237
243
|
specification_version: 4
|
238
244
|
summary: Tracking made easy
|
@@ -243,6 +249,7 @@ test_files:
|
|
243
249
|
- spec/fixtures/views/layouts/application.html.erb
|
244
250
|
- spec/fixtures/views/metal/index.html.erb
|
245
251
|
- spec/handler/criteo_spec.rb
|
252
|
+
- spec/handler/facebook_pixel_spec.rb
|
246
253
|
- spec/handler/facebook_spec.rb
|
247
254
|
- spec/handler/go_squared_spec.rb
|
248
255
|
- spec/handler/google_adwords_conversion_spec.rb
|
@@ -252,6 +259,7 @@ test_files:
|
|
252
259
|
- spec/handler/zanox_spec.rb
|
253
260
|
- spec/integration/criteo_integration_spec.rb
|
254
261
|
- spec/integration/facebook_integration_spec.rb
|
262
|
+
- spec/integration/facebook_pixel_integration_spec.rb
|
255
263
|
- spec/integration/go_squared_integration_spec.rb
|
256
264
|
- spec/integration/google_adwords_conversion_integration_spec.rb
|
257
265
|
- spec/integration/google_analytics_integration_spec.rb
|