klaviyo 2.0.1 → 2.0.6
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 +5 -5
- data/klaviyo.gemspec +2 -2
- data/lib/klaviyo/apis/campaigns.rb +41 -0
- data/lib/klaviyo/apis/data_privacy.rb +19 -0
- data/lib/klaviyo/apis/email_templates.rb +97 -0
- data/lib/klaviyo/apis/metrics.rb +0 -2
- data/lib/klaviyo/apis/profiles.rb +13 -0
- data/lib/klaviyo/apis/public.rb +9 -4
- data/lib/klaviyo/client.rb +38 -19
- data/lib/klaviyo/klaviyo_module.rb +5 -1
- metadata +9 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c50780aa07007d13ffcbfd5e88692dc46122641627511be21f4988012d48d20e
|
4
|
+
data.tar.gz: 453757a911094db7394000a2aa59d4a0f31a3cb6aa9196e50a749dac3e51b336
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62278b5560afe418dc8658e71646f36905cdb10c2b607b923377ea08c8ea247630fc782c6dbceda1d4fe2a88f5f332995abce6dcf90484cfbc1791516d4b6cd3
|
7
|
+
data.tar.gz: 1358f2f45b1e92144f8a43f0f52a291f3ee859af3e416924e003a1b7c7a02553965d6240fecf8289eb41167c422565c8909b57344b8baed9091c6f022801183b
|
data/klaviyo.gemspec
CHANGED
@@ -2,8 +2,8 @@ files = ['klaviyo.gemspec', '{lib}/**/**/*'].map {|f| Dir[f]}.flatten
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'klaviyo'
|
5
|
-
s.version = '2.0.
|
6
|
-
s.date = '
|
5
|
+
s.version = '2.0.6'
|
6
|
+
s.date = '2021-04-08'
|
7
7
|
s.summary = 'You heard us, a Ruby wrapper for the Klaviyo API'
|
8
8
|
s.description = 'Ruby wrapper for the Klaviyo API'
|
9
9
|
s.authors = ['Klaviyo Team']
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Klaviyo
|
2
|
+
class Campaigns < Client
|
3
|
+
CANCEL = 'cancel'
|
4
|
+
CAMPAIGN = 'campaign'
|
5
|
+
CAMPAIGNS = 'campaigns'
|
6
|
+
SEND = 'send'
|
7
|
+
|
8
|
+
# Retrieves all the campaigns from Klaviyo account
|
9
|
+
# @return [List] of JSON formatted campaing objects
|
10
|
+
def self.get_campaigns()
|
11
|
+
v1_request(HTTP_GET, CAMPAIGNS)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Retrieves the details of the list
|
15
|
+
# @param campaign_id the if of campaign
|
16
|
+
# @return [JSON] a JSON object containing information about the campaign
|
17
|
+
def self.get_campaign_details(campaign_id)
|
18
|
+
path = "#{CAMPAIGN}/#{campaign_id}"
|
19
|
+
|
20
|
+
v1_request(HTTP_GET, path)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Sends the campaign immediately
|
24
|
+
# @param campaign_id [String] the id of campaign
|
25
|
+
# @return will return with HTTP ok in case of success
|
26
|
+
def self.send_campaign(campaign_id)
|
27
|
+
path = "#{CAMPAIGN}/#{campaign_id}/#{SEND}"
|
28
|
+
|
29
|
+
v1_request(HTTP_POST, path)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Cancels the campaign with specified campaign_id
|
33
|
+
# @param campaign_id [String] the id of campaign
|
34
|
+
# @return [JSON] a JSON object containing the campaign details
|
35
|
+
def self.cancel_campaign(campaign_id)
|
36
|
+
path = "#{CAMPAIGN}/#{campaign_id}/#{CANCEL}"
|
37
|
+
|
38
|
+
v1_request(HTTP_POST, path)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Klaviyo
|
2
|
+
class DataPrivacy < Client
|
3
|
+
DATA_PRIVACY = 'data-privacy'
|
4
|
+
DELETION_REQUEST = 'deletion-request'
|
5
|
+
|
6
|
+
# Submits a data privacy-related deletion request
|
7
|
+
# @param id_type [String] 'email' or 'phone_number' or 'person_id
|
8
|
+
# @param identifier [String] value for the identifier specified
|
9
|
+
# @return a dictionary with a confirmation that deletion task submitted for the customer
|
10
|
+
def self.request_profile_deletion(id_type, identifier)
|
11
|
+
unless ['email', 'phone_number', 'person_id'].include? id_type
|
12
|
+
raise Klaviyo::KlaviyoError.new(INVALID_ID_TYPE_ERROR)
|
13
|
+
end
|
14
|
+
identifier = { id_type => identifier }
|
15
|
+
path = "#{DATA_PRIVACY}/#{DELETION_REQUEST}"
|
16
|
+
v2_request(HTTP_POST, path, identifier)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Klaviyo
|
2
|
+
class EmailTemplates < Client
|
3
|
+
EMAIL_TEMPLATES = 'email-templates'
|
4
|
+
EMAIL_TEMPLATE = 'email-template'
|
5
|
+
CLONE = 'clone'
|
6
|
+
RENDER = 'render'
|
7
|
+
SEND = 'send'
|
8
|
+
|
9
|
+
# Returns a list of all the email templates you've created.
|
10
|
+
# The templates are returned in sorted order by name.
|
11
|
+
# @return [List] of JSON formatted email template objects
|
12
|
+
def self.get_templates()
|
13
|
+
v1_request(HTTP_GET, EMAIL_TEMPLATES)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Creates a new email template
|
17
|
+
# @param :name [String] The name of the email template
|
18
|
+
# @param :html [String] The HTML content for this template
|
19
|
+
# @return [JSON] a JSON object containing information about the email template
|
20
|
+
def self.create_template(name: nil, html: nil)
|
21
|
+
params = {
|
22
|
+
name: name,
|
23
|
+
html: html
|
24
|
+
}
|
25
|
+
v1_request(HTTP_POST, EMAIL_TEMPLATES, content_type: CONTENT_URL_FORM, params: params)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Updates the name and/or HTML content of a template. Only updates imported
|
29
|
+
# HTML templates; does not currently update drag & drop templates
|
30
|
+
# @param template_id [String] The id of the email template
|
31
|
+
# @param :name [String] The name of the email template
|
32
|
+
# @param :html [String] The HTML content for this template
|
33
|
+
# @return [JSON] a JSON object containing information about the email template
|
34
|
+
def self.update_template(template_id, name:, html:)
|
35
|
+
path = "#{EMAIL_TEMPLATE}/#{template_id}"
|
36
|
+
params = {
|
37
|
+
name: name,
|
38
|
+
html: html
|
39
|
+
}
|
40
|
+
v1_request(HTTP_PUT, path, params)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Deletes a given template.
|
44
|
+
# @param template_id [String] The id of the email template
|
45
|
+
# @return [JSON] a JSON object containing information about the email template
|
46
|
+
def self.delete_template(template_id)
|
47
|
+
path = "#{EMAIL_TEMPLATE}/#{template_id}"
|
48
|
+
v1_request(HTTP_DELETE, path)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Creates a copy of a given template with a new name
|
52
|
+
# @param template_id [String] The id of the email template to copy
|
53
|
+
# @param :name [String] The name of the newly cloned email template
|
54
|
+
# @return [JSON] a JSON object containing information about the email template
|
55
|
+
def self.clone_template(template_id, name:)
|
56
|
+
path = "#{EMAIL_TEMPLATE}/#{template_id}/#{CLONE}"
|
57
|
+
params = {
|
58
|
+
name: name
|
59
|
+
}
|
60
|
+
v1_request(HTTP_POST, path, content_type: CONTENT_URL_FORM, params: params)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Renders the specified template with the provided data and return HTML
|
64
|
+
# and text versions of the email
|
65
|
+
# @param template_id [String] The id of the email template to copy
|
66
|
+
# @param :context [Hash] The context the email template will be rendered with
|
67
|
+
# @return [JSON] a JSON object containing information about the email template
|
68
|
+
def self.render_template(template_id, context: {})
|
69
|
+
path = "#{EMAIL_TEMPLATE}/#{template_id}/#{RENDER}"
|
70
|
+
params = {
|
71
|
+
context: context
|
72
|
+
}
|
73
|
+
v1_request(HTTP_POST, path, content_type: CONTENT_URL_FORM, params: params)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Renders the specified template with the provided data and then send the
|
77
|
+
# contents in an email via the service specified
|
78
|
+
# @param template_id [String] The id of the email template to copy
|
79
|
+
# @param :from_email [String] The from email address; used in the reply-to header
|
80
|
+
# @param :from_name [String] The name the email is sent from
|
81
|
+
# @param :subject [String] The subject of the email template
|
82
|
+
# @param :to [Mixed] The email this template is being sent to
|
83
|
+
# @param :context [Hash] The context the email template will be rendered with
|
84
|
+
# @return [JSON] a JSON object containing information about the email template
|
85
|
+
def self.send_template(template_id, from_email:, from_name:, subject:, to:, context: {})
|
86
|
+
path = "#{EMAIL_TEMPLATE}/#{template_id}/#{SEND}"
|
87
|
+
params = {
|
88
|
+
from_email: from_email,
|
89
|
+
from_name: from_name,
|
90
|
+
subject: subject,
|
91
|
+
to: to,
|
92
|
+
context: context
|
93
|
+
}
|
94
|
+
v1_request(HTTP_POST, path, content_type: CONTENT_URL_FORM, params: params)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/klaviyo/apis/metrics.rb
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
module Klaviyo
|
2
2
|
class Profiles < Client
|
3
3
|
PERSON = 'person'
|
4
|
+
PEOPLE = 'people'
|
5
|
+
SEARCH = 'search'
|
6
|
+
|
7
|
+
# Retrieves the id of the profile given email
|
8
|
+
# @param email [String] the email of the profile
|
9
|
+
# @return [JSON] a JSON object containing id of the profile
|
10
|
+
def self.get_profile_id_by_email(email)
|
11
|
+
path = "#{PEOPLE}/#{SEARCH}"
|
12
|
+
params = {
|
13
|
+
:email => email
|
14
|
+
}
|
15
|
+
v2_request(HTTP_GET, path, params)
|
16
|
+
end
|
4
17
|
|
5
18
|
# Retrieve all the data attributes for a Klaviyo Person ID.
|
6
19
|
# @param person_id [String] the id of the profile
|
data/lib/klaviyo/apis/public.rb
CHANGED
@@ -8,16 +8,18 @@ module Klaviyo
|
|
8
8
|
def self.identify(kwargs = {})
|
9
9
|
defaults = {:id => nil,
|
10
10
|
:email => nil,
|
11
|
+
:phone_number => nil,
|
11
12
|
:properties => {}
|
12
13
|
}
|
13
14
|
kwargs = defaults.merge(kwargs)
|
14
15
|
|
15
|
-
|
16
|
+
unless check_required_args(kwargs)
|
16
17
|
return
|
17
18
|
end
|
18
19
|
|
19
20
|
properties = kwargs[:properties]
|
20
21
|
properties[:email] = kwargs[:email] unless kwargs[:email].to_s.empty?
|
22
|
+
properties[:$phone_number] = kwargs[:phone_number] unless kwargs[:phone_number].to_s.empty?
|
21
23
|
properties[:id] = kwargs[:id] unless kwargs[:id].to_s.empty?
|
22
24
|
|
23
25
|
params = {
|
@@ -33,6 +35,7 @@ module Klaviyo
|
|
33
35
|
# @param event [String] the event to track
|
34
36
|
# @kwarg :id [String] the customer or profile id
|
35
37
|
# @kwarg :email [String] the customer or profile email
|
38
|
+
# @kwarg :phone_number [String] the customer or profile phone number
|
36
39
|
# @kwarg :properties [Hash] properties of the event
|
37
40
|
# @kwargs :customer_properties [Hash] properties of the customer or profile
|
38
41
|
# @kwargs :time [Integer] timestamp of the event
|
@@ -40,6 +43,7 @@ module Klaviyo
|
|
40
43
|
defaults = {
|
41
44
|
:id => nil,
|
42
45
|
:email => nil,
|
46
|
+
:phone_number => nil,
|
43
47
|
:properties => {},
|
44
48
|
:customer_properties => {},
|
45
49
|
:time => nil
|
@@ -47,12 +51,13 @@ module Klaviyo
|
|
47
51
|
|
48
52
|
kwargs = defaults.merge(kwargs)
|
49
53
|
|
50
|
-
|
54
|
+
unless check_required_args(kwargs)
|
51
55
|
return
|
52
56
|
end
|
53
57
|
|
54
58
|
customer_properties = kwargs[:customer_properties]
|
55
59
|
customer_properties[:email] = kwargs[:email] unless kwargs[:email].to_s.empty?
|
60
|
+
customer_properties[:$phone_number] = kwargs[:phone_number] unless kwargs[:phone_number].to_s.empty?
|
56
61
|
customer_properties[:id] = kwargs[:id] unless kwargs[:id].to_s.empty?
|
57
62
|
|
58
63
|
params = {
|
@@ -61,9 +66,9 @@ module Klaviyo
|
|
61
66
|
:properties => kwargs[:properties],
|
62
67
|
:customer_properties => customer_properties
|
63
68
|
}
|
64
|
-
params[:time] = kwargs[:time]
|
69
|
+
params[:time] = kwargs[:time] if kwargs[:time]
|
65
70
|
|
66
|
-
public_request(HTTP_GET, 'track', params)
|
71
|
+
public_request(HTTP_GET, 'track', **params)
|
67
72
|
end
|
68
73
|
|
69
74
|
def self.track_once(event, kwargs = {})
|
data/lib/klaviyo/client.rb
CHANGED
@@ -10,62 +10,81 @@ module Klaviyo
|
|
10
10
|
HTTP_PUT = 'put'
|
11
11
|
|
12
12
|
ALL = 'all'
|
13
|
+
METRIC = 'metric'
|
14
|
+
METRICS = 'metrics'
|
13
15
|
TIMELINE = 'timeline'
|
14
16
|
|
15
17
|
DEFAULT_COUNT = 100
|
16
18
|
DEFAULT_PAGE = 0
|
17
19
|
DEFAULT_SORT_DESC = 'desc'
|
18
20
|
|
21
|
+
CONTENT_JSON = 'application/json'
|
22
|
+
CONTENT_URL_FORM = 'application/x-www-form-urlencoded'
|
23
|
+
|
19
24
|
private
|
20
25
|
|
21
|
-
def self.request(method, path, kwargs
|
26
|
+
def self.request(method, path, content_type, **kwargs)
|
22
27
|
check_private_api_key_exists()
|
23
28
|
url = "#{BASE_API_URL}/#{path}"
|
24
29
|
connection = Faraday.new(
|
25
30
|
url: url,
|
26
31
|
headers: {
|
27
|
-
'Content-Type' =>
|
32
|
+
'Content-Type' => content_type
|
28
33
|
})
|
34
|
+
if content_type == CONTENT_JSON
|
35
|
+
kwargs[:body] = kwargs[:body].to_json
|
36
|
+
end
|
29
37
|
response = connection.send(method) do |req|
|
30
|
-
req.body = kwargs[:body]
|
38
|
+
req.body = kwargs[:body] || nil
|
31
39
|
end
|
32
40
|
end
|
33
41
|
|
34
|
-
def self.public_request(method, path, kwargs
|
42
|
+
def self.public_request(method, path, **kwargs)
|
35
43
|
check_public_api_key_exists()
|
36
44
|
params = build_params(kwargs)
|
37
45
|
url = "#{BASE_API_URL}/#{path}?#{params}"
|
38
46
|
res = Faraday.get(url).body
|
39
47
|
end
|
40
48
|
|
41
|
-
def self.v1_request(method, path,
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
def self.v1_request(method, path, content_type: CONTENT_JSON, **kwargs)
|
50
|
+
if content_type == CONTENT_URL_FORM
|
51
|
+
data = {
|
52
|
+
:body => {
|
53
|
+
:api_key => Klaviyo.private_api_key
|
54
|
+
}
|
55
|
+
}
|
56
|
+
data[:body] = data[:body].merge(kwargs[:params])
|
57
|
+
full_url = "#{V1_API}/#{path}"
|
58
|
+
request(method, full_url, content_type, data)
|
59
|
+
else
|
60
|
+
defaults = {:page => nil,
|
61
|
+
:count => nil,
|
62
|
+
:since => nil,
|
63
|
+
:sort => nil}
|
64
|
+
params = defaults.merge(kwargs)
|
65
|
+
query_params = encode_params(params)
|
66
|
+
full_url = "#{V1_API}/#{path}?api_key=#{Klaviyo.private_api_key}#{query_params}"
|
67
|
+
request(method, full_url, content_type)
|
68
|
+
end
|
50
69
|
end
|
51
70
|
|
52
|
-
def self.v2_request(method, path, kwargs
|
71
|
+
def self.v2_request(method, path, **kwargs)
|
53
72
|
path = "#{V2_API}/#{path}"
|
54
73
|
key = {
|
55
74
|
"api_key": "#{Klaviyo.private_api_key}"
|
56
75
|
}
|
57
76
|
data = {}
|
58
77
|
data[:body] = key.merge(kwargs)
|
59
|
-
request(method, path, data)
|
78
|
+
request(method, path, CONTENT_JSON, data)
|
60
79
|
end
|
61
80
|
|
62
81
|
def self.build_params(params)
|
63
|
-
"data=#{Base64.encode64(JSON.generate(params)).gsub(/\n/,'')}"
|
82
|
+
"data=#{CGI.escape(Base64.encode64(JSON.generate(params)).gsub(/\n/, ''))}"
|
64
83
|
end
|
65
84
|
|
66
|
-
def self.
|
67
|
-
if kwargs[:email].to_s.empty? and kwargs[:id].to_s.empty?
|
68
|
-
raise Klaviyo::KlaviyoError.new(
|
85
|
+
def self.check_required_args(kwargs)
|
86
|
+
if kwargs[:email].to_s.empty? and kwargs[:phone_number].to_s.empty? and kwargs[:id].to_s.empty?
|
87
|
+
raise Klaviyo::KlaviyoError.new(REQUIRED_ARG_ERROR)
|
69
88
|
else
|
70
89
|
return true
|
71
90
|
end
|
@@ -8,6 +8,9 @@ require_relative 'apis/public'
|
|
8
8
|
require_relative 'apis/lists'
|
9
9
|
require_relative 'apis/metrics'
|
10
10
|
require_relative 'apis/profiles'
|
11
|
+
require_relative 'apis/campaigns'
|
12
|
+
require_relative 'apis/email_templates'
|
13
|
+
require_relative 'apis/data_privacy'
|
11
14
|
|
12
15
|
module Klaviyo
|
13
16
|
class << self
|
@@ -19,5 +22,6 @@ module Klaviyo
|
|
19
22
|
|
20
23
|
NO_PRIVATE_API_KEY_ERROR = 'Please provide your Private API key for this request'
|
21
24
|
NO_PUBLIC_API_KEY_ERROR = 'Please provide your Public API key for this request'
|
22
|
-
|
25
|
+
REQUIRED_ARG_ERROR = 'You must identify a user by email, ID or phone_number'
|
26
|
+
INVALID_ID_TYPE_ERROR = 'Invalid id_type provided, must be one of: email, phone_number, person_id'
|
23
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: klaviyo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Klaviyo Team
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -74,6 +74,9 @@ extra_rdoc_files: []
|
|
74
74
|
files:
|
75
75
|
- klaviyo.gemspec
|
76
76
|
- lib/klaviyo.rb
|
77
|
+
- lib/klaviyo/apis/campaigns.rb
|
78
|
+
- lib/klaviyo/apis/data_privacy.rb
|
79
|
+
- lib/klaviyo/apis/email_templates.rb
|
77
80
|
- lib/klaviyo/apis/lists.rb
|
78
81
|
- lib/klaviyo/apis/metrics.rb
|
79
82
|
- lib/klaviyo/apis/profiles.rb
|
@@ -84,7 +87,7 @@ files:
|
|
84
87
|
homepage: https://www.klaviyo.com/
|
85
88
|
licenses: []
|
86
89
|
metadata: {}
|
87
|
-
post_install_message:
|
90
|
+
post_install_message:
|
88
91
|
rdoc_options: []
|
89
92
|
require_paths:
|
90
93
|
- lib
|
@@ -99,9 +102,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
102
|
- !ruby/object:Gem::Version
|
100
103
|
version: '0'
|
101
104
|
requirements: []
|
102
|
-
|
103
|
-
|
104
|
-
signing_key:
|
105
|
+
rubygems_version: 3.0.8
|
106
|
+
signing_key:
|
105
107
|
specification_version: 4
|
106
108
|
summary: You heard us, a Ruby wrapper for the Klaviyo API
|
107
109
|
test_files: []
|