[{"data":1,"prerenderedAt":432},["ShallowReactive",2],{"h3418323173":3,"h4144652250":272,"h2142442277":424},{"id":4,"title":5,"body":6,"description":28,"extension":263,"meta":264,"navigation":267,"path":268,"seo":269,"stem":270,"__hash__":271},"docs/en/tips/2026/04/16/bookmark-function-implementation.md","How to build a bookmark feature to revisit messages from LINE Official Accounts",{"type":7,"value":8,"toc":239},"minimark",[9],[10,11,12,20,25,29,32,37,40,56,59,63,66,78,81,84,105,109,112,115,126,129,142,154,157,160,167,170,178,191,194,197,200,203,217,220,224,227,230,233],"Tips",{},[13,14,17],"h1",{"id":15,"class":16},"","!mb-4",[18,19],"page-title",{},[21,22],"display-date",{"date":23,"class":24},"2026/04/16","!mb-20",[26,27,28],"p",{},"When sending messages via LINE Official Accounts, there are use cases where users want to revisit the information later.",[26,30,31],{},"In this article, we’ll introduce key points for implementing a bookmark feature using the LINE Platform, which allows users to save broadcast content and web pages.",[33,34,36],"h2",{"id":35},"purpose","Purpose",[26,38,39],{},"By introducing a bookmark feature, you can expect the following benefits:",[41,42,43,47,50,53],"ul",{},[44,45,46],"li",{},"Users can save information individually based on their needs",[44,48,49],{},"Easier access to information, improving the user experience",[44,51,52],{},"Visibility into the content users are interested in",[44,54,55],{},"Data available for personalized messaging",[26,57,58],{},"The goal of a bookmark feature is not just to send information, but to create a state where it continues to be used afterward.",[33,60,62],{"id":61},"implementation-flow","Implementation flow",[26,64,65],{},"There are several ways to implement this feature, but a simple approach would look like this:",[67,68,69,72,75],"ol",{},[44,70,71],{},"Add a bookmark button to messages and send a webhook event when it is tapped",[44,73,74],{},"Retrieve the user ID and content information from the webhook event and store them in a database",[44,76,77],{},"Provide an entry point (such as a rich menu) for users to access their bookmark list",[26,79,80],{},"What you’re doing is simple: just store a relationship between the user ID and the content.",[26,82,83],{},"For this reason, this article does not go into detailed implementation, but instead focuses on key points:",[41,85,86,93,99],{},[44,87,88],{},[89,90,92],"a",{"href":91},"#unique-id-design","Design content to be uniquely identifiable",[44,94,95],{},[89,96,98],{"href":97},"#not-just-save-and-finish","Make it easy to revisit later",[44,100,101],{},[89,102,104],{"href":103},"#design-for-extensibility","Design for extensibility",[106,107,92],"h3",{"id":108},"unique-id-design",[26,110,111],{},"To associate a user ID with content, you need a way to uniquely identify each item.",[26,113,114],{},"For example:",[41,116,117,120,123],{},[44,118,119],{},"Issue an identifier for each message",[44,121,122],{},"Manage content using a combination of category + identifier",[44,124,125],{},"(If the content is a web page) Use the URL directly",[26,127,128],{},"Which approach you choose depends on your operation, but it’s recommended to decide based on how easy it will be to manage later.",[26,130,131,132,136,137,141],{},"For message-based content, including an identifier in the ",[133,134,135],"code",{},"data"," field of a ",[89,138,140],{"href":139},"/reference/messaging-api/#postback-action","postback action"," simplifies processing when receiving webhook events.",[143,144,147],"admonition",{"title":145,"type":146},"We recommend setting displayText for postback actions","tip",[26,148,149,150,153],{},"By setting the ",[133,151,152],{},"displayText"," property of a postback action, you can display a message in the chat when the action is executed. This makes it easier for users to recognize that the action has been performed.",[106,155,98],{"id":156},"not-just-save-and-finish",[26,158,159],{},"Next, let’s look at the “revisiting later” aspect.",[26,161,162,163,166],{},"In a bookmark feature, accessibility is key—users should be able to easily revisit saved information.",[164,165],"br",{},"\nThat means considering where users can access it and how quickly they can view the list.",[26,168,169],{},"Even small improvements can significantly enhance the user experience, such as:",[41,171,172,175],{},[44,173,174],{},"Enabling one-tap access from a rich menu",[44,176,177],{},"Displaying the list in an easy-to-read format (e.g., Flex Messages or a web page)",[26,179,180,181,185,186,190],{},"If you display the bookmark list on a web page, you will need to retrieve the user ID.\nYou can use ",[89,182,184],{"href":183},"/services/liff/","LIFF"," or ",[89,187,189],{"href":188},"/services/line-login/","LINE Login"," for this purpose.",[26,192,193],{},"By using LIFF or LINE Login, you can seamlessly link LINE users with their actions on the web.",[106,195,104],{"id":196},"design-for-extensibility",[26,198,199],{},"Since this mechanism is simple, it is relatively easy to extend later.",[26,201,202],{},"Although not covered in detail in this article, you may find a need for features such as:",[41,204,205,208,211,214],{},[44,206,207],{},"Deleting bookmarks",[44,209,210],{},"Favorite/like functionality",[44,212,213],{},"Leveraging data for recommendations",[44,215,216],{},"Reminders for bookmarked content expiration",[26,218,219],{},"Depending on the scale of your service, it’s worth considering these extensions as well.",[33,221,223],{"id":222},"summary","Summary",[26,225,226],{},"The bookmark feature is simple to implement but highly practical.",[26,228,229],{},"It transforms messages from “fleeting information” into “accumulated assets,” contributing to a better user experience.",[26,231,232],{},"Start with a simple setup and consider how you can incorporate it into your service.",[234,235],"tags",{"tags":236,"lang":237,"section":238},"messaging-api","en","tips",{"title":15,"searchDepth":240,"depth":240,"links":241},4,[242,246,260],{"id":243,"depth":244,"text":245},"purpose-purpose",2,"Purpose {#purpose}",{"id":247,"depth":244,"text":248,"children":249},"implementation-flow-implementation-flow","Implementation flow {#implementation-flow}",[250,254,257],{"id":251,"depth":252,"text":253},"design-content-to-be-uniquely-identifiable-unique-id-design",3,"Design content to be uniquely identifiable {#unique-id-design}",{"id":255,"depth":252,"text":256},"make-it-easy-to-revisit-later-not-just-save-and-finish","Make it easy to revisit later {#not-just-save-and-finish}",{"id":258,"depth":252,"text":259},"design-for-extensibility-design-for-extensibility","Design for extensibility {#design-for-extensibility}",{"id":261,"depth":244,"text":262},"summary-summary","Summary {#summary}","md",{"date":265,"tags":236,"locale":237,"sidebar":266},"2026-04-16 00:00 UTC",false,true,"/en/tips/2026/04/16/bookmark-function-implementation",{"title":5,"description":28},"en/tips/2026/04/16/bookmark-function-implementation","gSZglgp2XglaiFa-TZ8ts1ot_K7uPUwt7o5fvBc8vaE",{"id":4,"title":5,"body":273,"description":28,"extension":263,"meta":422,"navigation":267,"path":268,"seo":423,"stem":270,"__hash__":271},{"type":7,"value":274,"toc":413},[275],[10,276,277,281,283,285,287,289,291,301,303,305,307,315,317,319,333,335,337,339,347,349,355,361,363,365,369,371,377,383,385,387,389,391,401,403,405,407,409,411],{},[13,278,279],{"id":15,"class":16},[18,280],{},[21,282],{"date":23,"class":24},[26,284,28],{},[26,286,31],{},[33,288,36],{"id":35},[26,290,39],{},[41,292,293,295,297,299],{},[44,294,46],{},[44,296,49],{},[44,298,52],{},[44,300,55],{},[26,302,58],{},[33,304,62],{"id":61},[26,306,65],{},[67,308,309,311,313],{},[44,310,71],{},[44,312,74],{},[44,314,77],{},[26,316,80],{},[26,318,83],{},[41,320,321,325,329],{},[44,322,323],{},[89,324,92],{"href":91},[44,326,327],{},[89,328,98],{"href":97},[44,330,331],{},[89,332,104],{"href":103},[106,334,92],{"id":108},[26,336,111],{},[26,338,114],{},[41,340,341,343,345],{},[44,342,119],{},[44,344,122],{},[44,346,125],{},[26,348,128],{},[26,350,131,351,136,353,141],{},[133,352,135],{},[89,354,140],{"href":139},[143,356,357],{"title":145,"type":146},[26,358,149,359,153],{},[133,360,152],{},[106,362,98],{"id":156},[26,364,159],{},[26,366,162,367,166],{},[164,368],{},[26,370,169],{},[41,372,373,375],{},[44,374,174],{},[44,376,177],{},[26,378,180,379,185,381,190],{},[89,380,184],{"href":183},[89,382,189],{"href":188},[26,384,193],{},[106,386,104],{"id":196},[26,388,199],{},[26,390,202],{},[41,392,393,395,397,399],{},[44,394,207],{},[44,396,210],{},[44,398,213],{},[44,400,216],{},[26,402,219],{},[33,404,223],{"id":222},[26,406,226],{},[26,408,229],{},[26,410,232],{},[234,412],{"tags":236,"lang":237,"section":238},{"title":15,"searchDepth":240,"depth":240,"links":414},[415,416,421],{"id":243,"depth":244,"text":245},{"id":247,"depth":244,"text":248,"children":417},[418,419,420],{"id":251,"depth":252,"text":253},{"id":255,"depth":252,"text":256},{"id":258,"depth":252,"text":259},{"id":261,"depth":244,"text":262},{"date":265,"tags":236,"locale":237,"sidebar":266},{"title":5,"description":28},[425,426,431],{"id":35,"depth":244,"text":36},{"id":61,"depth":244,"text":62,"children":427},[428,429,430],{"id":108,"depth":252,"text":92},{"id":156,"depth":252,"text":98},{"id":196,"depth":252,"text":104},{"id":222,"depth":244,"text":223},1777255484970]