talkable 0.0.0 → 0.9.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.
Files changed (38) hide show
  1. checksums.yaml +13 -5
  2. data/.gitignore +4 -2
  3. data/.rspec +1 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +126 -0
  6. data/LICENSE +22 -0
  7. data/README.md +144 -185
  8. data/Rakefile +17 -0
  9. data/lib/talkable.rb +43 -0
  10. data/lib/talkable/api.rb +13 -0
  11. data/lib/talkable/api/base.rb +98 -0
  12. data/lib/talkable/api/offer.rb +11 -0
  13. data/lib/talkable/api/origin.rb +29 -0
  14. data/lib/talkable/api/person.rb +17 -0
  15. data/lib/talkable/api/referral.rb +19 -0
  16. data/lib/talkable/api/reward.rb +19 -0
  17. data/lib/talkable/api/share.rb +19 -0
  18. data/lib/talkable/api/visitor.rb +13 -0
  19. data/lib/talkable/configuration.rb +40 -0
  20. data/lib/talkable/generators/install_generator.rb +81 -0
  21. data/lib/talkable/generators/templates/app/controllers/invite_controller.rb +8 -0
  22. data/lib/talkable/generators/templates/app/views/invite/show.html.erb +2 -0
  23. data/lib/talkable/generators/templates/app/views/invite/show.html.haml +2 -0
  24. data/lib/talkable/generators/templates/app/views/invite/show.html.slim +2 -0
  25. data/lib/talkable/generators/templates/app/views/shared/_talkable_offer.html.erb +4 -0
  26. data/lib/talkable/generators/templates/app/views/shared/_talkable_offer.html.haml +3 -0
  27. data/lib/talkable/generators/templates/app/views/shared/_talkable_offer.html.slim +3 -0
  28. data/lib/talkable/generators/templates/config/initializers/talkable.rb +13 -0
  29. data/lib/talkable/integration.rb +41 -0
  30. data/lib/talkable/middleware.rb +147 -0
  31. data/lib/talkable/railtie.rb +11 -0
  32. data/lib/talkable/resources.rb +3 -0
  33. data/lib/talkable/resources/offer.rb +49 -0
  34. data/lib/talkable/resources/origin.rb +22 -0
  35. data/lib/talkable/version.rb +3 -0
  36. data/solano.yml +20 -0
  37. data/talkable.gemspec +37 -0
  38. metadata +202 -9
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e94689a0311b0f5980c51d6c3b3c59eeaad486cd
4
- data.tar.gz: 2c75680682ea43977ec09be2593777b26a0b73b7
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Y2MzNjExMDczNTIxNjUwMzA4YWNjYTY1M2MzMzg2Y2M1NDAyM2YxNg==
5
+ data.tar.gz: !binary |-
6
+ NTdmZTFiYTIwNzZhNDJmNjhhOWVlNmJkZWQwNzNhYTc2MGNhMTk4Mw==
5
7
  SHA512:
6
- metadata.gz: 832d25a3e582759ee9805ea37aae94c4c4d86dedf42b9da87a21020f4908930ae55eb5bb224a886ad637787449b5c452a69914575f9dcadf6aa1f699141984b9
7
- data.tar.gz: 604b1781a85154c1f744bcdd7c607927ed0ca9fa74972196eb8ea93c22709d3c5b8b0a6975148d5a6a2b0810e0ac37a39a0fe53231a5446e5c0dfebcc21d056d
8
+ metadata.gz: !binary |-
9
+ NmNlMGVjMWRiOTZhZTMzOTZhMjZhNGI0ODBhYzRmYzczYjdlOGZkOTg3NDE1
10
+ NDg3ODIyMzBiMGFhMzMxMzZmMjQ0NTA0NWQ3MWQyOGE5YTFiZTdiZmU1MjVj
11
+ MGJlYmJjMWFkNzk3M2MwZmZhZjRlNzdjNTQwNDA2MjViNmVhMzA=
12
+ data.tar.gz: !binary |-
13
+ OTBjZDU2NDJhYzYzZWU5NGMxOTZmZGNkMzhmM2NkMjMzODY0ODQzMDg5NDU5
14
+ M2I0ZjNmNzk0YWVjN2ViNzc2MmIyMDRjMDYxZGZjODc0ZWE5YjUxMTc4YWM3
15
+ OTExYzhhOTYzZGI1N2Q4Nzk0YjQyZWZiNmY0NWQ3ODNhOGJiYWI=
data/.gitignore CHANGED
@@ -43,8 +43,10 @@ build-iPhoneSimulator/
43
43
  # for a library or gem, you might want to ignore these files since the code is
44
44
  # intended to run in multiple environments; otherwise, check them in:
45
45
  # Gemfile.lock
46
- # .ruby-version
47
- # .ruby-gemset
46
+ .ruby-version
47
+ .ruby-gemset
48
48
 
49
49
  # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
50
50
  .rvmrc
51
+
52
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in testic.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,126 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ talkable (0.9.0)
5
+ furi (~> 0.2)
6
+ hashie (~> 3.4)
7
+ rack (>= 1.5.2, < 2)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ actionpack (4.2.7.1)
13
+ actionview (= 4.2.7.1)
14
+ activesupport (= 4.2.7.1)
15
+ rack (~> 1.6)
16
+ rack-test (~> 0.6.2)
17
+ rails-dom-testing (~> 1.0, >= 1.0.5)
18
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
19
+ actionview (4.2.7.1)
20
+ activesupport (= 4.2.7.1)
21
+ builder (~> 3.1)
22
+ erubis (~> 2.7.0)
23
+ rails-dom-testing (~> 1.0, >= 1.0.5)
24
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
25
+ activesupport (4.2.7.1)
26
+ i18n (~> 0.7)
27
+ json (~> 1.7, >= 1.7.7)
28
+ minitest (~> 5.1)
29
+ thread_safe (~> 0.3, >= 0.3.4)
30
+ tzinfo (~> 1.1)
31
+ addressable (2.4.0)
32
+ ammeter (1.1.3)
33
+ activesupport (>= 3.0)
34
+ railties (>= 3.0)
35
+ rspec-rails (>= 2.2)
36
+ builder (3.2.2)
37
+ crack (0.4.3)
38
+ safe_yaml (~> 1.0.0)
39
+ diff-lcs (1.2.5)
40
+ docile (1.1.5)
41
+ erubis (2.7.0)
42
+ furi (0.2.0)
43
+ haml (4.0.7)
44
+ tilt
45
+ hashdiff (0.3.0)
46
+ hashie (3.4.4)
47
+ i18n (0.7.0)
48
+ json (1.8.3)
49
+ loofah (2.0.3)
50
+ nokogiri (>= 1.5.9)
51
+ mini_portile2 (2.1.0)
52
+ minitest (5.9.0)
53
+ nokogiri (1.6.8)
54
+ mini_portile2 (~> 2.1.0)
55
+ pkg-config (~> 1.1.7)
56
+ pkg-config (1.1.7)
57
+ rack (1.6.4)
58
+ rack-test (0.6.3)
59
+ rack (>= 1.0)
60
+ rails-deprecated_sanitizer (1.0.3)
61
+ activesupport (>= 4.2.0.alpha)
62
+ rails-dom-testing (1.0.7)
63
+ activesupport (>= 4.2.0.beta, < 5.0)
64
+ nokogiri (~> 1.6.0)
65
+ rails-deprecated_sanitizer (>= 1.0.1)
66
+ rails-html-sanitizer (1.0.3)
67
+ loofah (~> 2.0)
68
+ railties (4.2.7.1)
69
+ actionpack (= 4.2.7.1)
70
+ activesupport (= 4.2.7.1)
71
+ rake (>= 0.8.7)
72
+ thor (>= 0.18.1, < 2.0)
73
+ rake (11.2.2)
74
+ rspec (3.5.0)
75
+ rspec-core (~> 3.5.0)
76
+ rspec-expectations (~> 3.5.0)
77
+ rspec-mocks (~> 3.5.0)
78
+ rspec-core (3.5.1)
79
+ rspec-support (~> 3.5.0)
80
+ rspec-expectations (3.5.0)
81
+ diff-lcs (>= 1.2.0, < 2.0)
82
+ rspec-support (~> 3.5.0)
83
+ rspec-mocks (3.5.0)
84
+ diff-lcs (>= 1.2.0, < 2.0)
85
+ rspec-support (~> 3.5.0)
86
+ rspec-rails (3.5.2)
87
+ actionpack (>= 3.0)
88
+ activesupport (>= 3.0)
89
+ railties (>= 3.0)
90
+ rspec-core (~> 3.5.0)
91
+ rspec-expectations (~> 3.5.0)
92
+ rspec-mocks (~> 3.5.0)
93
+ rspec-support (~> 3.5.0)
94
+ rspec-support (3.5.0)
95
+ safe_yaml (1.0.4)
96
+ simplecov (0.12.0)
97
+ docile (~> 1.1.0)
98
+ json (>= 1.8, < 3)
99
+ simplecov-html (~> 0.10.0)
100
+ simplecov-html (0.10.0)
101
+ thor (0.19.1)
102
+ thread_safe (0.3.5)
103
+ tilt (2.0.5)
104
+ tzinfo (1.2.2)
105
+ thread_safe (~> 0.1)
106
+ webmock (2.1.0)
107
+ addressable (>= 2.3.6)
108
+ crack (>= 0.3.2)
109
+ hashdiff
110
+
111
+ PLATFORMS
112
+ ruby
113
+
114
+ DEPENDENCIES
115
+ ammeter
116
+ bundler (~> 1.12)
117
+ haml
118
+ json (~> 1.8.3)
119
+ rake (~> 11.2)
120
+ rspec (~> 3.4)
121
+ simplecov (~> 0.12)
122
+ talkable!
123
+ webmock (~> 2.1)
124
+
125
+ BUNDLED WITH
126
+ 1.12.5
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Talkable
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md CHANGED
@@ -1,12 +1,23 @@
1
- # Talkable Referral Programe API Gem
1
+ # Talkable Referral Program API Gem
2
+ [![](https://ci.solanolabs.com:443/Talkable/talkable-ruby/badges/branches/master?badge_token=c2445aee31992aafe3d8fda62fcde2708f6254f6)](https://ci.solanolabs.com:443/Talkable/talkable-ruby/suites/484176)
2
3
 
3
4
  Talkable Ruby Gem to make your own referral program in Sinatra or Rails application
4
5
 
6
+ ## Demo
5
7
 
8
+ Example of usage at http://github.com/talkable/talkable-spree-example
6
9
 
7
- ## Demo
10
+ Live demo available at http://spree-example.talkable.com
11
+
12
+ ## Requirements
13
+
14
+ Gem requires:
15
+ - `Ruby` version since `1.9.3`
16
+ - `Rack` version since `1.5.2`
8
17
 
9
- Take a spree demo app and intall Talkable
18
+ Gem supports:
19
+ - `Ruby on Rails` since `4.0.0`
20
+ - `Sinatra` since `1.4.0`
10
21
 
11
22
  ## Intallation
12
23
 
@@ -14,232 +25,180 @@ Take a spree demo app and intall Talkable
14
25
  gem "talkable"
15
26
  ```
16
27
 
17
- ## Using Generator
28
+ ### Step by step instruction
18
29
 
19
- ``` sh
20
- rails generate talkable:install
21
- Your talkable site slug (http://talkable.com):
22
- You API token (http://talkable.com/sites/zz/edit):
23
- Do you want a different site to be used for non-production env? (y/n)
24
- Your staging site slug:
25
- Your staging site API token:
30
+ - [Setup configuration file __*__](#configuration)
31
+ - [Add Middleware __*__](#add-talkable-middleware)
32
+ - [Load an offer __*__](#load-an-offer)
33
+ - [Display a share page __*__](#display-an-offer-inside-view)
34
+ - [Integrate Conversion Points](#integrate-conversion-points)
35
+ - [Registering a purchase](#registering-a-purchase)
36
+ - [Registering other events](#registering-other-events)
37
+
38
+ __*__ - Automated in Ruby On Rails by using the generator
26
39
 
40
+ ## Using the Ruby On Rails Generator
27
41
 
28
- create config/initializers/talkable.rb
29
- update app/controllers/application_controller.rb
42
+ Talkable gem provides Ruby On Rails generator to automate an integration process.
30
43
 
31
- create app/controllers/talkable_invite.rb
32
- create app/views/talkable_invite/show.html.erb
33
- update app/layouts/application.html.erb # floating widget install
34
- update app/layouts/_talkable_floating_widget.html.erb
35
- update config/routes.rb
44
+ ``` sh
45
+ rails generate talkable:install
46
+ ```
47
+ ``` sh
48
+ Your Talkable site slug: spree-example
49
+ Your Talkable API Key: SOME-API-KEY
50
+ Do you have a custom domain? [Y/n] n
51
+ ```
52
+ ``` sh
53
+ create config/initializers/talkable.rb
54
+ insert app/controllers/application_controller.rb
55
+ insert app/controllers/application_controller.rb
56
+ create app/views/shared
57
+ create app/views/shared/_talkable_offer.html.erb
58
+ insert app/views/layouts/application.html.erb
59
+ create app/controllers/invite_controller.rb
60
+ create app/views/invite/show.html.erb
61
+ route get '/invite' => 'invite#show'
36
62
  ```
37
63
 
38
64
  ## Configuration
39
65
 
40
66
  ``` ruby
41
- Talkable.configure do |c|
42
- # required
43
- c.site_slug = 'hello'
44
- # or
45
- c.site_slug = Rails.env.production? ? "hello" : "hello-staging"
46
- # required
47
- c.api_token = Rails.env.production? ? "1235" : "6789"
48
- # required
49
- c.server = 'http://invite.site.com' # fetched from site settings automatically using generator
50
- # optional
51
- c.js_integration_library = 'http://d2jj/integration/hello.js' # default
52
- end
53
- ```
54
-
67
+ Talkable.configure do |config|
68
+ # site slug is taken form ENV["TALKABLE_SITE_SLUG"]
69
+ config.site_slug = "spree-example"
55
70
 
71
+ # api key is taken from ENV["TALKABLE_API_KEY"]
72
+ # config.api_key =
56
73
 
57
- ``` ruby
58
- class ApplicationController < ActionController::Base
59
-
60
- initialize_talkable_api
74
+ # custom server address - by default https://www.talkable.com
75
+ # config.server =
61
76
 
77
+ # manually specified per-client integration library
78
+ # config.js_integration_library =
62
79
  end
63
80
 
64
- # GEM internals
65
- class Talkable
66
- module ActionControllerExtension
67
- def self.initialize_talkable_api
68
- before_action :talkable_before_request
69
- end
70
-
71
- def talkable_before_request
72
- cookies[:talkable_visitor_uuid] = params[:talkable_visitor_uuid] || talkable_visitor_uuid
73
- Talkable.with_uuid(talkable_visitor_uuid) do
74
- yield
75
- end
76
- end
77
-
78
- def talkable_visitor_uuid
79
- cookies[:talkable_visitor_uuid] ||= Talkable.find_or_generate_uuid
80
- end
81
- end
82
- end
83
81
  ```
84
82
 
83
+ ## Manual Integration
85
84
 
86
-
87
-
88
- ## API
89
-
90
- Full API support according to DOC
91
-
85
+ ### Add Talkable Middleware
92
86
 
93
87
  ``` ruby
94
- origin = Talkable::API.register_purchase(
95
- {
96
- email: 'a@b.com',
97
- subtotal: 100.53,
98
- coupon_codes: [],
99
- traffic_source: 'zz'
100
- },
101
- )
102
- origin = Talkable::API.register_event()
103
- origin = Talkable::API.register_affiliate_member(
104
- offer = origin.offer
105
- {
106
- email: '...'
107
- sharing_channels: ['facebook', 'embedded_email', 'sms', 'other']
108
- }
109
- )
110
-
111
- offer.claim_links # =>
112
- # {
113
- # twitter: "http://invite.site.com/x/12356"
114
- # facebook: "http://invite.site.com/x/12356"
115
- # embedded_email: "http://invite.site.com/x/12356"
116
- # twitter: "http://invite.site.com/x/12356"
117
- # }
88
+ class Application < Rails::Application
89
+ config.middleware.use Talkable::Middleware
90
+ end
118
91
  ```
119
92
 
120
- ## AD Offer Share page
93
+ ### Load an offer
121
94
 
95
+ Floating widget at every page
122
96
 
97
+ ```ruby
98
+ class ApplicationController < ActionController::Base
99
+ before_action :load_talkable_offer
123
100
 
124
- User facing GEM API
101
+ protected
125
102
 
126
- ``` erb
127
- <%= offer.advocate_share_iframe %>
103
+ def load_talkable_offer
104
+ origin = Talkable.register_affiliate_member(campaign_tags: 'popup')
105
+ @offer ||= origin.offer if origin
106
+ end
128
107
 
108
+ end
129
109
  ```
130
110
 
131
- Generated code:
111
+ or invite page at specific path
132
112
 
133
-
134
- ``` html
135
- <div class='talkable-offer-xxx'>
136
- <!-- result of the JS evaluation - not ruby evaluation -->
137
- <iframe src="https://invite.site.com/x/38828?current_visitor_uuid=<uuid>"></iframe>
138
- </div>
139
-
140
- <script>
141
- _talkableq.push(['init', {
142
- server: '...',
143
- site_id: '...',
144
- visitor_uuid: '...'
145
- }])
146
- _talkableq.push(['show_offer'], "https://invite.site.com/x/38828", {container: 'talkable-offer-xxx'})
147
- </script>
113
+ ```ruby
114
+ class InviteController < ApplicationController
115
+ def show
116
+ origin = Talkable.register_affiliate_member(campaign_tags: 'invite')
117
+ @offer = origin.offer if origin
118
+ end
119
+ end
148
120
  ```
149
121
 
150
- ## integration.js extension
122
+ ### Getting information about an offer
151
123
 
152
- `integration.js` additions. Suppose to be never used directly if using talkable gem
153
-
154
- ``` js
155
- talkable.showOffer(offer.show_url)
124
+ ```ruby
125
+ offer = origin.offer
126
+ offer.claim_links # => { facebook: "https://www.talkable.com/x/kqiYhR", sms: "https://www.talkable.com/x/PFxhNB" }
156
127
  ```
157
128
 
129
+ ### Display an offer inside view
158
130
 
159
- ## Self-Serve UI
160
-
131
+ Provide iframe options to show a share page in specific place
161
132
 
162
- ``` ruby
163
- offer.configure(
164
- facebook: {
165
- title: ['An offer for all my friends', 'Claim your reward'], # AB test
166
- description: 'Click this link and get #{campaign.friend_incentive.description} off on the merchant.com'
167
- image: "http://merchant.com/assets/fb_image.jpg"
168
- },
169
- twitter: {
170
- message: 'Click #{offer.claim_links.twitter} and get {{friend_incentive.description}} off on the merchant.com'
171
- },
172
- )
173
-
174
-
175
- offer.configure(
176
- twitter: {
177
- message: 'Click #{offer.claim_links.twitter} and get {{friend_incentive.description}} off on the merchant.com'
178
- },
179
-
180
- )
133
+ ```erb
134
+ <div id="talkable-inline-offer-container"></div>
135
+ <%== offer.advocate_share_iframe(iframe: {container: 'talkable-inline-offer-container'}) %>
181
136
  ```
182
137
 
138
+ ## Integrate Conversion Points
183
139
 
140
+ ### Registering a purchase
184
141
 
142
+ Registering a purchase has to be implemented manually based on your platform.
143
+ > It's highly required to have submitted purchases for closing a referral loop.
185
144
 
186
- ``` js
187
-
188
- offer = Talkable.offer(<%= offer.to_json %>)
189
- $('.js-share-via-facebook').click(
190
- offer.shareViaFacebook()
191
- )
192
- $('.js-share-via-twitter').click(
193
- offer.shareViaTwitter()
194
- )
195
- $('.js-share-via-sms').click(
196
- offer.shareViaSms()
197
- )
198
- offer.bindClickLink($('.js-plain-offer-link'))
145
+ ```ruby
146
+ Talkable::API::Origin.create(Talkable::API::Origin::PURCHASE, {
147
+ email: 'customer@email.com',
148
+ order_number: 'ORDER-12345',
149
+ subtotal: 123.45,
150
+ coupon_code: 'SALE10', # optional
151
+ ip_address: request.remote_ip, # optional
152
+ shipping_zip: '94103', # optional
153
+ shipping_address: '290 Division St., Suite 405, San Francisco, California, 94103, United States', # optional
154
+ items: order_items.map do |item|
155
+ {
156
+ price: item.price,
157
+ quantity: item.quantity,
158
+ product_id: item.product_id,
159
+ title: item.title,
160
+ }
161
+ end # optional
162
+ })
199
163
  ```
200
164
 
201
-
202
- ``` haml
203
- %h1= offer.localize('offer_title')
204
- %h1= offer.ab_test("Share with friends", "Get yourself a discount %{advocate_amount}", advocate_amount: campaign.advocate_incentive.description)
205
- %p
206
- Share this offer with friends and get <%= campaign.advocate_incentive.description %>
207
-
208
-
209
- %a.js-share-via-facebook Facebook
210
- %a.js-share-via-twitter Twitter
211
- %a.js-share-via-sms Twitter
165
+ ### Registering other events
166
+
167
+ ```ruby
168
+ Talkable::API::Origin.create(Talkable::API::Origin::EVENT, {
169
+ email: 'customer@email.com',
170
+ event_number: 'N12345',
171
+ event_category: 'user_signuped',
172
+ subtotal: 123.45, # optional
173
+ coupon_code: 'SALE10', # optional
174
+ ip_address: request.remote_ip, # optional
175
+ shipping_zip: '94103', # optional
176
+ shipping_address: '290 Division St., Suite 405, San Francisco, California, 94103, United States', # optional
177
+ items: order_items.map do |item|
178
+ {
179
+ price: item.price,
180
+ quantity: item.quantity,
181
+ product_id: item.product_id,
182
+ title: item.title,
183
+ }
184
+ end # optional
185
+ })
212
186
  ```
213
187
 
188
+ ## API
214
189
 
215
- ``` ruby
216
- # routes.rb
217
- mount Talkable::Rack => 'talkable'
190
+ Full API support according to [DOC](http://docs.talkable.com/api_v2.html)
191
+
192
+ ```ruby
193
+ Talkable::API::Origin.create(Talkable::API::Origin::PURCHASE, {
194
+ email: 'customer@domain.com',
195
+ order_number: '123',
196
+ subtotal: 34.56,
197
+ })
198
+ Talkable::API::Offer.find(short_url_code)
199
+ Talkable::API::Share.create(short_url_code, Talkable::API::Share::CHANNEL_SMS)
200
+ Talkable::API::Reward.find(visitor_uuid: '8fdf75ac-92b4-479d-9974-2f9c64eb2e09')
201
+ Talkable::API::Person.find(email)
202
+ Talkable::API::Person.update(email, unsubscribed: true)
203
+ Talkable::API::Referral.update(order_number, Talkable::API::Referral::APPROVED)
218
204
  ```
219
-
220
-
221
- ## TODO
222
-
223
- Functionality:
224
-
225
- * [ ] Gem infrustructure
226
- * [ ] Configuration
227
- * [ ] API
228
- * Custom Traffic Source
229
- * Custom User Agent
230
- * Visitors
231
- * Origins
232
- * Shares
233
- * Rewards
234
- * [ ] Controller uuid hook
235
- * [ ] Offer Share Iframe
236
- * [ ] Integration JS additions
237
- * [ ] Ruby iframe generation method
238
- * [ ] Generator
239
- * [ ] Documentation
240
- * Post-Checkout integration instructions
241
- * Events integration instructions
242
- * [ ] Setup demo with the most popular ruby shopping cart gem
243
-
244
- Caveats:
245
- * [ ] Prevent API call to create visitor on first request. Delay until user interacts with RAF.