This report investigates how promotional campaigns and coupon
strategies drive customer purchases at Regork.
The analysis identifies which campaign types and brand categories
(National vs. Private) perform best across different household
income levels.
Through transactional and redemption data, we estimate: - The
redemption intensity per income group,
- The revenue uplift from redeemed vs. unredeemed
baskets, and
- The efficiency of marketing investment across brand
types.
The results provide clear guidance on where marketing resources are over- or under-allocated, highlighting high-performing customer segments to prioritize.
Key takeaways (auto-filled once code runs):
- The report computes redemption and revenue lift by
campaign and segment, quantifies under/over-investment
vs. redemption & revenue share, and highlights National
vs. Private Brand differences along household
income.
The dataset is sourced from the
completejourney package, which simulates
consumer purchase behavior, campaign participation, and coupon
redemption patterns.
It includes multiple linked tables:
| Dataset | Description |
|---|---|
transactions |
All customer-level purchase transactions |
products |
Product hierarchy and brand details |
demographics |
Customer household attributes (income, age, marital status) |
coupons |
Coupons distributed under different campaigns |
redemptions |
Coupons that were actually redeemed |
campaigns |
Marketing campaign metadata |
These datasets are cleaned, standardized, and merged into a single analytical view to evaluate campaign impact and efficiency.
## Columns in redemptions:
## [1] "household_id" "coupon_upc" "campaign_id" "redemption_date"
##
## Columns in coupons:
## [1] "coupon_upc" "product_id" "campaign_id"
##
## Sample coupon_upc values:
## [1] "51380041013" "51380041313" "53377610033" "51380041013" "54300016033"
## [1] "10000085207" "10000085207" "10000085207" "10000085207" "10000085207"
##
## redeemed data preview:
## # A tibble: 6 × 14
## household_id.x coupon_upc campaign_id.x redemption_date product_id
## <chr> <chr> <chr> <date> <chr>
## 1 1029 51380041013 26 2017-01-01 12781564
## 2 1029 51380041013 26 2017-01-01 12781828
## 3 1029 51380041013 26 2017-01-01 12781829
## 4 1029 51380041013 26 2017-01-01 12782182
## 5 1029 51380041013 26 2017-01-01 12783359
## 6 1029 51380041013 26 2017-01-01 12798506
## # ℹ 9 more variables: campaign_id.y <chr>, campaign_id <chr>,
## # household_id.y <chr>, start_date <date>, end_date <date>,
## # campaign_type <ord>, brand <fct>, department <chr>, product_category <chr>
## 🧭 campaign_id type in transactions_ctx: character
## 🧭 campaign_id type in campaigns_full: character
## Unique campaign_ids in campaigns_full: 27
## campaigns_full now has 27 unique campaign IDs.
## Joining transactions_ctx with cleaned campaigns_full by 'campaign_id'...
## Join completed successfully. Result now has 24 columns.
## Renamed household_id.x → household_id
## Redemption join completed successfully.
##
## transactions_ctx created successfully!
## Dimensions: 3185643 x 27
## Preview of first rows:
## household_id store_id basket_id product_id quantity sales_value
## 1 900 330 31198570044 1095275 1 0.50
## 2 900 330 31198570047 9878513 1 0.99
## 3 1228 406 31198655051 1041453 1 1.43
## 4 906 319 31198705046 1020156 1 1.50
## 5 906 319 31198705046 1020156 1 1.50
## 6 906 319 31198705046 1020156 1 1.50
## 7 906 319 31198705046 1020156 1 1.50
## 8 906 319 31198705046 1020156 1 1.50
## 9 906 319 31198705046 1020156 1 1.50
## 10 906 319 31198705046 1053875 2 2.78
## retail_disc coupon_disc coupon_match_disc week transaction_timestamp
## 1 0.00 0 0 1 2017-01-01 06:53:26
## 2 0.10 0 0 1 2017-01-01 07:10:28
## 3 0.15 0 0 1 2017-01-01 07:26:30
## 4 0.29 0 0 1 2017-01-01 07:30:27
## 5 0.29 0 0 1 2017-01-01 07:30:27
## 6 0.29 0 0 1 2017-01-01 07:30:27
## 7 0.29 0 0 1 2017-01-01 07:30:27
## 8 0.29 0 0 1 2017-01-01 07:30:27
## 9 0.29 0 0 1 2017-01-01 07:30:27
## 10 0.80 0 0 1 2017-01-01 07:30:27
## transaction_date brand department product_category income
## 1 2017-01-01 National PASTRY ROLLS 35-49K
## 2 2017-01-01 Private GROCERY FACIAL TISS/DNR NAPKIN 35-49K
## 3 2017-01-01 Private GROCERY BAG SNACKS 100-124K
## 4 2017-01-01 National GROCERY REFRGRATD DOUGH PRODUCTS Under 15K
## 5 2017-01-01 National GROCERY REFRGRATD DOUGH PRODUCTS Under 15K
## 6 2017-01-01 National GROCERY REFRGRATD DOUGH PRODUCTS Under 15K
## 7 2017-01-01 National GROCERY REFRGRATD DOUGH PRODUCTS Under 15K
## 8 2017-01-01 National GROCERY REFRGRATD DOUGH PRODUCTS Under 15K
## 9 2017-01-01 National GROCERY REFRGRATD DOUGH PRODUCTS Under 15K
## 10 2017-01-01 National GROCERY SEAFOOD - SHELF STABLE Under 15K
## marital_status age coupon_upc campaign_id household_id.y campaign_type
## 1 Married 35-44 <NA> <NA> <NA> <NA>
## 2 Married 35-44 10000089113 13 1 Type A
## 3 Unmarried 45-54 51111075545 27 1001 Type A
## 4 Married 55-64 10000085426 13 1 Type A
## 5 Married 55-64 10000085476 18 1 Type A
## 6 Married 55-64 57680000024 25 105 Type B
## 7 Married 55-64 57680000025 12 1 Type B
## 8 Married 55-64 57680000025 8 1 Type A
## 9 Married 55-64 57680000050 18 1 Type A
## 10 Married 55-64 <NA> <NA> <NA> <NA>
## start_date end_date redemption_date redeemed_flag is_campaign_window
## 1 <NA> <NA> <NA> FALSE FALSE
## 2 2017-08-08 2017-09-24 <NA> FALSE FALSE
## 3 2017-02-08 2017-03-26 <NA> FALSE FALSE
## 4 2017-08-08 2017-09-24 <NA> FALSE FALSE
## 5 2017-10-30 2017-12-24 <NA> FALSE FALSE
## 6 2016-12-06 2017-02-05 <NA> FALSE TRUE
## 7 2017-07-12 2017-08-13 <NA> FALSE FALSE
## 8 2017-05-08 2017-06-25 <NA> FALSE FALSE
## 9 2017-10-30 2017-12-24 <NA> FALSE FALSE
## 10 <NA> <NA> <NA> FALSE FALSE
## $n_transactions
## [1] 3185643
##
## $n_coupon_rows
## [1] 116204
##
## $n_redemptions
## [1] 2102
##
## $pct_txn_in_campaign_window
## [1] 0.1100905
## Renamed household_id.x → household_id
## redeem_by_seg created successfully.
## rate_seg successfully created!
| Redemptions per 1,000 Campaign-Window Transactions | ||||
| income_bucket | brand | redemptions | txn_in_window | redemptions_per_1k_txn |
|---|---|---|---|---|
| 150-174K | National | 97097 | 0 | 97,097,000.00 |
| 150-174K | Private | 11514 | 0 | 11,514,000.00 |
| 50-74K | NA | 168 | 0 | 168,000.00 |
| NA | NA | 143 | 0 | 143,000.00 |
| Other/Unknown | NA | 74 | 0 | 74,000.00 |
| 35-49K | NA | 73 | 0 | 73,000.00 |
| 75-99K | NA | 42 | 0 | 42,000.00 |
| Under 15K | NA | 41 | 0 | 41,000.00 |
| 150-174K | NA | 36 | 0 | 36,000.00 |
| 25-34K | NA | 17 | 0 | 17,000.00 |
| 50-74K | National | 604534 | 36116 | 16,738.68 |
| 75-99K | National | 224073 | 18337 | 12,219.72 |
| 35-49K | National | 240376 | 27787 | 8,650.66 |
| Other/Unknown | National | 250147 | 30490 | 8,204.23 |
| Under 15K | National | 81214 | 10505 | 7,730.99 |
| 25-34K | National | 97664 | 12661 | 7,713.77 |
| 50-74K | Private | 87830 | 13184 | 6,661.86 |
| 75-99K | Private | 31679 | 6529 | 4,852.04 |
| 25-34K | Private | 19376 | 5340 | 3,628.46 |
| 35-49K | Private | 40318 | 11212 | 3,595.97 |
| Other/Unknown | Private | 35018 | 9784 | 3,579.11 |
| NA | National | 371077 | 106156 | 3,495.58 |
| Under 15K | Private | 12403 | 4601 | 2,695.72 |
| NA | Private | 60461 | 43361 | 1,394.36 |
| 15-24K | National | 0 | 10135 | 0.00 |
| 15-24K | Private | 0 | 4494 | 0.00 |
| Key Performance Indicators | |
| Transactions in Campaign Window | 350,709 |
| Total Revenue (Campaign Window) | $1,063,061 |
| Coupon Redemptions | 2,265,375 |
| Redemption Rate (Txn w/ Coupon) | 4.0% |
## uplift_df created successfully!
| Investment Balance by Brand | ||||||||
| brand | coupon_supply | supply_share | redemptions | redemption_share | revenue | revenue_share | over_invested_vs_redemption | over_invested_vs_revenue |
|---|---|---|---|---|---|---|---|---|
| National | 100807 | 86.8% | 1966182 | 86.8% | 830737.5 | 78.2% | −0.0% | 8.6% |
| Private | 15381 | 13.2% | 298599 | 13.2% | 232225.0 | 21.8% | 0.1% | −8.6% |
| NA | 16 | 0.0% | 594 | 0.0% | 0.0 | 0.0% | −0.0% | 0.0% |
## **Highest redemption intensity:** 150-174K households on National
## (~97097000 per 1k transactions)
##
## **Strongest basket uplift:** 25-34K on Private,
## +$0.63 per basket when redeemed
##
## **Most under-invested vs. demand:** National
## (coupon supply share trails redemption & revenue share)
Recommendation: Focus coupon allocation on income–brand segments with the highest redemption intensity and strongest uplift. Scale winning campaign types and trim over-invested categories. ```
The following visualizations show how coupon and campaign activity contribute to revenue growth, brand performance, and marketing investment efficiency.
Interpretation:
This line chart shows how National and Private
brands perform across redemption intensity levels.
Both maintain positive basket lift, but Private brands achieve
higher uplift in moderate ranges (2K–10K).
This suggests that Private Brand campaigns are more efficient at
converting redemptions into incremental value.
Meanwhile, National Brands sustain steady lift, reflecting broad market
engagement and consistent performance.
Observation:
Categories such as Beverages, Dairy,
and Snacks dominate campaign revenues, indicating
strong responsiveness to promotional pricing in everyday
consumables.
Interpretation:
This visualization captures both campaign efficiency and brand contribution in one frame:
Private brands lead in moderate to high
redemption efficiency bands (2K–15K),
suggesting more optimized coupon targeting and stronger value per
redemption.
National brands dominate lower redemption bands, implying broader reach but lower per-redemption efficiency.
The donut chart confirms that while both brands contribute
significantly to revenue,
Private brands generate a higher proportion of total campaign
uplift,
reflecting better campaign ROI within efficient redemption
ranges.
Based on the analysis:
Future analysis could integrate seasonality or digital engagement metrics to refine predictive targeting for the next marketing cycle.