Comprehensive technical solution for implementing customer-choice gift promotions in furniture retail using SAP IS Retail Promotion Management
Leverage existing promotion management capabilities
BADI enhancements and UI5 customer interface
Phased implementation approach
Detailed breakdown of the furniture store's complex multi-tier gift promotion
Comprehensive evaluation of standard capabilities vs. development requirements
What it provides: Complete promotion lifecycle management from planning to execution
What it provides: Standard functionality for free gift promotions with purchase thresholds
What it provides: Built-in gift card and store credit functionality
What it provides: Hierarchical product organization for promotion targeting
Issue: No standard UI exists for customers to select from multiple gift options at POS
Issue: Standard promotion engine cannot handle complex Tier 4 variable conditions
Issue: Limited standard functionality for real-time gift inventory validation during selection
Issue: No standard mechanism for dynamic gift value calculation based on complex business rules
Step-by-step configuration instructions for 70% of the solution using standard SAP functionality
Article hierarchies, gift articles, brand classifications
Promotion types, condition tables, access sequences
POS integration, pricing procedures, condition records
End-to-end testing, business rule validation
| Field | Value | Description |
|---|---|---|
| Hierarchy Type | H | Material Hierarchy |
| Validity From | 08/14/2025 | Promotion start date |
| Validity To | 09/03/2025 | Promotion end date |
| Assignment Logic | Brand-based | Automatic assignment by brand name |
Recommended for large datasets
ARTICLE_NUMBER | BRAND_NAME | HIERARCHY_NODE MAT001 | Beautyrest | 01_BASIC_BRANDS MAT002 | Serta iComfort | 03_LUXURY_BRANDS
| Characteristic | Values | Description |
|---|---|---|
| ZSIZE | QUEEN, KING, CAL_KING | Mattress size compatibility |
| ZTYPE | HEAD_UP, HEAD_FOOT | Adjustment type |
| ZFEATURES | BASIC, PREMIUM, ULTRA | Feature level |
IF BRAND = 'AIRELOOM' AND PURCHASE > 2699 THEN ZTYPE = 'HEAD_FOOT'
ZSIZE MUST MATCH PURCHASED_MATTRESS_SIZE
IF TIER >= 3 THEN ZFEATURES IN ('PREMIUM', 'ULTRA')
Brand + Purchase Amount + Date Range for exact promotion matching
| Seq | Field Name | Table Field | Description | Key |
|---|---|---|---|---|
| 10 | Sales Organization | VKORG | Store organization identifier | ✓ |
| 20 | Distribution Channel | VTWEG | Sales channel (retail stores) | ✓ |
| 30 | Material Hierarchy | PRODH | Brand tier classification | ✓ |
| 40 | Purchase Amount | KBETR | Qualifying purchase threshold | ✓ |
| 50 | Valid From | DATAB | Promotion start date | ✓ |
| 60 | Valid To | DATBI | Promotion end date | ✓ |
Brand + Date Range for general brand qualification without amount restriction
General promotion conditions for minimum purchase requirements
Defines the order of condition table lookup for TV gift promotions
Brand + Amount + Date (Most specific lookup)
Brand + Date (Fallback for brand qualification)
General Promotion (Last resort)
IF SY-DATUM >= KOMK-DATAB AND SY-DATUM <= KOMK-DATBI.
KBERF = 'X'.
ENDIF.
IF KOMK-PRODH IS NOT INITIAL.
KBERF = 'X'.
ENDIF.
IF KOMK-NETWR >= 1000.
KBERF = 'X'.
ENDIF.
Detailed technical specifications for the 30% custom development components
Enhancement for promotion information display and calculation logic
Determines available gift options based on purchase criteria and brand tier
METHOD get_eligible_gifts.
IMPORTING
iv_brand_hierarchy TYPE prodh_d
iv_purchase_amount TYPE curr
iv_customer_id TYPE kunnr
iv_plant TYPE werks_d
iv_transaction_date TYPE dats
EXPORTING
et_eligible_gifts TYPE ztt_gift_options
ev_tier_level TYPE char1
ev_qualification_status TYPE char1.
METHOD get_eligible_gifts.
DATA: lt_gifts TYPE ztt_gift_options,
ls_gift TYPE zs_gift_option,
lv_tier TYPE char1,
lv_amount TYPE curr.
" Step 1: Determine brand tier from hierarchy
CALL FUNCTION 'Z_DETERMINE_BRAND_TIER'
EXPORTING
iv_brand_hierarchy = iv_brand_hierarchy
iv_purchase_amount = iv_purchase_amount
IMPORTING
ev_tier = lv_tier
ev_qualified_amount = lv_amount.
" Step 2: Build gift options based on tier
CASE lv_tier.
WHEN '1'. " Basic Tier
" TV Option
ls_gift-gift_type = 'TV'.
ls_gift-gift_size = '24'.
ls_gift-gift_value = '299.99'.
ls_gift-description = '24" LED Smart TV'.
ls_gift-material_number = 'GIFT_TV_24'.
APPEND ls_gift TO lt_gifts.
" Merchandise Credit Option
ls_gift-gift_type = 'MC'.
ls_gift-gift_value = '50.00'.
ls_gift-description = '$50 Merchandise Credit'.
ls_gift-material_number = 'GIFT_MC_50'.
APPEND ls_gift TO lt_gifts.
" Rebate Option
ls_gift-gift_type = 'RB'.
ls_gift-gift_value = '100.00'.
ls_gift-description = '$100 Add-On Rebate'.
ls_gift-material_number = 'GIFT_RB_100'.
APPEND ls_gift TO lt_gifts.
" Adjustable Base Option
ls_gift-gift_type = 'AB'.
ls_gift-gift_value = '25.00'.
ls_gift-description = 'Head Up Base + $25'.
ls_gift-material_number = 'GIFT_BASE_HU'.
ls_gift-upgrade_fee = '25.00'.
APPEND ls_gift TO lt_gifts.
WHEN '2'. " Premium Tier
" Similar logic for 32" TV, etc.
WHEN '3'. " Luxury Tier
" Logic for 43" TV and $200 options
WHEN '4'. " Ultra Premium
" Complex logic for variable conditions
PERFORM handle_ultra_premium_logic
USING iv_purchase_amount iv_brand_hierarchy
CHANGING lt_gifts.
ENDCASE.
" Step 3: Validate inventory availability
LOOP AT lt_gifts INTO ls_gift.
CALL FUNCTION 'Z_CHECK_GIFT_INVENTORY'
EXPORTING
iv_gift_material = ls_gift-material_number
iv_plant = iv_plant
IMPORTING
ev_available = ls_gift-available_qty
ev_status = ls_gift-availability_status.
" Set availability flag
IF ls_gift-available_qty > 0.
ls_gift-available = 'X'.
ELSE.
ls_gift-available = ''.
ENDIF.
MODIFY lt_gifts FROM ls_gift.
ENDLOOP.
" Step 4: Return results
et_eligible_gifts = lt_gifts.
ev_tier_level = lv_tier.
ev_qualification_status = 'Y'.
ENDMETHOD.
Analyze brand hierarchy and purchase amount to determine qualification tier
Build appropriate gift options based on tier with proper material numbers and values
Check real-time inventory availability for each gift option
Return structured gift options with availability status
Calculate dynamic gift values based on purchase amount, tier, and complex Tier 4 business rules
METHOD calculate_gift_value.
DATA: lv_base_value TYPE curr,
lv_bonus_amount TYPE curr,
lv_total_value TYPE curr.
CASE iv_tier.
WHEN '4'. " Ultra Premium - Complex Logic
" Base gift value
lv_base_value = 300.00.
" Purchase amount-based bonuses
IF iv_purchase_amount > 6000.
lv_bonus_amount = 300.00.
ELSEIF iv_purchase_amount > 4000.
lv_bonus_amount = 200.00.
ELSEIF iv_purchase_amount > 2000.
lv_bonus_amount = 100.00.
ENDIF.
" Aireloom special handling
IF iv_brand_hierarchy CS 'AIRELOOM' AND iv_purchase_amount > 2699.
" Head & Foot base eligible
IF iv_gift_type = 'AB'.
ev_gift_description = 'Head & Foot Adjustable Base'.
ev_upgrade_available = 'X'.
ENDIF.
ELSE.
" Head Up only
IF iv_gift_type = 'AB'.
ev_gift_description = 'Head Up Adjustable Base'.
ENDIF.
ENDIF.
" TSI Base special credit logic
IF iv_gift_type = 'TSI'.
lv_base_value = 300.00.
" Additional tiered bonuses
IF iv_purchase_amount > 9999.
lv_bonus_amount = lv_bonus_amount + 300.00.
ELSEIF iv_purchase_amount > 6999.
lv_bonus_amount = lv_bonus_amount + 200.00.
ELSEIF iv_purchase_amount > 3299.
lv_bonus_amount = lv_bonus_amount + 100.00.
ELSEIF iv_purchase_amount > 1999.
lv_bonus_amount = lv_bonus_amount + 50.00.
ENDIF.
ENDIF.
lv_total_value = lv_base_value + lv_bonus_amount.
WHEN OTHERS.
" Standard tier logic
lv_total_value = iv_base_gift_value.
ENDCASE.
ev_calculated_value = lv_total_value.
ENDMETHOD.
Validate customer gift selection against business rules, inventory, and eligibility criteria
Confirm customer still qualifies for selected gift at time of selection
Real-time check of gift inventory and allocation status
Validate against tier-specific rules and brand restrictions
Ensure gift compatibility with purchased items (e.g., base size)
Reusable business logic components for promotion processing
Determine gift eligibility based on purchase details
| Parameter | Type | Description |
|---|---|---|
| IV_CUSTOMER_ID | KUNNR | Customer number |
| IT_PURCHASE_ITEMS | ZTT_PURCHASE_ITEMS | Purchased items table |
| IV_STORE_ID | WERKS_D | Store location |
| ET_ELIGIBLE_GIFTS | ZTT_GIFT_OPTIONS | Available gift options |
| EV_QUALIFICATION_STATUS | CHAR1 | Qualification status (Y/N/P) |
Real-time inventory validation and allocation
Process customer gift selection and update transaction
Customer gift selection interface for POS integration
zgiftselection/
├── webapp/
│ ├── controller/
│ │ ├── Main.controller.js
│ │ ├── GiftSelection.controller.js
│ │ └── Confirmation.controller.js
│ ├── view/
│ │ ├── Main.view.xml
│ │ ├── GiftSelection.view.xml
│ │ └── Confirmation.view.xml
│ ├── model/
│ │ ├── models.js
│ │ └── GiftModel.js
│ ├── css/
│ │ └── style.css
│ └── manifest.json
├── Component.js
└── index.html
Check customer eligibility and retrieve available gift options
Process customer gift selection and update transaction
Real-time inventory data for gift items
Detailed specifications for POS, inventory, and financial integration
Customer selects items at POS
API call to SAP for eligibility
UI5 app launched for selection
Gift added and transaction completed
Content-Type: application/json
Authorization: Bearer {oauth_token}
X-Store-ID: {store_identifier}
X-Transaction-ID: {unique_transaction_id}
{
"customerId": "0000123456",
"transactionId": "TXN_20250814_001234",
"storeId": "ST001",
"transactionDate": "2025-08-14T14:30:00Z",
"articles": [
{
"articleId": "MAT_BEAUTYREST_001",
"brand": "Beautyrest",
"category": "MATTRESS",
"size": "QUEEN",
"amount": 1299.99,
"currency": "USD",
"quantity": 1
}
]
}
{
"eligible": true,
"tier": "1",
"tierDescription": "Basic Tier",
"giftOptions": [
{
"type": "TV",
"subType": "24_INCH",
"value": 299.99,
"description": "24\" LED Smart TV",
"materialNumber": "GIFT_TV_24",
"available": true,
"inventoryStatus": "IN_STOCK"
},
{
"type": "MC",
"subType": "CREDIT",
"value": 50.00,
"description": "$50 Merchandise Credit",
"materialNumber": "GIFT_MC_50",
"available": true,
"inventoryStatus": "UNLIMITED"
}
]
}
" Gift cost posting
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_doc_header
TABLES
accountgl = lt_account_gl
currencyamount = lt_currency
IMPORTING
obj_key = lv_document_number.
" Promotional expense allocation
ls_account_gl-gl_account = '6200000'. " Promotional Expense
ls_account_gl-costcenter = 'CC_PROMO_001'.
ls_account_gl-profit_ctr = 'PC_RETAIL_001'.
APPEND ls_account_gl TO lt_account_gl.
Phased approach for successful project delivery