我如何利用 Medusa 构建 Nike 的电子商务功能
美杜莎
耐克是全球 最大的运动鞋供应商和制造商 。耐克成功的部分原因在于其电商网站。 2022年,其电商净销售额超过120亿美元, 约占耐克 2022年全球直接面向消费者收入(187.3亿美元) 的65% 。
耐克的电商网站功能丰富,旨在鼓励顾客购买商品。这表明耐克非常了解顾客的需求,以及如何将首次访客转化为忠实顾客。
耐克很早就意识到,他们需要实施 全渠道体验 ,才能为客户提供最佳用户体验。这促使他们利用 微服务和云技术 构建了自己的无头电商平台。
本文将介绍如何使用 Medusa 实现 Nike 为客户提供的 5 项核心功能。这 5 项功能分别是:
电子礼品卡
会员免运费
搜索建议和自动补全
会员专享产品
生日优惠
美杜莎是什么?
使用开源电商平台,您可以获得与耐克等定制平台类似的诸多优势。Medusa 专 为希望使用 Node.js 构建可组合电商平台,从而打造个性化电商体验的开发者而设计。
Medusa 的架构使企业和开发者能够构建独特且符合品牌调性的体验。全渠道支持、可扩展性和可定制性等特性是 Medusa 的核心。
Medusa 还提供与自动化 RMA 流程、销售渠道、产品和订单管理等相关的先进电子商务功能。
Medusa 的集成系统为企业提供了更大的灵活性。您可以将任何第三方服务集成到 Medusa 中,从而获得丰富的 CMS 功能、支付网关、客户支持等。您还可以创建专属于您品牌的自定义集成。
功能一:电子礼品卡
耐克允许顾客定制和购买礼品卡。礼品卡可以通过电子邮件发送,也可以以实体卡片的形式邮寄到指定的收货地址。
Medusa 允许创建带有自定义图片、无限金额、描述、标签等的礼品卡。
商家还可以指定特定面额或金额的不同货币价格。
购买此礼品卡的顾客将收到发送到其邮箱的礼品卡,并可在结账时使用。
您还可以允许客户将礼品卡发送到其他人的邮箱,从而定制用户体验。Medusa(以及所有实体)中的礼品卡都有一个 metadata属性。此属性可用于存储自定义数据。
您可以利用它存储自定义收件人电子邮件或收货地址,这样客户就可以将礼品卡发送给他们的家人或朋友。
metadata : {
recipient_email : ' example@gmail.com '
}
Enter fullscreen mode
Exit fullscreen mode
特色二:会员免运费
仔细查看耐克提供的功能,你会发现他们的主要目标是将访客和一次性顾客转化为注册顾客。这有助于建立顾客忠诚度,并提高顾客未来再次购买的可能性。
耐克鼓励访客注册成为会员的一种方式是,会员下单即可享受免运费。这使得注册成为会员虽然需要额外步骤,但却非常值得,因为他们可以为当前和未来的订单节省费用。
在 Medusa 中,此功能可以通过结合以下可用功能来实现: 客户组 、 折扣 和 订阅者 。
客户群体
客户群组可用于将具有相似属性的客户分组。然后,您可以为属于该群组的客户应用不同的价格、折扣和规则。
在这个用例中,您可以使用客户组来创建“会员”客户组。稍后您将看到如何在注册时自动将客户添加到该组。
折扣
折扣可用于创建折扣码,客户可以使用折扣码来节省订单费用。折扣形式可以是固定金额折扣、百分比折扣或免运费。
折扣也可以附带条件。例如,您可以指定哪些产品可以使用此折扣,或者哪些客户群体可以使用此折扣。
要实现会员免运费功能,您可以创建一个折扣,让属于“会员”客户组的客户享受订单免运费。
订阅者
最后一步需要自动执行以下操作:
注册时将客户添加到会员客户组。
为会员客户群的顾客增加免运费优惠。
在 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 中,可以通过将服务器与Algolia 或 MeiliSearch 等第三方服务集成来实现高级搜索功能 。这省去了从头开始实现这些功能的麻烦,并允许您在商店中使用一流的品牌服务。
Algolia 和 MeiliSearch 都提供高级功能,例如即时搜索结果、拼写错误容错、搜索建议、自动补全等等。您可以通过在 Medusa 服务器上安装相应的插件来集成其中一项服务。之后,您可以根据客户的需求自定义店铺的用户界面。
功能四:会员专享产品
与免运费功能类似,耐克还提供仅限会员或注册用户购买的产品。这进一步鼓励访客注册并浏览专属产品。
在 Medusa 中,这可以通过以下功能的组合来实现:客户群、销售渠道和订阅者。
客户群体
如前所述,成员可以用名为“成员”的客户组来表示。接下来,您需要实现将“成员”客户组自动分配给已注册客户的功能,如前所述。
销售渠道
销售渠道允许您针对商店中的不同渠道定制销售方式和产品种类。渠道可以是不同的平台,例如网站或移动端。渠道也可以是不同的客户类型,例如 B2B 客户或会员。
要实现会员专属商品功能,您需要创建一个会员专属销售渠道。然后,您可以设置仅在该销售渠道中提供特定商品,而不在默认渠道中提供这些商品。
订阅者
最后一步是创建两个订阅者,分别处理以下任务:
注册时将客户添加到会员客户组。
将会员销售渠道分配给会员购物车。
第一个实现方式已在前面解释过,您可以在前面的章节中找到代码块。
至于第二个问题,您需要创建一个订阅者,该订阅者会订阅 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