ahoy_email 2.0.0 → 2.1.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/CHANGELOG.md +16 -0
- data/README.md +30 -10
- data/app/models/ahoy/click.rb +5 -0
- data/lib/ahoy_email/database_subscriber.rb +42 -0
- data/lib/ahoy_email/processor.rb +2 -2
- data/lib/ahoy_email/redis_subscriber.rb +1 -1
- data/lib/ahoy_email/version.rb +1 -1
- data/lib/ahoy_email.rb +1 -0
- data/lib/generators/ahoy/clicks/activerecord_generator.rb +20 -0
- data/lib/generators/ahoy/clicks/mongoid_generator.rb +15 -0
- data/lib/generators/ahoy/clicks/templates/migration.rb.tt +11 -0
- data/lib/generators/ahoy/clicks/templates/mongoid.rb.tt +8 -0
- data/lib/generators/ahoy/clicks_generator.rb +37 -0
- data/lib/generators/ahoy/messages_generator.rb +0 -2
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b84f8c566d81a470ba99f4318c2d7dd3f1b3fae6b05155491f486cbdbff7c0a6
|
4
|
+
data.tar.gz: 8ab62441cf6df6b4ab6af401a9cbed8864ac634d28dd728f6b83bfd743dce284
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf70b92f9ba7b0d91324eae1927fe49464c3b3a76293272570559526064d20a1df5a3859a350dac9d6708113b787e8566a8db58cb6bc881d463ae2f4581865c8
|
7
|
+
data.tar.gz: 62019c44c7e66c5d3858c9862d20276dbb876d024ca21d1d8691e3969944778c493fa3e988e0e22e2253c7515a6d453d2f11c794867941fa024017c9f28eeb02
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
## 2.1.0 (2021-09-25)
|
2
|
+
|
3
|
+
- Fixed mailer `default_url_options` not being applied to click links
|
4
|
+
|
5
|
+
## 2.0.3 (2021-03-31)
|
6
|
+
|
7
|
+
- Fixed `utm_params` and `track_clicks` stripping `<head>` tags from messages
|
8
|
+
|
9
|
+
## 2.0.2 (2021-03-14)
|
10
|
+
|
11
|
+
- Added support for Mongoid to database subscriber
|
12
|
+
|
13
|
+
## 2.0.1 (2021-03-08)
|
14
|
+
|
15
|
+
- Added database subscriber
|
16
|
+
|
1
17
|
## 2.0.0 (2021-03-06)
|
2
18
|
|
3
19
|
- Made `to` field encrypted by default for new installations
|
data/README.md
CHANGED
@@ -200,7 +200,23 @@ Skip specific links with:
|
|
200
200
|
|
201
201
|
## Click Analytics
|
202
202
|
|
203
|
-
You can track click-through rate to see how well campaigns are performing. Stats can be stored in
|
203
|
+
You can track click-through rate to see how well campaigns are performing. Stats can be stored in your database, Redis, or any other data store.
|
204
|
+
|
205
|
+
#### Database
|
206
|
+
|
207
|
+
Run:
|
208
|
+
|
209
|
+
```sh
|
210
|
+
rails generate ahoy:clicks
|
211
|
+
rails db:migrate
|
212
|
+
```
|
213
|
+
|
214
|
+
And create `config/initializers/ahoy_email.rb` with:
|
215
|
+
|
216
|
+
```ruby
|
217
|
+
AhoyEmail.subscribers << AhoyEmail::DatabaseSubscriber
|
218
|
+
AhoyEmail.api = true
|
219
|
+
```
|
204
220
|
|
205
221
|
#### Redis
|
206
222
|
|
@@ -232,7 +248,7 @@ class EmailSubscriber
|
|
232
248
|
# your code
|
233
249
|
end
|
234
250
|
|
235
|
-
def stats(campaign
|
251
|
+
def stats(campaign)
|
236
252
|
# optional, for AhoyEmail.stats
|
237
253
|
end
|
238
254
|
end
|
@@ -241,7 +257,7 @@ AhoyEmail.subscribers << EmailSubscriber
|
|
241
257
|
AhoyEmail.api = true
|
242
258
|
````
|
243
259
|
|
244
|
-
###
|
260
|
+
### Usage
|
245
261
|
|
246
262
|
Add to mailers you want to track
|
247
263
|
|
@@ -251,6 +267,8 @@ class CouponMailer < ApplicationMailer
|
|
251
267
|
end
|
252
268
|
```
|
253
269
|
|
270
|
+
If storing stats in the database, the mailer should also use `has_history`
|
271
|
+
|
254
272
|
Use only and except to limit actions
|
255
273
|
|
256
274
|
```ruby
|
@@ -267,6 +285,14 @@ class CouponMailer < ApplicationMailer
|
|
267
285
|
end
|
268
286
|
```
|
269
287
|
|
288
|
+
You can also use a proc
|
289
|
+
|
290
|
+
```ruby
|
291
|
+
class CouponMailer < ApplicationMailer
|
292
|
+
track_clicks campaign: -> { "coupon-#{action_name}" }
|
293
|
+
end
|
294
|
+
```
|
295
|
+
|
270
296
|
Skip specific links with:
|
271
297
|
|
272
298
|
```erb
|
@@ -287,13 +313,7 @@ AhoyEmail.default_options[:url_options] = {host: "mydomain.com"}
|
|
287
313
|
|
288
314
|
### Stats
|
289
315
|
|
290
|
-
Get stats for
|
291
|
-
|
292
|
-
```ruby
|
293
|
-
AhoyEmail.stats
|
294
|
-
```
|
295
|
-
|
296
|
-
Get stats for a specific campaign
|
316
|
+
Get stats for a campaign
|
297
317
|
|
298
318
|
```ruby
|
299
319
|
AhoyEmail.stats("my-campaign")
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module AhoyEmail
|
2
|
+
class DatabaseSubscriber
|
3
|
+
def track_send(event)
|
4
|
+
# use has_history to store on Ahoy::Messages
|
5
|
+
end
|
6
|
+
|
7
|
+
def track_click(event)
|
8
|
+
Ahoy::Click.create!(campaign: event[:campaign], token: event[:token])
|
9
|
+
end
|
10
|
+
|
11
|
+
def stats(campaign)
|
12
|
+
sends = Ahoy::Message.where(campaign: campaign).count
|
13
|
+
|
14
|
+
if defined?(ActiveRecord) && Ahoy::Click < ActiveRecord::Base
|
15
|
+
result = Ahoy::Click.where(campaign: campaign).select("COUNT(*) AS clicks, COUNT(DISTINCT token) AS unique_clicks").to_a[0]
|
16
|
+
clicks = result.clicks
|
17
|
+
unique_clicks = result.unique_clicks
|
18
|
+
else
|
19
|
+
clicks = Ahoy::Click.where(campaign: campaign).count
|
20
|
+
# TODO use aggregation framework
|
21
|
+
unique_clicks = Ahoy::Click.where(campaign: campaign).distinct(:token).count
|
22
|
+
end
|
23
|
+
|
24
|
+
if sends > 0 || clicks > 0
|
25
|
+
{
|
26
|
+
sends: sends,
|
27
|
+
clicks: clicks,
|
28
|
+
unique_clicks: unique_clicks,
|
29
|
+
ctr: 100 * unique_clicks / sends.to_f
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def campaigns
|
35
|
+
if defined?(ActiveRecord) && Ahoy::Message < ActiveRecord::Base
|
36
|
+
Ahoy::Message.where.not(campaign: nil).distinct.pluck(:campaign)
|
37
|
+
else
|
38
|
+
Ahoy::Message.where(campaign: {"$ne" => nil}).distinct(:campaign)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/ahoy_email/processor.rb
CHANGED
@@ -53,7 +53,7 @@ module AhoyEmail
|
|
53
53
|
if html_part?
|
54
54
|
part = message.html_part || message
|
55
55
|
|
56
|
-
doc = Nokogiri::HTML::
|
56
|
+
doc = Nokogiri::HTML::Document.parse(part.body.raw_source)
|
57
57
|
doc.css("a[href]").each do |link|
|
58
58
|
uri = parse_uri(link["href"])
|
59
59
|
next unless trackable?(uri)
|
@@ -123,7 +123,7 @@ module AhoyEmail
|
|
123
123
|
end
|
124
124
|
|
125
125
|
def url_for(opt)
|
126
|
-
opt = (
|
126
|
+
opt = (mailer.default_url_options || {})
|
127
127
|
.merge(options[:url_options])
|
128
128
|
.merge(opt)
|
129
129
|
AhoyEmail::Engine.routes.url_helpers.url_for(opt)
|
data/lib/ahoy_email/version.rb
CHANGED
data/lib/ahoy_email.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "rails/generators/active_record"
|
2
|
+
|
3
|
+
module Ahoy
|
4
|
+
module Generators
|
5
|
+
module Clicks
|
6
|
+
class ActiverecordGenerator < Rails::Generators::Base
|
7
|
+
include ActiveRecord::Generators::Migration
|
8
|
+
source_root File.join(__dir__, "templates")
|
9
|
+
|
10
|
+
def copy_migration
|
11
|
+
migration_template "migration.rb", "db/migrate/create_ahoy_clicks.rb", migration_version: migration_version
|
12
|
+
end
|
13
|
+
|
14
|
+
def migration_version
|
15
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module Ahoy
|
4
|
+
module Generators
|
5
|
+
module Clicks
|
6
|
+
class MongoidGenerator < Rails::Generators::Base
|
7
|
+
source_root File.join(__dir__, "templates")
|
8
|
+
|
9
|
+
def copy_templates
|
10
|
+
template "mongoid.rb", "app/models/ahoy/click.rb"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
|
2
|
+
def change
|
3
|
+
create_table :ahoy_clicks do |t|
|
4
|
+
t.string :campaign, index: true
|
5
|
+
t.string :token
|
6
|
+
end
|
7
|
+
|
8
|
+
add_column :ahoy_messages, :campaign, :string
|
9
|
+
add_index :ahoy_messages, :campaign
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module Ahoy
|
4
|
+
module Generators
|
5
|
+
class ClicksGenerator < Rails::Generators::Base
|
6
|
+
def copy_templates
|
7
|
+
activerecord = defined?(ActiveRecord)
|
8
|
+
mongoid = defined?(Mongoid)
|
9
|
+
|
10
|
+
selection =
|
11
|
+
if activerecord && mongoid
|
12
|
+
puts <<-MSG
|
13
|
+
|
14
|
+
Which data store would you like to use?
|
15
|
+
1. Active Record (default)
|
16
|
+
2. Mongoid
|
17
|
+
MSG
|
18
|
+
|
19
|
+
ask(">")
|
20
|
+
elsif activerecord
|
21
|
+
"1"
|
22
|
+
else
|
23
|
+
"2"
|
24
|
+
end
|
25
|
+
|
26
|
+
case selection
|
27
|
+
when "", "1"
|
28
|
+
invoke "ahoy:clicks:activerecord"
|
29
|
+
when "2"
|
30
|
+
invoke "ahoy:clicks:mongoid"
|
31
|
+
else
|
32
|
+
abort "Error: must enter a number [1-2]"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ahoy_email
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionmailer
|
@@ -77,9 +77,11 @@ files:
|
|
77
77
|
- LICENSE.txt
|
78
78
|
- README.md
|
79
79
|
- app/controllers/ahoy/messages_controller.rb
|
80
|
+
- app/models/ahoy/click.rb
|
80
81
|
- app/models/ahoy/message.rb
|
81
82
|
- config/routes.rb
|
82
83
|
- lib/ahoy_email.rb
|
84
|
+
- lib/ahoy_email/database_subscriber.rb
|
83
85
|
- lib/ahoy_email/engine.rb
|
84
86
|
- lib/ahoy_email/mailer.rb
|
85
87
|
- lib/ahoy_email/message_subscriber.rb
|
@@ -89,6 +91,11 @@ files:
|
|
89
91
|
- lib/ahoy_email/tracker.rb
|
90
92
|
- lib/ahoy_email/utils.rb
|
91
93
|
- lib/ahoy_email/version.rb
|
94
|
+
- lib/generators/ahoy/clicks/activerecord_generator.rb
|
95
|
+
- lib/generators/ahoy/clicks/mongoid_generator.rb
|
96
|
+
- lib/generators/ahoy/clicks/templates/migration.rb.tt
|
97
|
+
- lib/generators/ahoy/clicks/templates/mongoid.rb.tt
|
98
|
+
- lib/generators/ahoy/clicks_generator.rb
|
92
99
|
- lib/generators/ahoy/messages/activerecord_generator.rb
|
93
100
|
- lib/generators/ahoy/messages/mongoid_generator.rb
|
94
101
|
- lib/generators/ahoy/messages/templates/migration.rb.tt
|
@@ -115,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
122
|
- !ruby/object:Gem::Version
|
116
123
|
version: '0'
|
117
124
|
requirements: []
|
118
|
-
rubygems_version: 3.2.
|
125
|
+
rubygems_version: 3.2.22
|
119
126
|
signing_key:
|
120
127
|
specification_version: 4
|
121
128
|
summary: First-party email analytics for Rails
|