Query 库在 LemonSqueezy 中为 AppSumo 创建数千个折扣码
在 LemonSqueezy 中为 AppSumo 创建数千个折扣码
此 query 连接到 LemonSqueezy API,一次性创建 100 个 100% 折扣码。
多次执行此 query 以创建运行 AppSumo 活动所需的 10,000 个折扣码。
您需要提供:
- 连接 Lemon Squeezy API 的访问令牌(通过变量
$lemonSqueezyAccessToken) - Lemon Squeezy 商店(通过变量
$storeID) - 该折扣码可兑换的产品(通过变量
$variantIDs)
生成的折扣码将是随机字符串。您可以为折扣码添加前缀(通过变量 $codePrefix)、指定折扣码的长度(通过变量 $codeLength),以及自定义折扣码的名称(通过变量 $discountNamePrefix 和 $firstRecordNumber),以便在 Lemon Squeezy 控制台中搜索。
通过提供 $postId,可以收集所有新创建的折扣码,所有折扣码将追加到该文章末尾。
query ExportLemonSqueezyAPIData(
$lemonSqueezyAccessToken: String!,
$variantIDs: [String!]!,
$postId: ID,
) {
bearerToken: _sprintf(
string: "Bearer %s",
values: [$lemonSqueezyAccessToken]
)
@remove
lemonSqueezyAPIHeaders: _echo(value: [
{
name: "Accept",
value: "application/vnd.api+json"
},
{
name: "Content-Type",
value: "application/vnd.api+json"
},
{
name: "Authorization",
value: $__bearerToken
}
])
@export(as: "lemonSqueezyAPIHeaders")
@remove
variants: _echo(value: $variantIDs)
@underEachArrayItem(
passValueOnwardsAs: "variantID"
)
@applyField(
name: "_echo",
arguments: {
value: {
type: "variants",
id: $variantID,
}
}
setResultInResponse: true
)
@export(as: "variants")
hasPostId: _notEmpty(value: $postId)
@export(as: "hasPostId")
}
query CreateMutationInputs(
$storeID: String!,
$discountNamePrefix: String! = "AppSumo campaign",
$codePrefix: String! = "",
$numberCodes: Int! = 100,
$codeLength: Int! = 16,
$firstRecordNumber: Int! = 1,
$isTestMode: Boolean! = false,
)
@depends(on: "ExportLemonSqueezyAPIData")
{
mutationInputs: _arrayPad(array: [], length: $numberCodes, value: null)
@underEachArrayItem(
passIndexOnwardsAs: "key"
affectDirectivesUnderPos: [1, 2, 3, 4, 5]
)
@applyField(
name: "_generateRandomString",
arguments: {
length: $codeLength,
characters: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
},
passOnwardsAs: "randomCode"
)
@applyField(
name: "_strAppend",
arguments: {
after: $codePrefix,
append: $randomCode,
},
passOnwardsAs: "discountCode"
)
@applyField(
name: "_intAdd",
arguments: {
add: $key,
to: $firstRecordNumber,
},
passOnwardsAs: "recordNumber"
)
@applyField(
name: "_sprintf",
arguments: {
string: "%s #%s",
values: [$discountNamePrefix, $recordNumber],
},
passOnwardsAs: "discountName"
)
@applyField(
name: "_echo",
arguments: {
value: {
url: "https://api.lemonsqueezy.com/v1/discounts",
method: POST,
options: {
headers: $lemonSqueezyAPIHeaders
json: {
data: {
type: "discounts",
attributes: {
name: $discountName,
code: $discountCode,
amount: 100,
amount_type: "percent",
is_limited_to_products: true,
is_limited_redemptions: true,
max_redemptions: 1,
test_mode: $isTestMode,
},
relationships: {
store: {
data: {
type: "stores",
id: $storeID,
}
},
variants: {
data: $variants
}
}
}
}
}
}
},
setResultInResponse: true
)
@export(as: "mutationInputs")
@remove
}
query CreateDiscountCodesInLemonSqueezy
@depends(on: "CreateMutationInputs")
{
createDiscountCodesInLemonSqueezy: _sendJSONObjectItemHTTPRequests(inputs: $mutationInputs)
@underEachArrayItem
@underJSONObjectProperty(by: { path: "data.attributes.code" })
@export(as: "discountCodes")
}
query PrintDiscountCodesFromLemonSqueezy
@depends(on: "CreateDiscountCodesInLemonSqueezy")
{
discountCodes: _echo(value: $discountCodes)
}
query GetPostWithDiscountCodes($postId: ID)
@depends(on: "CreateDiscountCodesInLemonSqueezy")
@include(if: $hasPostId)
{
post(by: { id: $postId }, status: any) {
title
postContent: rawContent
discountCodesAsContent: _arrayJoin(
array: $discountCodes,
separator: "\n"
)
updatedPostContent: _sprintf(
string: "%s\n%s"
values: [$__postContent, $__discountCodesAsContent]
)
@export(as: "updatedPostContent")
}
}
mutation UpdatePostWithDiscountCodes($postId: ID)
@depends(on: "GetPostWithDiscountCodes")
@include(if: $hasPostId)
{
updatePost(input: {
id: $postId,
contentAs: { html: $updatedPostContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
title
rawContent
}
}
}