发布于 2026-01-06 0 阅读
0

我如何利用 Medusa 构建 Nike 的电子商务功能

我如何利用 Medusa 构建 Nike 的电子商务功能

美杜莎

耐克是全球最大的运动鞋供应商和制造商。耐克成功的部分原因在于其电商网站。2022年,其电商净销售额超过120亿美元,约占耐克2022年全球直接面向消费者收入(187.3亿美元)的65% 。

耐克的电商网站功能丰富,旨在鼓励顾客购买商品。这表明耐克非常了解顾客的需求,以及如何将首次访客转化为忠实顾客。

耐克很早就意识到,他们需要实施全渠道体验,才能为客户提供最佳用户体验。这促使他们利用微服务和云技术构建了自己的无头电商平台。

本文将介绍如何使用 Medusa 实现 Nike 为客户提供的 5 项核心功能。这 5 项功能分别是:

  1. 电子礼品卡
  2. 会员免运费
  3. 搜索建议和自动补全
  4. 会员专享产品
  5. 生日优惠

美杜莎是什么?

GitHub 标志 medusajs /美​​杜莎

数字商务的基石

美杜莎标志

美杜莎

数字商务的基石

Medusa 采用 MIT 许可证发布。 欢迎提交公关稿!

关注 @medusajs Discord聊天

入门

请访问快速入门指南以设置服务器。

请访问文档了解更多关于我们系统要求的信息。

美杜莎是什么?

Medusa 是一套电商模块和工具,让您无需重复编写核心电商逻辑,即可构建功能丰富、可靠且高性能的电商应用。这些模块可定制,并可用于构建高级电商商店、市场平台或任何需要基础电商功能的产品。所有模块均为开源,可在 npm 上免费获取。

请参阅文档,了解有关Medusa 的架构商业模块的更多信息。

路线图、升级和插件

您可以在路线图讨论中查看已计划、已启动和已完成的功能

请遵循升级指南,使您的 Medusa 项目保持最新状态。

查看所有可用的 Medusa 插件

社区与贡献

社区和核心团队都活跃在GitHub Discussions 论坛,您可以在那里……




使用开源电商平台,您可以获得与耐克等定制平台类似的诸多优势。Medusa为希望使用 Node.js 构建可组合电商平台,从而打造个性化电商体验的开发者而设计。

Medusa 的架构使企业和开发者能够构建独特且符合品牌调性的体验。全渠道支持、可扩展性和可定制性等特性是 Medusa 的核心。

Medusa 还提供与自动化 RMA 流程、销售渠道、产品和订单管理等相关的先进电子商务功能。

Medusa 的集成系统为企业提供了更大的灵活性。您可以将任何第三方服务集成到 Medusa 中,从而获得丰富的 CMS 功能、支付网关、客户支持等。您还可以创建专属于您品牌的自定义集成。

如果你喜欢这篇文章,请在 GitHub 上给 Medusa 点个赞🌟

功能一:电子礼品卡

图片描述

耐克允许顾客定制和购买礼品卡。礼品卡可以通过电子邮件发送,也可以以实体卡片的形式邮寄到指定的收货地址。

Medusa 允许创建带有自定义图片、无限金额、描述、标签等的礼品卡。

图片描述

商家还可以指定特定面额或金额的不同货币价格。

图片描述

购买此礼品卡的顾客将收到发送到其邮箱的礼品卡,并可在结账时使用。

您还可以允许客户将礼品卡发送到其他人的邮箱,从而定制用户体验。Medusa(以及所有实体)中的礼品卡都有一个metadata属性。此属性可用于存储自定义数据。

您可以利用它存储自定义收件人电子邮件或收货地址,这样客户就可以将礼品卡发送给他们的家人或朋友。

metadata: {
    recipient_email: 'example@gmail.com'
}
Enter fullscreen mode Exit fullscreen mode

特色二:会员免运费

图片描述

仔细查看耐克提供的功能,你会发现他们的主要目标是将访客和一次性顾客转化为注册顾客。这有助于建立顾客忠诚度,并提高顾客未来再次购买的可能性。

耐克鼓励访客注册成为会员的一种方式是,会员下单即可享受免运费。这使得注册成为会员虽然需要额外步骤,但却非常值得,因为他们可以为当前和未来的订单节省费用。

在 Medusa 中,此功能可以通过结合以下可用功能来实现:客户组折扣订阅者

客户群体

客户群组可用于将具有相似属性的客户分组。然后,您可以为属于该群组的客户应用不同的价格、折扣和规则。

在这个用例中,您可以使用客户组来创建“会员”客户组。稍后您将看到如何在注册时自动将客户添加到该组。

图片描述

折扣

折扣可用于创建折扣码,客户可以使用折扣码来节省订单费用。折扣形式可以是固定金额折扣、百分比折扣或免运费。

折扣也可以附带条件。例如,您可以指定哪些产品可以使用此折扣,或者哪些客户群体可以使用此折扣。

要实现会员免运费功能,您可以创建一个折扣,让属于“会员”客户组的客户享受订单免运费。

图片描述

订阅者

最后一步需要自动执行以下操作:

  1. 注册时将客户添加到会员客户组。
  2. 为会员客户群的顾客增加免运费优惠。

在 Medusa 中,重要操作会触发事件。开发者可以监听或订阅这些事件,并在操作发生时执行自动化任务。他们通过订阅器来实现这一点。

首先,要将客户添加到“会员”客户组,您需要src/subscribers/members.ts在 Medusa 服务器上创建一个订阅者,该订阅者订阅该customer.created活动并将客户添加到“会员”客户组:

import { CustomerGroupService, CustomerService, EventBusService } from "@medusajs/medusa"

type InjectedProperties = {
  eventBusService: EventBusService
  customerService: CustomerService
  customerGroupService: CustomerGroupService
}

class MembersSubscriber {
  customerService: CustomerService
  customerGroupService: CustomerGroupService

  constructor (container: InjectedProperties) {
    this.customerService = container.customerService
    this.customerGroupService = container.customerGroupService

    container.eventBusService.subscribe('customer.created', this.handleRegistration)
  }

  handleRegistration = async (data) => {
    //get Members customer group
    const membersGroup = await this.customerGroupService.list({
      name: 'Members'
    }, { take: 1 })

    if (!membersGroup.length) {
      //Members group doesn't exist
      return
    }

    //add customer to customer group
    await this.customerGroupService.addCustomers(membersGroup[0].id, data.id)
  }
}

export default MembersSubscriber
Enter fullscreen mode Exit fullscreen mode

接下来,您需要创建一个订阅者,用于自动为会员添加免运费折扣。该订阅者应订阅以下事件:` cart.creatednew cart.customer_updated-cart` 和 `add-customer`。第一个事件在创建新购物车时触发,第二个事件在购物车关联的客户发生更改时触发。

import { CartService, EventBusService } from "@medusajs/medusa"

type InjectedDependencies = {
  eventBusService: EventBusService
  cartService: CartService
}

class MemberDiscountSubscriber {
  cartService: CartService
  discountCode: string

  constructor (container: InjectedDependencies) {
    this.cartService = container.cartService
    this.discountCode = 'MEMBERSFREESHIP'

    container.eventBusService.subscribe('cart.created', this.handleDiscount)
    container.eventBusService.subscribe('cart.customer_updated', this.handleDiscount)
  }

  handleDiscount = async (data) => {
    const cartId = typeof data === 'string' ? data : data.id

    this.cartService.update(cartId, {
      discounts: [
        {
          code: this.discountCode
        }
      ]
    })
  }
}

export default MemberDiscountSubscriber
Enter fullscreen mode Exit fullscreen mode

请注意,上面的代码中折扣码是硬编码的。可以更改此行为,将其作为选项包含在内,或使用其他方式检索它DiscountService

功能 3:搜索建议和自动完成

图片描述

电子商务网站必须完善的一项至关重要但又常常被忽视的功能是搜索功能。顾客访问电子商务网站时,通常要么非常清楚自己想要什么,要么至少对想要购买的商品有一个大致的了解。

耐克在为两类客户提供搜索结果方面做得非常出色。客户一旦开始输入搜索词,就能看到热门搜索建议和与搜索词匹配的最佳产品。

如果顾客知道自己要找什么,就能立即在搜索结果中找到所需产品。如果不知道,他们可以参考推荐结果。

在 Medusa 中,可以通过将服务器与AlgoliaMeil​​iSearch等第三方服务集成来实现高级搜索功能。这省去了从头开始实现这些功能的麻烦,并允许您在商店中使用一流的品牌服务。

图片描述

Algolia 和 Meil​​iSearch 都提供高级功能,例如即时搜索结果、拼写错误容错、搜索建议、自动补全等等。您可以通过在 Medusa 服务器上安装相应的插件来集成其中一项服务。之后,您可以根据客户的需求自定义店铺的用户界面。

功能四:会员专享产品

图片描述

与免运费功能类似,耐克还提供仅限会员或注册用户购买的产品。这进一步鼓励访客注册并浏览专属产品。

在 Medusa 中,这可以通过以下功能的组合来实现:客户群、销售渠道和订阅者。

客户群体

如前所述,成员可以用名为“成员”的客户组来表示。接下来,您需要实现将“成员”客户组自动分配给已注册客户的功能,如前所述。

销售渠道

销售渠道允许您针对商店中的不同渠道定制销售方式和产品种类。渠道可以是不同的平台,例如网站或移动端。渠道也可以是不同的客户类型,例如 B2B 客户或会员。

要实现会员专属商品功能,您需要创建一个会员专属销售渠道。然后,您可以设置仅在该销售渠道中提供特定商品,而不在默认渠道中提供这些商品。

图片描述

订阅者

最后一步是创建两个订阅者,分别处理以下任务:

  1. 注册时将客户添加到会员客户组。
  2. 将会员销售渠道分配给会员购物车。

第一个实现方式已在前面解释过,您可以在前面的章节中找到代码块。

至于第二个问题,您需要创建一个订阅者,该订阅者会订阅cart.created相应的cart.customer_updated事件。如果与购物车关联的客户属于“会员”客户组,则购物车将关联“会员”销售渠道。否则,购物车将关联默认渠道。

import { CartService, EventBusService, SalesChannel, SalesChannelService } from "@medusajs/medusa"

type InjectedDependencies = {
  eventBusService: EventBusService
  cartService: CartService
  salesChannelService: SalesChannelService
}

class MemberDiscountSubscriber {
  cartService: CartService
  salesChannelService: SalesChannelService

  constructor (container: InjectedDependencies) {
    this.cartService = container.cartService
    this.salesChannelService = container.salesChannelService

    container.eventBusService.subscribe('cart.created', this.handleCreate)
    container.eventBusService.subscribe('cart.customer_updated', this.handleCreate)
  }

  handleCreate = async (data) => {
    const cartId = typeof data === 'string' ? data : data.id

    //retrieve default sales channel
    const defaultChannel = await this.salesChannelService.retrieveByName('Default Sales Channel') as SalesChannel

    //retrieve sales channel
    const membersChannel = await this.salesChannelService.retrieveByName('Members') as SalesChannel

    if (!membersChannel) {
      //sales channel does not exist
      return
    }

    //retrieve cart
    const cart = await this.cartService.retrieve(cartId, {
      relations: ['customer', 'customer.groups']
    })

    const isMember = cart.customer?.groups.some((group) => group.name === 'Members')

    await this.cartService.update(cartId, {
      sales_channel_id: isMember ? membersChannel.id : defaultChannel.id
    })
  }
}

export default MemberDiscountSubscriber
Enter fullscreen mode Exit fullscreen mode

特色五:生日特惠

图片描述

耐克提供的另一项会员福利是生日优惠。如果会员在生日前注册,即可在生日当天享受折扣。耐克会通过电子邮件向会员发送折扣详情。

在 Medusa 中,可以通过结合客户组和计划任务这两个功能来实现这一点。客户组的使用方法已在前面的章节中解释过。

计划任务

Medusa 允许开发者使用定时任务功能,安排任务在特定时间运行。例如,可以设置一个定时任务,使其每天午夜运行。该任务会检查哪些客户的生日是今天。对于这些客户,系统会发送一封包含优惠详情的电子邮件。

您可以利用此metadata字段存储自定义字段,例如birthday……。您需要在客户注册时保存此字段,或者允许客户在其个人资料中设置生日。

const checkBirthdaysJob = async (container, options) => {
  const jobSchedulerService = container.resolve("jobSchedulerService");
  jobSchedulerService.create("check-birthdays", {}, "0 0 * * *", async () => {
    //job to execute
    const customerService = container.resolve("customerService");
    const customers = await this.customerService.list({
      metadata: {
        birthday: Date.now().toString()
      }
    })

        customers.forEach((customer) => {
            //create discount/gift card
            //and send email
        })
  })
}

export default checkBirthdaysJob;
Enter fullscreen mode Exit fullscreen mode

这项优惠可以通过折扣或定制礼品卡两种方式实现。第一种方式是生成一个带有随机代码的折扣码并发送给客户。第二种方式是生成一张带有金额的定制礼品卡,并将礼品卡代码发送给客户。

要向客户发送电子邮件,您需要集成第三方插件,例如SendGrid

与美杜莎一起做更多事

本文探讨的这些功能旨在为用户提供更佳的用户体验。这正是耐克等大品牌脱颖而出并保持客户忠诚度的关键所在。

尽管耐克从零开始开发了自己的无头电商平台,但使用像 Medusa 这样的平台可以提供类似的功能、可扩展性和可伸缩性。

请查看文档以了解有关 Medusa 的更多详细信息以及如何开始使用。

如果您对 Medusa 有任何疑问或问题,请随时通过Discord联系 Medusa 团队 

文章来源:https://dev.to/medusajs/how-i-built-nikes-ecommerce-features-with-medusa-131