Promotion Workflow Guide
This guide provides step-by-step workflows for common promotion management tasks in the CRM system.
Content Creation Workflows​
Creating a Basic Promotion​
Step 1: Create Base Promotion
mutation CreateBasicPromotion {
createSmallPromotion(
input: {
promotion: {
name: "Welcome Bonus"
description: "Get 100% match on your first deposit"
category: CASINO
slug: "welcome-bonus"
visibility: BOTH
imageFileName: "welcome-bonus.jpg"
altText: "Welcome Bonus Promotion"
primaryButton: {
text: "Claim Now"
action: { modal: WALLET }
loggedOutText: "Sign In to Claim"
loggedOutAction: { modal: SIGN_IN }
usedText: "Already Claimed"
}
seo: {
title: "Welcome Bonus - 100% Match"
description: "Join now and get 100% match on your first deposit"
socialImageFileName: "welcome-social.jpg"
}
}
}
) {
id
name
status
}
}
Step 2: Activate Promotion
mutation ActivatePromotion {
changePromotionStatus(id: "promotion-id", status: STAGING_ACTIVE)
}
Step 3: Sort for Visibility
mutation SortForVisibility {
sortPromotions(
input: {
sort: [{ promotionId: "promotion-id", index: 0 }]
category: PROMOTION
}
)
}
Creating a Comprehensive Campaign​
Step 1: Create Big Promotion with All Components
mutation CreateCampaign {
createBigPromotion(
input: {
promotion: {
name: "Summer Casino Festival"
description: "Join our biggest summer event"
category: CASINO
slug: "summer-festival"
visibility: BOTH
imageFileName: "summer-festival.jpg"
altText: "Summer Festival"
primaryButton: {
text: "Join Festival"
action: { modal: WALLET }
loggedOutText: "Sign In to Join"
loggedOutAction: { modal: SIGN_IN }
usedText: "Already Joined"
}
secondaryButton: { action: { modal: NOTIFICATION } }
howItWorks: {
steps: [
"Register for the festival"
"Make qualifying deposits"
"Earn festival points"
"Claim your rewards"
]
longDescription: "Our summer festival runs for 30 days with daily challenges and rewards"
terms: "Terms and conditions apply. Must be 18+ to participate."
}
seo: {
title: "Summer Casino Festival - Win Big"
description: "Join our summer festival and win amazing prizes"
socialImageFileName: "summer-festival-social.jpg"
}
}
promotionSlider: {
name: "Festival Slider"
title: "Summer Festival!"
description: "Win Big This Summer"
imageFileName: "festival-slider.jpg"
actionType: AUTH
initialClickCount: 200
altText: "Festival slider"
primaryButton: { text: "Join Now", action: { modal: WALLET } }
}
promotionPopup: {
name: "Festival Popup"
title: "Don't Miss Out!"
description: "Summer Festival ends soon"
imageFileName: "festival-popup.jpg"
layout: TEXT_AND_BUTTON
actionType: LINK
link: "https://example.com/festival"
btnText: "Learn More"
initialClickCount: 50
altText: "Festival popup"
primaryButton: { text: "Join Festival", action: { modal: WALLET } }
}
promotionVideoSlider: {
name: "Festival Video"
title: "Festival Highlights"
description: "See what awaits you"
videoFileName: "festival-video.mp4"
actionType: AUTH
initialClickCount: 100
altText: "Festival video"
primaryButton: { text: "Watch & Join", action: { modal: WALLET } }
}
}
) {
id
name
status
type
}
}
Step 2: Activate and Sort All Components
mutation ActivateAndSortCampaign {
# Activate the promotion
changePromotionStatus(id: "campaign-id", status: STAGING_ACTIVE)
# Sort for all content types
sortPromotions(
input: {
sort: [{ promotionId: "campaign-id", index: 0 }]
category: PROMOTION
}
)
sortSliders(
input: {
sort: [{ promotionId: "campaign-id", index: 0 }]
category: HOME_PAGE
}
)
sortPopups(
input: { sort: [{ promotionId: "campaign-id", index: 0 }], category: POPUP }
)
sortVideoSliders(
input: {
sort: [{ promotionId: "campaign-id", index: 0 }]
category: CASINO_EXPLORE
}
)
}
Content Management Workflows​
Adding Components to Existing Promotion​
Add Slider Component
mutation AddSlider {
addSliderToPromotion(
input: {
promotionId: "existing-promotion-id"
category: HOME_PAGE
promotionSlider: {
name: "New Slider"
title: "Special Offer"
description: "Limited time only"
imageFileName: "special-offer.jpg"
actionType: BUTTON
btnText: "Get Offer"
link: "https://example.com/offer"
initialClickCount: 150
altText: "Special offer slider"
primaryButton: { text: "Claim Offer", action: { modal: WALLET } }
}
}
)
}
Add Popup Component
mutation AddPopup {
addPopupToPromotion(
input: {
promotionId: "existing-promotion-id"
category: POPUP
promotionPopup: {
name: "Urgent Popup"
title: "Limited Time!"
description: "Offer expires in 24 hours"
imageFileName: "urgent-popup.jpg"
layout: FULL_SCREEN
actionType: AUTH
initialClickCount: 75
altText: "Urgent popup"
primaryButton: { text: "Act Now", action: { modal: WALLET } }
}
}
)
}
Add Video Slider Component
mutation AddVideoSlider {
addVideoSliderToPromotion(
input: {
promotionId: "existing-promotion-id"
category: CASINO_EXPLORE
promotionVideoSlider: {
name: "Promo Video"
title: "See It In Action"
description: "Watch our latest features"
videoFileName: "promo-video.mp4"
actionType: LINK
btnText: "Learn More"
link: "https://example.com/features"
initialClickCount: 125
altText: "Promo video"
primaryButton: { text: "Try Now", action: { modal: WALLET } }
}
}
)
}
Updating Existing Components​
Update Slider
mutation UpdateSlider {
updateSliderOnPromotion(
input: {
promotionId: "promotion-id"
promotionSlider: {
title: "Updated Slider Title"
description: "New description"
btnText: "Updated Button"
}
}
)
}
Update Popup
mutation UpdatePopup {
updatePopupOnPromotion(
input: {
promotionId: "promotion-id"
promotionPopup: {
title: "Updated Popup Title"
layout: COMPACT
actionType: BUTTON
btnText: "New Action"
link: "https://example.com/new-action"
}
}
)
}
Update Video Slider
mutation UpdateVideoSlider {
updateVideoSliderOnPromotion(
input: {
promotionId: "promotion-id"
promotionVideoSlider: {
title: "Updated Video Title"
description: "New video description"
actionType: AUTH
}
}
)
}
Bulk Operations Workflows​
Bulk Content Management​
Bulk Update Multiple Promotions
mutation BulkUpdatePromotions {
bulkUpdatePromotion(
input: {
id: "promotion-1"
bulkUpdate: {
name: { EN: "Updated Name 1", ES: "Nombre Actualizado 1" }
description: {
EN: "Updated Description 1"
ES: "Descripción Actualizada 1"
}
}
}
)
bulkUpdatePromotion(
input: {
id: "promotion-2"
bulkUpdate: {
name: { EN: "Updated Name 2", ES: "Nombre Actualizado 2" }
description: {
EN: "Updated Description 2"
ES: "Descripción Actualizada 2"
}
}
}
)
}
Bulk Status Changes
mutation BulkStatusChange {
changePromotionStatus(id: "promo-1", status: STAGING_ACTIVE)
changePromotionStatus(id: "promo-2", status: STAGING_ACTIVE)
changePromotionStatus(id: "promo-3", status: STAGING_ACTIVE)
}
Bulk Sorting
mutation BulkSort {
sortPromotions(
input: {
sort: [
{ promotionId: "promo-1", index: 0 }
{ promotionId: "promo-2", index: 1 }
{ promotionId: "promo-3", index: 2 }
]
category: PROMOTION
}
)
sortSliders(
input: {
sort: [
{ promotionId: "promo-1", index: 0 }
{ promotionId: "promo-2", index: 1 }
]
category: HOME_PAGE
}
)
}
Bulk Deletion​
mutation BulkDelete {
deletePromotions(ids: ["old-promo-1", "old-promo-2", "old-promo-3"])
}
Content Lifecycle Workflows​
Draft to Active Workflow​
Step 1: Create Draft
mutation CreateDraft {
createSmallPromotion(input: {
promotion: {
# ... promotion details
}
}) {
id
status # Will be DRAFT
}
}
Step 2: Review and Test
query ReviewDraft {
promotion(id: "draft-id") {
id
name
description
status
# ... all fields for review
}
}
Step 3: Stage for Testing
mutation StagePromotion {
changePromotionStatus(id: "draft-id", status: STAGING_ACTIVE)
}
Step 4: Sort for Visibility
mutation MakeVisible {
sortPromotions(
input: {
sort: [{ promotionId: "draft-id", index: 0 }]
category: PROMOTION
}
)
}
Step 5: Go Live (Production Only)
mutation GoLive {
changePromotionStatus(id: "staged-id", status: ACTIVE)
}
Seasonal Campaign Workflow​
Step 1: Plan Campaign
mutation PlanCampaign {
createBigPromotion(
input: {
promotion: {
name: "Holiday Special"
startDate: "2024-12-01T00:00:00Z"
endDate: "2024-12-31T23:59:59Z"
# ... other details
}
# ... components
}
) {
id
}
}
Step 2: Schedule Activation
mutation ScheduleActivation {
# This would typically be handled by a scheduler
changePromotionStatus(id: "campaign-id", status: STAGING_ACTIVE)
}
Step 3: Monitor and Adjust
query MonitorCampaign {
promotion(id: "campaign-id") {
usersClicks
usersViews
usersClaims
# ... analytics data
}
}
Step 4: End Campaign
mutation EndCampaign {
changePromotionStatus(id: "campaign-id", status: INACTIVE)
}
Troubleshooting Workflows​
Content Not Visible in Main App​
Check Status
query CheckStatus {
promotion(id: "invisible-promo") {
status
visibility
startDate
endDate
}
}
Check Sorting
query CheckSorting {
promotion(id: "invisible-promo") {
indexInPromotions
indexInSliderCategory
indexInPopupCategory
indexInVideoSliderCategory
}
}
Fix Visibility
mutation FixVisibility {
changePromotionStatus(id: "invisible-promo", status: STAGING_ACTIVE)
sortPromotions(
input: {
sort: [{ promotionId: "invisible-promo", index: 0 }]
category: PROMOTION
}
)
}
Clear Caches​
mutation ClearCaches {
clearPromotionCaches
}
Best Practices​
Content Creation​
- Always set SEO fields for better discoverability
- Use descriptive slugs that won't change
- Set appropriate visibility based on target audience
- Include alt text for accessibility
- Test with different action types before going live
Content Management​
- Use staging status for testing
- Sort content after activation for visibility
- Monitor analytics regularly
- Update translations for all languages
- Clean up old content regularly
Performance​
- Use bulk operations for multiple items
- Clear caches after major changes
- Optimize images before upload
- Set appropriate dates to avoid expired content
- Monitor server load during bulk operations
Related Documentation​
- Operations - All available GraphQL operations
- Data Models - Complete schema reference