rack-tracker 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|