Skip to main content

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 page
  • offset (Int, optional): Number of results to skip
  • order (SortOrder, optional): Sort direction (ASC, DESC)
  • orderBy (PromotionOrderByType, optional): Sort field
  • filter (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 page
  • offset (Int, optional): Number of results to skip
  • order (SortOrder, optional): Sort direction
  • orderBy (PromotionOrderByType, optional): Sort field
  • filter (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 page
  • offset (Int, optional): Number of results to skip
  • order (SortOrder, optional): Sort direction
  • orderBy (PromotionOrderByType, optional): Sort field
  • filter (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 page
  • offset (Int, optional): Number of results to skip
  • order (SortOrder, optional): Sort direction
  • orderBy (PromotionOrderByType, optional): Sort field
  • filter (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 ID
  • status (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"])
}