import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.subscriptions.email("SUBSCRIPTION_ID");<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->subscriptions->email('SUBSCRIPTION_ID');
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.subscriptions.email("SUBSCRIPTION_ID")
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/subscriptions/{subscriptionId}/email \
--header 'Authorization: Bearer <token>'package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/subscriptions/{subscriptionId}/email"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.shoply.gg/v1/stores/{storeId}/subscriptions/{subscriptionId}/email")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/subscriptions/{subscriptionId}/email")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "d5b2ae58-5363-4806-bcaf-7fc939e2c948",
"email": "grace@example.com",
"customerId": null,
"productId": "f463e265-097a-4235-bc2f-5239b19a9874",
"variantId": "00e1d395-9ba2-4db3-900a-cb5e2811a2a9",
"productName": "Northwind Pro",
"variantName": "1 month",
"quantity": 1,
"price": 9.99,
"currency": "USD",
"every": 1,
"unit": "month",
"status": "active",
"periodEnd": "2026-11-29T16:20:19Z",
"graceEnd": null,
"renewalOrderId": "e9ae5h0p1ye-cd7fded3be6-1006662",
"renewalUrl": "http://localhost:3002/checkout/e9ae5h0p1ye-cd7fded3be6-1006662",
"firstOrderId": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"cycles": 1,
"remindedAt": "2026-10-22T16:20:19Z",
"endedAt": null,
"revoked": false,
"pausedAt": null,
"resumeAt": null,
"pausedBy": null,
"renewsWith": null,
"autoRenews": false,
"chargeTried": 0,
"chargeNextAt": null,
"createdAt": "2026-10-22T16:20:19Z"
},
"meta": {
"history": [
{
"kind": "reminded",
"detail": "Renewal email sent again, to grace@example.com.",
"actor": "merchant",
"orderId": "e9ae5h0p1ye-cd7fded3be6-1006662",
"at": "2026-10-22T16:20:19Z"
},
{
"kind": "renewal_made",
"detail": "Renewal made for Nov 29, 2026 to Dec 29, 2026, waiting to be paid.",
"actor": "system",
"orderId": "e9ae5h0p1ye-cd7fded3be6-1006662",
"at": "2026-10-22T16:20:19Z"
}
],
"orders": [
{
"id": "e9ae5h0p1ye-cd7fded3be6-1006662",
"status": "pending",
"amount": 9.99,
"currency": "USD",
"renewal": true,
"createdAt": "2026-10-22T16:20:19Z",
"paidAt": null
},
{
"id": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"status": "completed",
"amount": 9.99,
"currency": "USD",
"renewal": false,
"createdAt": "2026-10-22T16:20:19Z",
"paidAt": "2026-10-22T16:20:19Z"
}
]
}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}Email the renewal again
Sends the buyer the link to pay their renewal again, for one whose renewal is waiting. Once an hour a subscription, and 20 every 10 minutes a store, whoever asks: after that the answer is 429. Refused with 409 where no renewal is waiting. The subscription as data, with meta.history (what happened to it, newest first) and meta.orders (its first order and every renewal).
Needs the subscriptions.write permission (Change Subscriptions). It sends an email, and is counted against a budget of its own: 60 in ten minutes for each key.
import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.subscriptions.email("SUBSCRIPTION_ID");<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->subscriptions->email('SUBSCRIPTION_ID');
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.subscriptions.email("SUBSCRIPTION_ID")
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/subscriptions/{subscriptionId}/email \
--header 'Authorization: Bearer <token>'package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/subscriptions/{subscriptionId}/email"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.shoply.gg/v1/stores/{storeId}/subscriptions/{subscriptionId}/email")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/subscriptions/{subscriptionId}/email")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "d5b2ae58-5363-4806-bcaf-7fc939e2c948",
"email": "grace@example.com",
"customerId": null,
"productId": "f463e265-097a-4235-bc2f-5239b19a9874",
"variantId": "00e1d395-9ba2-4db3-900a-cb5e2811a2a9",
"productName": "Northwind Pro",
"variantName": "1 month",
"quantity": 1,
"price": 9.99,
"currency": "USD",
"every": 1,
"unit": "month",
"status": "active",
"periodEnd": "2026-11-29T16:20:19Z",
"graceEnd": null,
"renewalOrderId": "e9ae5h0p1ye-cd7fded3be6-1006662",
"renewalUrl": "http://localhost:3002/checkout/e9ae5h0p1ye-cd7fded3be6-1006662",
"firstOrderId": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"cycles": 1,
"remindedAt": "2026-10-22T16:20:19Z",
"endedAt": null,
"revoked": false,
"pausedAt": null,
"resumeAt": null,
"pausedBy": null,
"renewsWith": null,
"autoRenews": false,
"chargeTried": 0,
"chargeNextAt": null,
"createdAt": "2026-10-22T16:20:19Z"
},
"meta": {
"history": [
{
"kind": "reminded",
"detail": "Renewal email sent again, to grace@example.com.",
"actor": "merchant",
"orderId": "e9ae5h0p1ye-cd7fded3be6-1006662",
"at": "2026-10-22T16:20:19Z"
},
{
"kind": "renewal_made",
"detail": "Renewal made for Nov 29, 2026 to Dec 29, 2026, waiting to be paid.",
"actor": "system",
"orderId": "e9ae5h0p1ye-cd7fded3be6-1006662",
"at": "2026-10-22T16:20:19Z"
}
],
"orders": [
{
"id": "e9ae5h0p1ye-cd7fded3be6-1006662",
"status": "pending",
"amount": 9.99,
"currency": "USD",
"renewal": true,
"createdAt": "2026-10-22T16:20:19Z",
"paidAt": null
},
{
"id": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"status": "completed",
"amount": 9.99,
"currency": "USD",
"renewal": false,
"createdAt": "2026-10-22T16:20:19Z",
"paidAt": "2026-10-22T16:20:19Z"
}
]
}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}Authorizations
A secret API key, made under Developers in the dashboard: Authorization: Bearer shoply_sk_...
Headers
A word of your own for this one change, up to 180 letters, digits, dots, dashes, underscores and colons. Sent again with the same key, the request is not carried out twice: the first answer comes back, with Idempotent-Replay: true.
Path Parameters
The store's ID. A key reaches the store it was made in: GET /key answers which.
The subscription.

