---
name: kanal-bfcm-2026-balanced
description: Prepares Black Friday and Cyber Monday 2026 on WhatsApp in Kanal with the Kanal MCP: lists, wave segments, templates (image header, STOP in the footer, quick replies), campaigns and automations, as drafts. Use it when the user asks to prepare their Black Friday, Cyber Monday or BFCM on WhatsApp with Kanal.
---

# BFCM WhatsApp calendar 2026 (Kanal) · Balanced

Source: https://getkanal.com/bfcm

Intensity: Balanced. Teaser, early access, launch in waves, Saturday follow-up, Cyber Monday and Christmas. Who it's for: An engaged list that has already received campaigns.

## Before you start

- This skill works with the Kanal MCP connector. Read get_best_practices, get_segment_capabilities and get_automation_capabilities before the first creation.
- Read list_segments_and_groups and list_templates: reuse what already exists under the same name instead of duplicating it.
- Everything you create is a draft. Never submit a template to Meta, activate an automation or send a campaign without the user's explicit go. Scheduling and sending happen in Kanal (builder_url).
- Before each campaign, give the cost estimate (get_campaign_cost_estimate) and the number of contacts (preview_segment).
- Adapt with the user before creating: store name, offer, links, products, tone of voice, language, countries and Christmas shipping deadline. Fincut and -30% are examples.

## The calendar

| Date | Time | What | Audience | Excluded | Template |
|---|---|---|---|---|---|
| 2026-11-09 |  | Grow the WhatsApp list |  |  |  |
| 2026-11-10 |  | Create the lists and segments |  |  |  |
| 2026-11-12 |  | Write and submit the 8 templates |  |  |  |
| 2026-11-18 |  | Test on the team | Team BF26 |  |  |
| 2026-11-19 | 11:00 | The teaser | VIP, Wave 1, Wave 2 | Not this year BF26 | bf26_teaser |
| 2026-11-24 |  | Turn on the automations |  |  | bf26_panier, bf26_commande_livree |
| 2026-11-25 | 18:00 | Early access | Early access BF26, VIP | Not this year BF26 | bf26_acces_anticipe |
| 2026-11-26 |  | The day before: schedule, send nothing |  |  |  |
| 2026-11-27 | 10:00 | Black Friday: the launch in 3 waves | 10:00 Wave 1, 13:00 Wave 2, 17:00 Wave 3 | Not this year BF26, BFCM buyers | bf26_lancement |
| 2026-11-28 | 11:00 | The Saturday follow-up | Saturday follow-up | Not this year BF26, BFCM buyers | bf26_relance_samedi |
| 2026-11-29 |  | Sunday: a break |  |  |  |
| 2026-11-30 | 10:00 | Cyber Monday: the last day | Cyber Monday | Not this year BF26, BFCM buyers | bf26_cyber_monday |
| 2026-12-01 |  | Measure and wrap up |  |  |  |
| 2026-12-03 | 11:00 | Delivered before Christmas | Christmas | Not this year BF26 | bf26_noel |

### 2026-11-09 · Grow the WhatsApp list

A WhatsApp message only goes to contacts who said yes. Three weeks out is the time to open more ways in, with a keyword that puts every new subscriber in the Early access list.

- A wa.me magic link with the pre-filled message “BLACKFRIDAY”, in your bio, your stories and your emails
- The same link as a QR code on parcels and in store
- A pop-up on the site that opens WhatsApp
- An automation on the keyword “BLACKFRIDAY”: welcome, opt-in, added to the Early access BF26 list

### 2026-11-10 · Create the lists and segments

3 lists that the template buttons will fill, and 7 dynamic segments that split your list by engagement. They are what makes sending in waves possible.

- Lists: Team BF26, Early access BF26, Not this year BF26
- Segments: VIP, Wave 1, Wave 2, Wave 3, Saturday follow-up, Cyber Monday, Christmas
- Check each segment's contact count before creating it

### 2026-11-12 · Write and submit the 8 templates

Meta has to approve each template before it can be sent. Submit them all two weeks ahead and a rejection still leaves time to fix it. A pending template can already go into a campaign: the send waits for approval.

- MARKETING category for every offer
- An image in the header, “Reply STOP” in the footer
- Realistic examples for each variable (“Emma”, not “test”)
- Track the status in Kanal: draft, pending, approved, rejected

### 2026-11-18 · Test on the team

Every template goes to the Team BF26 list first: that's where you catch an empty variable, a badly cropped image or a button that leads to the wrong place, before it reaches 10,000 customers.

- Add the team and 2 or 3 loyal customers to the Team BF26 list
- Send the teaser to this list and tap every button
- Check the links, the codes and the send time

### 2026-11-19 11:00 · The teaser

Nothing is revealed: you announce the date and offer early access. The two buttons sort every customer: those who want first access, and those who would rather get nothing.

### 2026-11-24 · Turn on the automations

Abandoned carts and deliveries are about to surge: the two flows run on their own until Christmas, whatever the intensity. The cart flow stops by itself as soon as the customer orders.

- Cart reminder BF26: 1 hour after abandonment
- Order delivered BF26: on the carrier's “delivered” status
- Stop the flow when the customer replies

### 2026-11-25 18:00 · Early access

Customers who said yes to the teaser and your VIPs get the offer two days before everyone else, with a code in their name, created when they tap.

### 2026-11-26 · The day before: schedule, send nothing

Friday's three waves are scheduled, the team has its replies ready in the inbox, best-seller stock is checked. No marketing message that day.

- Schedule the 10 am, 1 pm and 5 pm waves
- Prepare quick replies: sizes, delivery times, returns
- Check that the promo codes work on the site

### 2026-11-27 10:00 · Black Friday: the launch in 3 waves

The same template goes out in three rounds, from the most engaged to the least engaged. Each wave learns from the previous one, and the number keeps its quality rating.

### 2026-11-28 11:00 · The Saturday follow-up

Only for those who clicked on Friday without ordering. Not a new promo: help choosing, with sizing and delivery times.

### 2026-11-29 · Sunday: a break

No campaign on Sunday morning, and no third message in three days. Cart reminders keep running on their own, and the team answers open conversations.

### 2026-11-30 10:00 · Cyber Monday: the last day

For those who have read without ordering since Wednesday. One message, one reason to act: midnight tonight.

### 2026-12-01 · Measure and wrap up

Reads, clicks, orders per wave: that's what will tell you next year when to send and to whom. BFCM buyers become a segment of their own for the December follow-ups.

- Compare Friday's 3 waves
- Create the BFCM buyers segment
- Note the most frequent questions received in the inbox

### 2026-12-03 11:00 · Delivered before Christmas

A week later, the reason to buy changes: the delivery cutoff date. For engaged contacts, Black Friday buyers included, because now it's about gifts.

## Groups and segments

Lists are Kanal contact lists (not WhatsApp groups), static, filled by the template buttons. Segments update themselves. Conditions use the create_segment format: the blocks of the `conditions` array are combined with AND, the conditions of a block with OR. To exclude a list, add { conditionType: 'group_membership', operator: 'is_not_in', group_id } with the id read in list_segments_and_groups.

### Team BF26

List (create_group). The team and a few loyal customers, added by hand for testing.

### Early access BF26

List (create_group). Those who tapped “Yes, I want access” on the teaser or sent the keyword BLACKFRIDAY.

### Not this year BF26

List (create_group). Those who tapped “Not this year” or “Not interested”. Excluded from everything else.

### VIP

Segment (preview_segment, then create_segment). 3 orders or more.

```json
[
  [
    {
      "conditionType": "properties",
      "propertyAction": "number_of_orders",
      "operator": "is_at_least",
      "value": 3
    }
  ]
]
```

### Wave 1

Segment (preview_segment, then create_segment). Clicked a WhatsApp message in the last 30 days, or VIP.

```json
[
  [
    {
      "conditionType": "contact_events",
      "event": "whatsapp_clicked",
      "operator": "at_least_once",
      "time_interval": "in_the_last",
      "time_interval_options": {
        "value": 30,
        "value_type": "days"
      }
    },
    {
      "conditionType": "properties",
      "propertyAction": "number_of_orders",
      "operator": "is_at_least",
      "value": 3
    }
  ]
]
```

### Wave 2

Segment (preview_segment, then create_segment). Read a message in the last 30 days without clicking, fewer than 3 orders.

```json
[
  [
    {
      "conditionType": "contact_events",
      "event": "whatsapp_read",
      "operator": "at_least_once",
      "time_interval": "in_the_last",
      "time_interval_options": {
        "value": 30,
        "value_type": "days"
      }
    }
  ],
  [
    {
      "conditionType": "contact_events",
      "event": "whatsapp_clicked",
      "operator": "zero_times",
      "time_interval": "in_the_last",
      "time_interval_options": {
        "value": 30,
        "value_type": "days"
      }
    }
  ],
  [
    {
      "conditionType": "properties",
      "propertyAction": "number_of_orders",
      "operator": "is_at_most",
      "value": 2
    }
  ]
]
```

### Wave 3

Segment (preview_segment, then create_segment). Ordered in the past year, hasn't read a message in 30 days.

```json
[
  [
    {
      "conditionType": "contact_events",
      "event": "order_created",
      "operator": "at_least_once",
      "time_interval": "in_the_last",
      "time_interval_options": {
        "value": 12,
        "value_type": "months"
      }
    }
  ],
  [
    {
      "conditionType": "contact_events",
      "event": "whatsapp_read",
      "operator": "zero_times",
      "time_interval": "in_the_last",
      "time_interval_options": {
        "value": 30,
        "value_type": "days"
      }
    }
  ]
]
```

### Saturday follow-up

Segment (preview_segment, then create_segment). Clicked since Thursday, no order since Thursday.

```json
[
  [
    {
      "conditionType": "contact_events",
      "event": "whatsapp_clicked",
      "operator": "at_least_once",
      "time_interval": "after",
      "time_interval_options": {
        "date": "2026-11-26"
      }
    }
  ],
  [
    {
      "conditionType": "contact_events",
      "event": "order_created",
      "operator": "zero_times",
      "time_interval": "after",
      "time_interval_options": {
        "date": "2026-11-26"
      }
    }
  ]
]
```

### Cyber Monday

Segment (preview_segment, then create_segment). Read a message since Wednesday, no order since Wednesday.

```json
[
  [
    {
      "conditionType": "contact_events",
      "event": "whatsapp_read",
      "operator": "at_least_once",
      "time_interval": "after",
      "time_interval_options": {
        "date": "2026-11-24"
      }
    }
  ],
  [
    {
      "conditionType": "contact_events",
      "event": "order_created",
      "operator": "zero_times",
      "time_interval": "after",
      "time_interval_options": {
        "date": "2026-11-24"
      }
    }
  ]
]
```

### BFCM buyers

Segment (preview_segment, then create_segment). Ordered between November 25 and December 1. Excluded from follow-ups, kept for Christmas.

```json
[
  [
    {
      "conditionType": "contact_events",
      "event": "order_created",
      "operator": "at_least_once",
      "time_interval": "between_dates",
      "time_interval_options": {
        "start_date": "2026-11-25",
        "end_date": "2026-12-01"
      }
    }
  ]
]
```

### Christmas

Segment (preview_segment, then create_segment). Read a message in the last 30 days, buyers included.

```json
[
  [
    {
      "conditionType": "contact_events",
      "event": "whatsapp_read",
      "operator": "at_least_once",
      "time_interval": "in_the_last",
      "time_interval_options": {
        "value": 30,
        "value_type": "days"
      }
    }
  ]
]
```

## The templates

One template per message, written for that message (create_template with the campaign_id). Messages after a quick reply button are session messages (wa-message, wa-cta-url), with no Meta review. The header images are public examples: offer the user to use their own.

### bf26_teaser

- When: Thursday, November 19, 11 am

```
bf26_teaser · MARKETING · en
Header: image https://getkanal.com/lp/bfcm/teaser.jpg
Body:
Hi {{1}}, on Friday, November 27, we're launching our biggest offer of the year. Want access 48 hours before everyone else?
Variables: {{1}} = first name (example "Emma")
Footer: Reply STOP to stop receiving our messages
Buttons: [Yes, I want access] (quick reply) [Not this year] (quick reply)
```

- If the customer taps "Yes, I want access": Added to the Early access BF26 list, then message "Got it, Emma. To put the right selection together for you: what tempts you most?" [T-shirts] [Polos] [Pants], then answer saved in the bf_interest variable, then: “Perfect, see you Wednesday, November 25 at 6 pm.”
- If the customer taps "Not this year": Added to the Not this year BF26 list, then message "Noted, we won't message you about Black Friday. Talk soon.", then the list is excluded from every BF26 campaign.

Flow: Campaign → bf26_teaser template; “Yes” → Early access BF26 list → message with an image and 3 choices → bf_interest variable; “Not this year” → Not this year BF26 list → confirmation message → end

### bf26_acces_anticipe

- When: Wednesday, November 25, 6 pm

```
bf26_acces_anticipe · MARKETING · en
Header: image https://getkanal.com/lp/bfcm/vip.jpg
Body:
Hi {{1}}, as promised, the private sale opens for you now, two days before everyone else: 30% off the entire collection.
Variables: {{1}} = first name (example "Emma")
Footer: Reply STOP to stop receiving our messages
Buttons: [I want my code] (quick reply) [Later] (quick reply)
```

- If the customer taps "I want my code": Discount code created for this customer (30% off, valid for 7 days), then message "Your code: VIP-EMMA30. It works sitewide until Monday, November 30 at midnight." [Shop now], then shopify tag bf26_vip added to the customer.
- If the customer taps "Later": message "No problem, your access stays open until Friday. We won't follow up before then.", then end of flow.

Flow: Campaign → bf26_acces_anticipe template; “I want my code” → unique discount code → message with the code and a button to the collection → bf26_vip tag; “Later” → confirmation message → end

### bf26_lancement

- When: Friday, November 27, 10 am, 1 pm and 5 pm

```
bf26_lancement · MARKETING · en
Header: image https://getkanal.com/lp/bfcm/lancement.jpg
Body:
Hi {{1}}, Black Friday is on: 30% off sitewide until midnight on Monday. The best-sellers go first.
Variables: {{1}} = first name (example "Emma")
Footer: Reply STOP to stop receiving our messages
Buttons: [See the deals] (link https://fincut.fr/collections/black-friday) [Help me choose] (quick reply)
```

- If the customer taps "Help me choose": message "Happy to help. Tell us what you're looking for (item, size, budget) and we'll answer you here.", then the conversation lands in the Kanal inbox: the team or the AI agent replies.

Flow: Campaign → bf26_lancement template, sent in 3 waves; “See the deals” → Black Friday collection; “Help me choose” → session message → conversation in the inbox

### bf26_relance_samedi

- When: Saturday, November 28, 11 am

```
bf26_relance_samedi · MARKETING · en
Header: image https://getkanal.com/lp/bfcm/weekend.jpg
Body:
Hi {{1}}, you took a look at the selection yesterday. The offer runs until midnight on Monday, and we can help you find the right size.
Variables: {{1}} = first name (example "Emma")
Footer: Reply STOP to stop receiving our messages
Buttons: [See the selection] (link https://fincut.fr/collections/black-friday) [I'd like advice] (quick reply)
```

- If the customer taps "I'd like advice": message "Of course. Which item are you interested in, and what size do you usually wear?", then conversation in the inbox, answered by the team.

Flow: Campaign → bf26_relance_samedi template; Audience: clicked since Thursday, hasn't ordered; “I'd like advice” → session message → conversation in the inbox

### bf26_cyber_monday

- When: Monday, November 30, 10 am

```
bf26_cyber_monday · MARKETING · en
Header: image https://getkanal.com/lp/bfcm/cyber.jpg
Body:
Hi {{1}}, it's the last day: Cyber Monday keeps 30% off sitewide until midnight tonight.
Variables: {{1}} = first name (example "Emma")
Footer: Reply STOP to stop receiving our messages
Buttons: [Last chance] (link https://fincut.fr/collections/black-friday) [Not interested] (quick reply)
```

- If the customer taps "Not interested": Added to the Not this year BF26 list, then message "Understood, no more offers this time. Happy holidays.", then the contact is excluded from the Christmas campaign.

Flow: Campaign → bf26_cyber_monday template; Audience: read a message since Wednesday, hasn't ordered; “Not interested” → Not this year BF26 list → end

### bf26_panier

- When: Automation, from November 24 to December 24
- Trigger: Shopify abandoned cart, 1 hour later

```
bf26_panier · MARKETING · en
Header: text "Your cart is saved"
Body:
Hi {{1}}, your cart is waiting for you. Black Friday prices stay valid until midnight on Monday.
Variables: {{1}} = first name (example "Emma")
Footer: Reply STOP to stop receiving our messages
Buttons: [Back to my cart] (link to the customer's cart)
```


Flow: Trigger: Shopify abandoned cart; Wait 1 hour → bf26_panier template with the customer's cart link; The flow stops on its own if the customer orders

### bf26_commande_livree

- When: Automation, from November 24 to December 24
- Trigger: Shopify shipping status: delivered

```
bf26_commande_livree · MARKETING · en
Header: image https://getkanal.com/lp/bfcm/merci.jpg
Body:
Hi {{1}}, your order has arrived. Thank you for choosing Fincut this Black Friday. Does everything fit?
Variables: {{1}} = first name (example "Emma")
Footer: Reply STOP to stop receiving our messages
Buttons: [Yes, perfect] (quick reply) [I have an issue] (quick reply)
```

- If the customer taps "Yes, perfect": message "So glad you like it. A review really helps future customers: 30 seconds, promise." [Leave a review], then end of flow.
- If the customer taps "I have an issue": message "We're sorry. Tell us what's wrong (size, item, parcel): the team will answer you here.", then conversation in the inbox, as a priority.

Flow: Trigger: parcel delivered; bf26_commande_livree template; “Yes, perfect” → review request with a link; “I have an issue” → session message → inbox

### bf26_noel

- When: Thursday, December 3, 11 am

```
bf26_noel · MARKETING · en
Header: image https://getkanal.com/lp/bfcm/noel.jpg
Body:
Hi {{1}}, are your gifts sorted? Order by {{2}} to get it delivered before Christmas, with gift wrapping on request.
Variables: {{1}} = first name (example "Emma"), {{2}} = cutoff date (example "December 18")
Footer: Reply STOP to stop receiving our messages
Buttons: [See the gifts] (link https://fincut.fr/collections/cadeaux) [A gift idea for him] (quick reply)
```

- If the customer taps "A gift idea for him": message "Three safe bets: the Iconique t-shirt, the navy polo and the gift set. Which one should we show you?" [T-shirt] [Polo] [Gift set], then each choice sends the product page with a link button.

Flow: Campaign → bf26_noel template; Audience: engaged in the last 30 days, Black Friday buyers included; “A gift idea for him” → message with an image and 3 choices → product page

## Order of work

1. Lists Team BF26, Early access BF26, Not this year BF26 (create_group: Kanal contact lists, not WhatsApp groups).
2. The 8 segments: preview_segment, show the count, then create_segment.
3. BLACKFRIDAY keyword automation (create_automation, trigger kanal_v2_keyword): welcome, optin-optout opted_in, group-add (list Early access BF26), then create_magic_link with the pre-filled message BLACKFRIDAY.
4. For each campaign of the calendar: create_campaign, create_template with the campaign_id, add_nodes (wa-template-v2 after the trigger, then one branch per quick reply button), validate_automation.
5. Abandoned cart (shopify_abandoned_checkout, wait-time-v2 1 h, template with the customer's cart button) and delivered parcel (shopify_shipment_updated, event_type delivered) automations; update_automation_settings with stop_on_contact_reply.
6. Summary for the user: what was created, the builder_url links, what they must submit, activate and schedule in Kanal, on the calendar dates.

## Friday's waves

- 10:00 Wave 1: Clickers from the last 30 days and VIPs: the most likely to order, they kick off the day.
- 13:00 Wave 2: Readers who didn't click: they get a message already checked by the first wave.
- 17:00 Wave 3: This year's customers who no longer read: last, once everything runs smoothly.
- Never: No order and no read in a year: they get nothing. That's on purpose.

## The rules

- **STOP in the footer**: Every template ends with “Reply STOP to stop receiving our messages”. Kanal unsubscribes the contact on its own when the STOP comes in.
- **An image in the header**: It sets the tone before the first line. One image per moment: teaser, early access, launch, Christmas.
- **The first name, never first**: "Hi {{1}}," then the benefit: a variable can neither open nor close a template, Meta rejects it. 3 to 4 sentences, one call to action, 1 or 2 emojis at most, never all caps or "!!!".
- **Quick replies in the first message**: A tap on a quick reply opens the 24-hour conversation window: the follow-up goes out as a session message, with no Meta approval.
- **Between 10 am and 8 pm**: In the contact's local time. Tuesday to Thursday for regular campaigns, never on Sunday morning.
- **No two campaigns within 7 days**: Unless it's an announced sequence, like here: teaser, early access, launch. Each follow-up only targets those who haven't ordered.
- **Test before you send**: Every template goes to the Team list first. And never schedule a campaign less than 24 hours ahead on a template that isn't approved yet.
- **Only contacts who said yes**: Magic link, QR code, pop-up, reply to a message. Never a bought list: that's how the number gets banned.

## Another year

Black Friday is the day after the fourth Thursday of November, Cyber Monday the following Monday. Shift every date by the same number of days, keeping the weekdays (teaser on a Thursday, early access on the Wednesday, pause on the Sunday).
