Note: This isn't officially supported by Shopify and thus functionality could be adversely affected at any time
Faced with the need of automatically generating coupon codes I turned to the Shopify public API. Unfortunately, no such functionality existed. I figured the ones used by their admin panel were just undocumented, however the typical API credentials weren't accepted. This wrapper enables this use of such API's.
If you'd like to read more about how and why this works, see https://ma.rtin.so/reverse-engineering-shopify-private-apis
- PHP 5.4+
- PHP curl
- Shopify store admin account
<?php
require 'shopify.php';
$api = new \Shopify\PrivateAPI('username', 'password', 'https://mystore.myshopify.com/admin');
if (!$api->isLoggedIn() && !$api->login()) {
echo 'invalid credentials';
} else {
# Create a 5% discount coupon
$new_discount = ['discount' => [
'applies_to_id' => '',
'code' => 'automatic_coupon',
'discount_type' => 'percentage',
'value' => 5,
'usage_limit' => 1,
'starts_at' => date('Y-m-d\TH:i:sO', mktime(0, 0, 0)),
'ends_at' => null,
'applies_once' => false
]];
# Set the CSRF token for the POST request
try { $api->setToken('https://mystore.myshopify.com/admin/discounts/new'); }
catch (\Exception $ex) { }
$do_discount = $api->doRequest('POST', 'discounts.json', $new_discount);
print_r($do_discount);
# List coupons
$params = [
'limit' => 50,
'order' => 'id+DESC',
'direction' => 'next'
];
$discounts = $api->doRequest('GET', 'discounts.json', $params);
if (isset($discounts->discounts)) {
$coupons = $discounts->discounts;
foreach ($coupons as $coupon) {
print_r($coupon);
}
}
$params = [
'reportcenter' => true,
'start_date' => '2013-02-22',
'end_date' => '2013-03-01',
'timezone' => 'Pacific+Time+(US+%26+Canada)'
];
$referrals = $api->doRequest('GET', 'referrals.json', $params);
print_r($referrals);
$facts = $api->doRequest('GET', 'facts.json', $params);
print_r($facts);
$periodical_facts = $api->doRequest('GET', 'periodical_facts.json', $params);
print_r($periodical_facts);
}
stdClass Object
(
[discount] => stdClass Object
(
[applies_once] =>
[applies_to_id] =>
[code] => automated_token_example
[ends_at] =>
[id] => 16956508
[minimum_order_amount] => 0.00
[starts_at] => 2013-03-01T00:00:00-08:00
[status] => enabled
[usage_limit] => 1
[value] => 5.0
[discount_type] => percentage
[applies_to_resource] =>
[times_used] => 0
)
)
(
stdClass Object
(
[applies_once] =>
[applies_to_id] =>
[code] => automated_token_example
[ends_at] =>
[id] => 16956508
[minimum_order_amount] => 0.00
[starts_at] => 2013-03-01T00:00:00-08:00
[status] => enabled
[usage_limit] => 1
[value] => 5.0
[discount_type] => percentage
[applies_to_resource] =>
[times_used] => 0
)
...
)
stdClass Object
(
[start_date] => 2013-02-22
[end_date] => 2013-03-01
[search_terms] => Array
(
[0] => stdClass Object
(
[terms] => shopify.com
[count] => 1
[percentage] => 100
)
)
[top_referrals] => Array
(
[0] => stdClass Object
(
[referrer] => www.example.com
[count] => 530
[percentage] => 56.025369978858
)
....
)
)
stdClass Object
(
[start_date] => 2013-02-22
[end_date] => 2013-03-01
[facts] => stdClass Object
(
[orders] => xxx4
[visits] => xxx83
[customers] => xxx0
[unique_visits] => xxx8
[revenue_per_visitor] => x2.600408834586
[revenue_per_customer] => xx9.10291304348
[revenue_order_average] => xxx9.34515748031
[repeat_customer_percentage] => 29.4488188976378
[revenue] => xxxxxxx8
)
[conversions] => stdClass Object
(
[total] => stdClass Object
(
[count] => xxx3
[percentage] => 100
)
[cart] => stdClass Object
(
[count] => xxx1
[percentage] => 40.663436451733
)
Use at your own risk, enjoy!