Promotion CRM Operations
This document provides comprehensive documentation for all GraphQL operations available in the CRM Promotion API.
Queriesβ
promotionβ
Get a single promotion by ID with full CRM details.
query GetPromotion($id: ID!) {
promotion(id: $id) {
id
name
description
slug
category
type
status
visibility
imageUrl
altText
backgroundColor
startDate
endDate
primaryButton {
text
action {
modal
}
loggedOutText
loggedOutAction {
modal
}
usedText
}
secondaryButton {
action {
modal
}
}
howItWorks {
steps
longDescription
terms
}
seo {
title
description
socialImage
}
slider {
name
title
description
imageUrl
btnText
link
actionType
initialClickCount
}
popup {
name
title
description
imageUrl
btnText
link
actionType
layout
initialClickCount
}
videoSlider {
name
title
description
videoUrl
btnText
link
actionType
initialClickCount
}
}
}
Arguments:
id
(ID!, required): The promotion ID
Returns: PromotionCmsModel
Access: CMS role required
promotionsβ
Get paginated list of promotions with CRM filtering options.
query GetPromotions(
$limit: Int
$offset: Int
$order: SortOrder
$orderBy: PromotionOrderByType
$filter: PromotionFilterInput
) {
promotions(
limit: $limit
offset: $offset
order: $order
orderBy: $orderBy
filter: $filter
) {
count
data {
id
name
description
slug
category
type
status
createdAt
updatedAt
}
limit
offset
}
}
Arguments:
limit
(Int, optional): Maximum results per pageoffset
(Int, optional): Number of results to skiporder
(SortOrder, optional): Sort direction (ASC, DESC)orderBy
(PromotionOrderByType, optional): Sort fieldfilter
(PromotionFilterInput, optional): Advanced filtering options
Returns: PromotionPaginationResponse
Access: CMS role required
slidersβ
Get paginated list of slider content with CRM filtering.
query GetSliders(
$limit: Int
$offset: Int
$order: SortOrder
$orderBy: PromotionOrderByType
$filter: PromotionSlidersFilterInput
) {
sliders(
limit: $limit
offset: $offset
order: $order
orderBy: $orderBy
filter: $filter
) {
count
data {
id
name
category
status
slider {
name
title
actionType
initialClickCount
}
}
limit
offset
}
}
Arguments:
limit
(Int, optional): Maximum results per pageoffset
(Int, optional): Number of results to skiporder
(SortOrder, optional): Sort directionorderBy
(PromotionOrderByType, optional): Sort fieldfilter
(PromotionSlidersFilterInput, optional): Slider-specific filtering
Returns: PromotionSlidersPaginationResponse
Access: CMS role required
popupsβ
Get paginated list of popup content with CRM filtering.
query GetPopups(
$limit: Int
$offset: Int
$order: SortOrder
$orderBy: PromotionOrderByType
$filter: PromotionPopupsFilterInput
) {
popups(
limit: $limit
offset: $offset
order: $order
orderBy: $orderBy
filter: $filter
) {
count
data {
id
name
category
status
popup {
name
title
layout
actionType
initialClickCount
}
}
limit
offset
}
}
Arguments:
limit
(Int, optional): Maximum results per pageoffset
(Int, optional): Number of results to skiporder
(SortOrder, optional): Sort directionorderBy
(PromotionOrderByType, optional): Sort fieldfilter
(PromotionPopupsFilterInput, optional): Popup-specific filtering
Returns: PromotionPopupsPaginationResponse
Access: CMS role required
videoSlidersβ
Get paginated list of video slider content with CRM filtering.
query GetVideoSliders(
$limit: Int
$offset: Int
$order: SortOrder
$orderBy: PromotionOrderByType
$filter: PromotionVideoSlidersFilterInput
) {
videoSliders(
limit: $limit
offset: $offset
order: $order
orderBy: $orderBy
filter: $filter
) {
count
data {
id
name
category
status
videoSlider {
name
title
actionType
initialClickCount
}
}
limit
offset
}
}
Arguments:
limit
(Int, optional): Maximum results per pageoffset
(Int, optional): Number of results to skiporder
(SortOrder, optional): Sort directionorderBy
(PromotionOrderByType, optional): Sort fieldfilter
(PromotionVideoSlidersFilterInput, optional): Video slider-specific filtering
Returns: PromotionPopupsPaginationResponse
Access: CMS role required
Mutationsβ
Content Creationβ
createSmallPromotionβ
Create a lightweight promotion with optional components.
mutation CreateSmallPromotion($input: CreateSmallPromotionInput!) {
createSmallPromotion(input: $input) {
id
name
description
slug
category
type
status
}
}
Input Structure:
input CreateSmallPromotionInput {
promotion: CreatePromotionInput!
promotionSlider: CreatePromotionSliderInput
promotionPopup: CreatePromotionPopupInput
promotionVideoSlider: CreatePromotionVideoSliderInput
}
Returns: PromotionCmsModel
Access: CMS role required
createBigPromotionβ
Create a comprehensive promotion with advanced features.
mutation CreateBigPromotion($input: CreateBigPromotionInput!) {
createBigPromotion(input: $input) {
id
name
description
slug
category
type
status
howItWorks {
steps
longDescription
terms
}
secondaryButton {
action {
modal
}
}
}
}
Input Structure:
input CreateBigPromotionInput {
promotion: CreatePromotionInput!
promotionSlider: CreatePromotionSliderInput
promotionPopup: CreatePromotionPopupInput
promotionVideoSlider: CreatePromotionVideoSliderInput
}
Returns: PromotionCmsModel
Access: CMS role required
Content Updatesβ
updatePromotionβ
Update promotion metadata and configuration.
mutation UpdatePromotion($input: UpdatePromotionInput!) {
updatePromotion(input: $input) {
id
name
description
category
visibility
startDate
endDate
}
}
Input Structure:
input UpdatePromotionInput {
id: ID!
name: LanguageKeyVal
description: LanguageKeyVal
category: PromotionCategory
visibility: ViewVisibility
startDate: String
endDate: String
# ... other updatable fields
}
Returns: PromotionCmsModel
Access: CMS role required
duplicatePromotionβ
Create a copy of an existing promotion.
mutation DuplicatePromotion($id: ID!) {
duplicatePromotion(id: $id) {
id
name
slug
category
type
status
}
}
Arguments:
id
(ID!, required): ID of promotion to duplicate
Returns: PromotionCmsModel
Access: CMS role required
Component Managementβ
addSliderToPromotionβ
Add slider component to existing promotion.
mutation AddSliderToPromotion($input: AddSliderToPromotionInput!) {
addSliderToPromotion(input: $input)
}
Input Structure:
input AddSliderToPromotionInput {
promotionId: ID!
category: SliderCategory!
promotionSlider: CreatePromotionSliderInput!
}
Returns: Boolean
Access: CMS role required
addPopupToPromotionβ
Add popup component to existing promotion.
mutation AddPopupToPromotion($input: AddPopupToPromotionInput!) {
addPopupToPromotion(input: $input)
}
Input Structure:
input AddPopupToPromotionInput {
promotionId: ID!
category: PopupCategory!
promotionPopup: CreatePromotionPopupInput!
}
Returns: Boolean
Access: CMS role required
addVideoSliderToPromotionβ
Add video slider component to existing promotion.
mutation AddVideoSliderToPromotion($input: AddVideoSliderToPromotionInput!) {
addVideoSliderToPromotion(input: $input)
}
Input Structure:
input AddVideoSliderToPromotionInput {
promotionId: ID!
category: VideoSliderCategory!
promotionVideoSlider: CreatePromotionVideoSliderInput!
}
Returns: Boolean
Access: CMS role required
Component Updatesβ
updateSliderOnPromotionβ
Update slider component on existing promotion.
mutation UpdateSliderOnPromotion($input: UpdateSliderToPromotionInput!) {
updateSliderOnPromotion(input: $input)
}
Input Structure:
input UpdateSliderToPromotionInput {
promotionId: ID!
promotionSlider: UpdatePromotionSliderInput!
}
Returns: Boolean
Access: CMS role required
updatePopupOnPromotionβ
Update popup component on existing promotion.
mutation UpdatePopupOnPromotion($input: UpdatePopupToPromotionInput!) {
updatePopupOnPromotion(input: $input)
}
Input Structure:
input UpdatePopupToPromotionInput {
promotionId: ID!
promotionPopup: UpdatePromotionPopupInput!
}
Returns: Boolean
Access: CMS role required
updateVideoSliderOnPromotionβ
Update video slider component on existing promotion.
mutation UpdateVideoSliderOnPromotion(
$input: UpdateVideoSliderToPromotionInput!
) {
updateVideoSliderOnPromotion(input: $input)
}
Input Structure:
input UpdateVideoSliderToPromotionInput {
promotionId: ID!
promotionVideoSlider: UpdatePromotionVideoSliderInput!
}
Returns: Boolean
Access: CMS role required
Lifecycle Managementβ
changePromotionStatusβ
Change the lifecycle status of a promotion.
mutation ChangePromotionStatus($id: ID!, $status: PromotionStatus!) {
changePromotionStatus(id: $id, status: $status)
}
Arguments:
id
(ID!, required): Promotion IDstatus
(PromotionStatus!, required): New status (DRAFT, STAGING_ACTIVE, ACTIVE, INACTIVE, ARCHIVED)
Returns: Boolean
Access: CMS role required
Sorting Operationsβ
sortPromotionsβ
Sort general promotions for main app visibility.
mutation SortPromotions($input: SortPromotionsInput!) {
sortPromotions(input: $input)
}
Input Structure:
input SortPromotionsInput {
sort: [PromotionIdIndexInput!]!
category: PromotionSortCategory!
}
input PromotionIdIndexInput {
promotionId: ID!
index: Int!
}
Returns: Boolean
Access: CMS role required
sortSlidersβ
Sort slider content by category for main app visibility.
mutation SortSliders($input: SortPromotionSlidersInput!) {
sortSliders(input: $input)
}
Input Structure:
input SortPromotionSlidersInput {
sort: [PromotionIdIndexInput!]!
category: SliderCategory!
}
Returns: Boolean
Access: CMS role required
sortPopupsβ
Sort popup content by category for main app visibility.
mutation SortPopups($input: SortPromotionPopupsInput!) {
sortPopups(input: $input)
}
Input Structure:
input SortPromotionPopupsInput {
sort: [PromotionIdIndexInput!]!
category: PopupCategory!
}
Returns: Boolean
Access: CMS role required
sortVideoSlidersβ
Sort video slider content by category for main app visibility.
mutation SortVideoSliders($input: SortPromotionVideoSlidersInput!) {
sortVideoSliders(input: $input)
}
Input Structure:
input SortPromotionVideoSlidersInput {
sort: [PromotionIdIndexInput!]!
category: VideoSliderCategory!
}
Returns: Boolean
Access: CMS role required
Bulk Operationsβ
bulkUpdatePromotionβ
Update multiple translatable fields at once.
mutation BulkUpdatePromotion($input: BulkUpdatePromotionInput!) {
bulkUpdatePromotion(input: $input)
}
Input Structure:
input BulkUpdatePromotionInput {
id: ID!
bulkUpdate: PromotionBulkUpdateInput!
}
Returns: Boolean
Access: CMS role required
deletePromotionsβ
Delete multiple promotions at once.
mutation DeletePromotions($ids: [ID!]!) {
deletePromotions(ids: $ids)
}
Arguments:
ids
([ID!]!, required): Array of promotion IDs to delete
Returns: Boolean
Access: CMS role required
Component Removalβ
unsetSliderOnPromotionβ
Remove slider component from promotions.
mutation UnsetSliderOnPromotion($ids: [ID!]!) {
unsetSliderOnPromotion(ids: $ids)
}
Arguments:
ids
([ID!]!, required): Array of promotion IDs
Returns: Boolean
Access: CMS role required
unsetPopupOnPromotionβ
Remove popup component from promotions.
mutation UnsetPopupOnPromotion($ids: [ID!]!) {
unsetPopupOnPromotion(ids: $ids)
}
Arguments:
ids
([ID!]!, required): Array of promotion IDs
Returns: Boolean
Access: CMS role required
unsetVideoSliderOnPromotionβ
Remove video slider component from promotions.
mutation UnsetVideoSliderOnPromotion($ids: [ID!]!) {
unsetVideoSliderOnPromotion(ids: $ids)
}
Arguments:
ids
([ID!]!, required): Array of promotion IDs
Returns: Boolean
Access: CMS role required
Cache Managementβ
clearPromotionCachesβ
Clear all promotion-related caches.
mutation ClearPromotionCaches {
clearPromotionCaches
}
Returns: Boolean
Access: CMS role required
Error Handlingβ
Common Error Codesβ
PROMOTION_NOT_FOUND
{
"message": "Promotion with ID 'xyz' not found",
"code": "PROMOTION_NOT_FOUND"
}
INVALID_STATUS_TRANSITION
{
"message": "Cannot transition from ACTIVE to DRAFT",
"code": "INVALID_STATUS_TRANSITION"
}
DUPLICATE_SLUG
{
"message": "Promotion with slug 'example-promo' already exists",
"code": "DUPLICATE_SLUG"
}
INSUFFICIENT_PERMISSIONS
{
"message": "CMS role required for this operation",
"code": "INSUFFICIENT_PERMISSIONS"
}
Usage Examplesβ
Create Complete Promotionβ
mutation {
createSmallPromotion(
input: {
promotion: {
name: "Summer Casino Bonus"
description: "Get 100% match on your first deposit"
category: CASINO
slug: "summer-casino-bonus"
visibility: BOTH
imageFileName: "summer-bonus.jpg"
altText: "Summer Casino Bonus"
primaryButton: {
text: "Claim Now"
action: { modal: WALLET }
loggedOutText: "Sign In to Claim"
loggedOutAction: { modal: SIGN_IN }
usedText: "Already Claimed"
}
seo: {
title: "Summer Casino Bonus - 100% Match"
description: "Don't miss our summer casino bonus"
socialImageFileName: "summer-bonus-social.jpg"
}
}
promotionSlider: {
name: "Summer Slider"
title: "Summer Bonus!"
description: "100% Match Deposit"
imageFileName: "summer-slider.jpg"
btnText: "Claim Now"
actionType: AUTH
initialClickCount: 150
altText: "Summer bonus slider"
primaryButton: { text: "Get Bonus", action: { modal: WALLET } }
}
}
) {
id
name
status
slider {
name
title
}
}
}
Sort Content for Visibilityβ
mutation {
# First activate promotions
changePromotionStatus(id: "promo1", status: STAGING_ACTIVE)
changePromotionStatus(id: "promo2", status: STAGING_ACTIVE)
# Then sort for main app visibility
sortSliders(
input: {
sort: [
{ promotionId: "promo1", index: 0 }
{ promotionId: "promo2", index: 1 }
]
category: HOME_PAGE
}
)
}
Bulk Content Managementβ
mutation {
# Update multiple fields at once
bulkUpdatePromotion(
input: {
id: "promo1"
bulkUpdate: {
name: { EN: "Updated Name", ES: "Nombre Actualizado" }
description: {
EN: "Updated Description"
ES: "DescripciΓ³n Actualizada"
}
}
}
)
# Delete multiple promotions
deletePromotions(ids: ["old1", "old2", "old3"])
}