[{"data":1,"prerenderedAt":764},["ShallowReactive",2],{"header:help":3,"footer:default":67,"story:navigation\u002Fsearch:help":250,"story:help\u002Fcategories":288,"story:help\u002Farticles\u002Fset-up-advanced-inventory-tracking-with-inventory-locks":314,"no-guide:set-up-advanced-inventory-tracking-with-inventory-locks":59,"article:\u002Fhelp\u002Farticles\u002Fset-up-advanced-inventory-tracking-with-inventory-locks":508,"story:contact":520,"help:tree:b0dec270-545e-4abf-81ed-eb51a9c8a221:587f2817-47a8-47ff-8f12-8fc3b4f3ec4d":709,"_apollo:default":763},{"name":4,"created_at":5,"published_at":6,"updated_at":7,"id":8,"uuid":9,"content":10,"slug":57,"full_slug":58,"sort_by_date":59,"position":60,"tag_list":61,"is_startpage":24,"parent_id":62,"meta_data":59,"group_id":63,"first_published_at":64,"release_id":59,"lang":65,"path":59,"alternates":66,"default_full_slug":59,"translated_slugs":59},"Help Center Header","2024-08-09T18:06:34.939Z","2024-10-21T21:58:39.217Z","2024-10-21T21:58:39.232Z",10082752,"3e9b88f7-c163-4657-a2f2-62532d600fad",{"_uid":11,"link":12,"badge":16,"items":17,"title":13,"buttons":50,"new_tab":24,"submenu":51,"alignment":13,"component":52,"badge_link":53,"top_menu_items":56},"e5645a1a-f991-40e8-8d67-e40ebc082b5a",{"id":13,"url":13,"linktype":14,"fieldtype":15,"cached_url":13},"","story","multilink","Help Center",[18,27,34,39,44],{"_uid":19,"link":20,"title":23,"new_tab":24,"submenu":25,"component":26},"5cbe2861-1f49-4166-97da-a4dddd8105e3",{"id":21,"url":13,"linktype":14,"fieldtype":15,"cached_url":22},"4c0a2d99-ec30-4579-8ef1-6bf5564d4839","help\u002Fcategories\u002F","Articles",false,[],"header___item",{"_uid":28,"link":29,"title":32,"new_tab":33,"component":26},"1c8edeb5-b9e9-4cb8-b1c6-c1f292f7d7cd",{"id":13,"url":30,"linktype":31,"fieldtype":15,"cached_url":30},"https:\u002F\u002Fwiki.foxycart.com\u002F","url","Documentation",true,{"_uid":35,"link":36,"title":38,"new_tab":33,"component":26},"8d7df70e-f087-4da0-b616-6f0e9a5af35c",{"id":13,"url":37,"linktype":31,"fieldtype":15,"cached_url":37},"https:\u002F\u002Fapi.foxycart.com\u002F","API Documentation",{"_uid":40,"link":41,"title":43,"new_tab":33,"component":26},"f76e7944-23d5-4652-87e4-cdae79272762",{"id":13,"url":42,"linktype":31,"fieldtype":15,"cached_url":42},"https:\u002F\u002Fstatus.foxy.io\u002F","System Status",{"_uid":45,"link":46,"title":49,"new_tab":24,"component":26},"0de16771-4c84-466c-a1da-d8568113c71f",{"id":47,"url":13,"linktype":14,"fieldtype":15,"cached_url":48},"01e4e370-f9b9-45af-8fa9-f15540699b0d","contact","Contact Us",[],[],"header",{"id":54,"url":13,"linktype":14,"fieldtype":15,"cached_url":55},"4a679eb7-662d-4ea4-a976-5a2acbf0b663","help\u002F",[],"help-header","navigation\u002Fhelp-header",null,20,[],10082747,"71b81c2e-5e09-48a1-a397-a3c72fcd344a","2022-09-21T14:50:25.655Z","default",[],{"name":68,"created_at":69,"published_at":70,"updated_at":71,"id":72,"uuid":73,"content":74,"slug":243,"full_slug":244,"sort_by_date":59,"position":245,"tag_list":246,"is_startpage":24,"parent_id":62,"meta_data":59,"group_id":247,"first_published_at":248,"release_id":59,"lang":65,"path":59,"alternates":249,"default_full_slug":59,"translated_slugs":59},"Default Footer","2024-08-09T18:06:59.024Z","2025-09-04T06:24:46.223Z","2025-09-04T06:24:46.241Z",10082753,"e59e67ac-248a-482f-84a1-53d4f318186a",{"_uid":75,"about":76,"logos":77,"socials":82,"sections":108,"component":225,"cta_title":226,"bottom_links":227,"cta_subtitle":241,"cta_button_link":242,"cta_button_text":183},"830983f5-c4c4-43c8-b150-86a5e3fa6dc8","Foxy’s hosted cart & payment page allow you to sell anything, using your existing website or platform.",[78],{"id":79,"alt":13,"name":13,"focus":13,"title":13,"filename":80,"copyright":13,"fieldtype":81},14760,"https:\u002F\u002Fa-us.storyblok.com\u002Ff\u002F1001040\u002Fx\u002F3b030847ec\u002Fb-corp.svg","asset",[83,90,96,102],{"_uid":84,"icon":85,"link":86,"name":88,"component":89},"faf0a618-ea94-42ea-9182-03be18c43216","fa-facebook",{"id":13,"url":87,"linktype":31,"fieldtype":15,"cached_url":87},"https:\u002F\u002Fwww.facebook.com\u002Ffoxycart","Facebook","footer___social",{"_uid":91,"icon":92,"link":93,"name":95,"component":89},"14309c18-7e79-423e-b375-34555bac0811","fa-instagram",{"id":13,"url":94,"linktype":31,"fieldtype":15,"cached_url":94},"https:\u002F\u002Fwww.instagram.com\u002Ffoxy_io","Instagram",{"_uid":97,"icon":98,"link":99,"name":101,"component":89},"8f7fe7cf-0dd3-4596-8334-226ea466716a","fa-linkedin",{"id":13,"url":100,"linktype":31,"fieldtype":15,"cached_url":100},"https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Ffoxycart.com","LinkedIn",{"_uid":103,"icon":104,"link":105,"name":107,"component":89},"90a675b4-dd97-40b5-be09-00a87223d4c5","fa-youtube",{"id":13,"url":106,"linktype":31,"fieldtype":15,"cached_url":106},"https:\u002F\u002Fwww.youtube.com\u002Fuser\u002Ffoxycart","Youtube",[109,139,184,206],{"_uid":110,"name":111,"items":112,"component":138},"82849945-282f-488c-b18d-a8d2252f514a","Company",[113,120,126,132],{"_uid":114,"link":115,"title":118,"new_tab":24,"component":119},"1f699ab1-938b-4d9d-9825-aabcbe6f57fe",{"id":116,"url":13,"linktype":14,"fieldtype":15,"cached_url":117},"63634293-a749-4226-9439-9f38ee6dcda0","about-us","About Us","footer___menu_items",{"_uid":121,"link":122,"title":125,"new_tab":24,"component":119},"b26b00f1-a0e7-4be2-8ab3-428b8cc841f8",{"id":123,"url":13,"linktype":14,"fieldtype":15,"cached_url":124},"26cb7c55-faed-4a77-a291-1552d4111b3e","how-foxy-works","How Foxy Works",{"_uid":127,"link":128,"title":131,"new_tab":24,"component":119},"b40c68a0-1ceb-4226-9515-6176534f61fe",{"id":129,"url":13,"linktype":14,"fieldtype":15,"cached_url":130},"dc6657d7-7f4f-4c0d-b781-e971b038ee26","for-good","Foxy For Good",{"_uid":133,"link":134,"title":137,"new_tab":24,"component":119},"3ad0c134-bef9-4fff-b891-e09f16109036",{"id":135,"url":13,"linktype":14,"fieldtype":15,"cached_url":136},"23cae210-baf4-4588-9862-d09f4f52ccd2","brand-assets","Brand Assets","footer___section",{"_uid":140,"name":141,"items":142,"component":138},"a6805fa8-ac60-47f1-b8f0-f27aded0afbe","Product",[143,149,155,161,167,173,179],{"_uid":144,"link":145,"title":148,"new_tab":24,"component":119},"b39c8a4e-2383-486f-b76a-11fbb15d8134",{"id":146,"url":13,"linktype":14,"fieldtype":15,"cached_url":147},"bb04690f-fe98-4ce6-80be-05b950f2364f","features\u002F","Features",{"_uid":150,"link":151,"title":154,"new_tab":24,"component":119},"64f8a41f-c181-433d-bc0a-fc94e71ecbf6",{"id":152,"url":13,"linktype":14,"fieldtype":15,"cached_url":153},"c450c58d-761d-48c0-a9af-0b064611689b","pricing","Pricing",{"_uid":156,"link":157,"title":160,"new_tab":24,"component":119},"6e0b287f-fd8c-4146-9e0e-0ab0b5c9ce3c",{"id":158,"url":13,"linktype":14,"fieldtype":15,"cached_url":159},"fab20ad9-e76a-4947-b709-3a6fdfa88028","blog\u002Fcategories\u002Fproduct-updates","Product Updates",{"_uid":162,"link":163,"title":166,"new_tab":24,"component":119},"47e5a074-a6b5-4f1c-8c2f-89a2ae9f83eb",{"id":164,"url":13,"linktype":14,"fieldtype":15,"cached_url":165},"d2c83612-d611-47f3-a3b4-ca7fe08540b8","changelogs\u002F","Changelogs",{"_uid":168,"link":169,"title":172,"new_tab":24,"component":119},"b5c08774-542f-4ffd-b357-c94d674488b9",{"id":170,"url":13,"linktype":14,"fieldtype":15,"cached_url":171},"08876121-0df3-4ed9-aa11-902b3e41cd02","whats-next","What's Next",{"_uid":174,"link":175,"title":178,"new_tab":24,"component":119},"9c2704ed-6d9f-43e1-9e67-c8d91c083288",{"id":176,"url":13,"linktype":14,"fieldtype":15,"cached_url":177},"056a7857-b18f-4025-8f97-91a38fc19bc8","compare\u002F","Compare",{"_uid":180,"link":181,"title":183,"new_tab":24,"component":119},"5f2db35b-674b-406a-8fa7-d246633af9fe",{"id":13,"url":182,"linktype":31,"fieldtype":15,"cached_url":182},"https:\u002F\u002Fadmin.foxy.io\u002Fsign-up","Try Foxy Free",{"_uid":185,"name":186,"items":187,"component":138},"63fa1f29-4252-4640-9922-fe310e69e54a","Security",[188,194,200],{"_uid":189,"link":190,"title":193,"new_tab":24,"component":119},"1158ddb6-9eb0-466f-8eb6-7ca2ae66c8b8",{"id":191,"url":13,"linktype":14,"fieldtype":15,"cached_url":192},"1f58fb2c-8681-4742-b6e8-09999beae9f6","security-contact","Security Contact",{"_uid":195,"link":196,"title":199,"new_tab":24,"component":119},"9a79c54a-6022-4dfd-854b-766f5e4703ba",{"id":197,"url":13,"linktype":14,"fieldtype":15,"cached_url":198},"55cbfcc3-425a-4261-8037-54e919851d2d","pci","PCI Compliance",{"_uid":201,"link":202,"title":205,"new_tab":24,"component":119},"0b85f5b6-9534-4071-b323-b39d053dd4d7",{"id":203,"url":13,"linktype":14,"fieldtype":15,"cached_url":204},"c3ac0fe3-83e2-4879-afbd-d4c83e1590df","help\u002Farticles\u002Four-official-domains-public-code","Domains & Codebases",{"_uid":207,"name":208,"items":209,"component":138},"998ded67-d107-49f4-8154-ca6be51671ec","Support",[210,213,216,219,222],{"_uid":211,"link":212,"title":16,"new_tab":24,"component":119},"594ffd35-3049-4004-bb08-0db568ebd819",{"id":54,"url":13,"linktype":14,"fieldtype":15,"cached_url":55},{"_uid":214,"link":215,"title":32,"new_tab":33,"component":119},"0a1a55ab-a985-4f9d-8b42-26da714d0c1c",{"id":13,"url":30,"linktype":31,"fieldtype":15,"cached_url":30},{"_uid":217,"link":218,"title":38,"new_tab":33,"component":119},"61e0b7c8-aadf-419b-a339-b3ccabc65bf4",{"id":13,"url":37,"linktype":31,"fieldtype":15,"cached_url":37},{"_uid":220,"link":221,"title":43,"new_tab":33,"component":119},"fd67a89e-1c54-4d31-94b5-64be999062d6",{"id":13,"url":42,"linktype":31,"fieldtype":15,"cached_url":42},{"_uid":223,"link":224,"title":49,"new_tab":24,"component":119},"231a6f71-e996-4ad4-b033-d4d5542f34f0",{"id":47,"url":13,"linktype":14,"fieldtype":15,"cached_url":48},"footer","Get started with our *unlimited free trial*.",[228,235],{"_uid":229,"link":230,"text":233,"component":234},"f0b77210-2632-45a2-8436-e57cad84d01a",{"id":231,"url":13,"linktype":14,"fieldtype":15,"cached_url":232},"60ba16a2-c1f4-485f-b978-8d2eeeafbf5a","terms-of-service","Terms of Service","footer___bottom_links",{"_uid":236,"link":237,"text":240,"component":234},"4bd497b0-993f-4b4d-a5b7-8a49c7c8fec9",{"id":238,"url":13,"linktype":14,"fieldtype":15,"cached_url":239},"332302b9-1d18-4016-b9c8-9b33c72d782b","privacy-policy","Privacy Policy","No credit card required.",{"id":13,"url":182,"linktype":31,"fieldtype":15,"cached_url":182},"default-footer","navigation\u002Fdefault-footer",50,[],"11006268-07f9-41e9-96f3-c51fb723399d","2022-09-21T20:39:02.357Z",[],{"name":251,"created_at":252,"published_at":253,"updated_at":254,"id":255,"uuid":256,"content":257,"slug":279,"full_slug":282,"sort_by_date":59,"position":283,"tag_list":284,"is_startpage":24,"parent_id":62,"meta_data":59,"group_id":285,"first_published_at":286,"release_id":59,"lang":65,"path":59,"alternates":287,"default_full_slug":59,"translated_slugs":59},"Search","2024-10-21T22:08:54.973Z","2025-05-26T09:17:25.790Z","2025-05-26T09:17:25.804Z",13592003,"14cbc359-9ac1-4a7a-a8de-ad4ac8ef26d4",{"_uid":258,"name":251,"indices":259,"summary":13,"component":279,"primary_image":280},"5e4a56e8-76f1-4790-b3a7-70f1be97d042",[260,265,269,274],{"key":261,"_uid":262,"icon":13,"name":263,"component":264},"all","c12a3210-7323-4273-8217-5215e52efe84","All","index",{"key":266,"_uid":267,"icon":268,"name":23,"component":264},"help_center_article","5acff080-95e4-44d3-8dcf-1b19720af382","fa-file-alt",{"key":270,"_uid":271,"icon":272,"name":273,"component":264},"help_center_guide","b8fbc206-c083-471e-a1f0-0ebeb90a669d","fa-book","Guides",{"key":275,"_uid":276,"icon":277,"name":278,"component":264},"blog_post","23419e83-2e56-4c4c-8a05-9fd1b3c9a9bd","fa-file-image","Blog Posts","search",{"id":59,"alt":59,"name":13,"focus":59,"title":59,"source":59,"filename":13,"copyright":59,"fieldtype":81,"meta_data":281},{},"navigation\u002Fsearch",60,[],"11e1fd31-95cd-4fc9-b736-8b8910663e6c","2024-10-21T23:17:05.904Z",[],{"name":23,"created_at":289,"published_at":290,"updated_at":291,"id":292,"uuid":21,"content":293,"slug":307,"full_slug":22,"sort_by_date":59,"position":308,"tag_list":309,"is_startpage":33,"parent_id":310,"meta_data":59,"group_id":311,"first_published_at":312,"release_id":59,"lang":65,"path":59,"alternates":313,"default_full_slug":59,"translated_slugs":59},"2022-09-19T14:42:29.685Z","2024-07-30T18:17:22.506Z","2024-07-30T18:17:22.525Z",2660,{"_uid":294,"icon":13,"name":23,"guides":295,"pinned":24,"summary":296,"category":13,"component":297,"blog_posts":298,"content_hub":24,"icon_custom":299,"case_studies":300,"faq_sections":301,"help_articles":302,"featured_guides":303,"mailbox_category":13,"featured_articles":304,"featured_blog_posts":305,"featured_case_studies":306},"d6dae89a-907a-4bf7-82de-fe2ba875ee6e",[],"Get your questions answered with our browsable knowledge base.","help_center_category",[],{"id":59,"alt":59,"name":13,"focus":59,"title":59,"filename":13,"copyright":59,"fieldtype":81},[],[],[],[],[],[],[],"categories",530,[],2658,"19ebcdd2-027f-47f5-9a5b-a8992c959578","2022-09-19T16:24:39.219Z",[],{"name":315,"created_at":316,"published_at":317,"updated_at":318,"id":319,"uuid":320,"content":321,"slug":501,"full_slug":502,"sort_by_date":59,"position":503,"tag_list":504,"is_startpage":24,"parent_id":505,"meta_data":59,"group_id":506,"first_published_at":317,"release_id":59,"lang":65,"path":59,"alternates":507,"default_full_slug":59,"translated_slugs":59},"Set up advanced inventory tracking with inventory locks","2026-07-24T21:21:30.242Z","2026-07-24T21:48:19.534Z","2026-07-24T21:48:19.553Z",201680856080550,"b0dec270-545e-4abf-81ed-eb51a9c8a221",{"_uid":322,"body":323,"name":315,"image":495,"pinned":24,"summary":497,"category":498,"component":266,"related_articles":500},"d8c74c13-4ae2-4a91-b3ff-5adeda6c09c7",{"type":324,"content":325},"doc",[326,333,340,473,478],{"type":327,"attrs":328,"content":329},"paragraph",{"textAlign":59},[330],{"text":331,"type":332},"For stores that can’t afford to oversell — one-off items or products with strict limits like event tickets — combine inventory locks with Foxy’s cart JavaScript events and webhooks to reserve stock the moment a customer adds a product to their cart.","text",{"type":334,"attrs":335,"content":337},"heading",{"level":336,"textAlign":59},2,[338],{"text":339,"type":332},"How to set it up",{"type":341,"attrs":342,"content":344},"ordered_list",{"order":343},1,[345,360,374,387,424,443,459],{"type":346,"content":347},"list_item",[348],{"type":327,"attrs":349,"content":350},{"textAlign":59},[351,353,358],{"text":352,"type":332},"Expand your own inventory system to track ",{"text":354,"type":332,"marks":355},"inventory locks",[356],{"type":357},"bold",{"text":359,"type":332}," — temporary holds on a specific quantity of a product tied to a customer’s cart. For example, if you’re tracking inventory in a database, add a table for locks with columns for the transaction ID, product ID or code, and how long the lock should last.",{"type":346,"content":361},[362],{"type":327,"attrs":363,"content":364},{"textAlign":59},[365,367,372],{"text":366,"type":332},"On your add-to-cart page, calculate a product’s available stock by taking its normal inventory level and subtracting any active locks for that product. Use this adjusted value to determine whether the product is out of stock, and to set its ",{"text":368,"type":332,"marks":369},"quantity_max",[370],{"type":371},"code",{"text":373,"type":332}," value.",{"type":346,"content":375},[376],{"type":327,"attrs":377,"content":378},{"textAlign":59},[379,381,385],{"text":380,"type":332},"Set the ",{"text":382,"type":332,"marks":383},"expires",[384],{"type":371},{"text":386,"type":332}," attribute on the product to a time slightly before the corresponding lock is set to expire in your database. This avoids a gap where stock could become available again before the lock has actually cleared for the customer currently holding it.",{"type":346,"content":388},[389],{"type":327,"attrs":390,"content":391},{"textAlign":59},[392,394,398,400,404,406,410,412,416,418,422],{"text":393,"type":332},"Use Foxy’s cart JavaScript events to create, update, and remove locks as customers interact with their cart. The relevant events are ",{"text":395,"type":332,"marks":396},"cart-submit.done",[397],{"type":371},{"text":399,"type":332},", ",{"text":401,"type":332,"marks":402},"cart-item-quantity-update.done",[403],{"type":371},{"text":405,"type":332},", and ",{"text":407,"type":332,"marks":408},"cart-item-remove.done",[409],{"type":371},{"text":411,"type":332},". Add your custom callback for these events through the ",{"text":413,"type":332,"marks":414},"Configuration",[415],{"type":357},{"text":417,"type":332}," page in your store’s Foxy admin, in the “footer” textarea under ",{"text":419,"type":332,"marks":420},"Add custom header and footer code to your templates",[421],{"type":357},{"text":423,"type":332},".",{"type":346,"content":425},[426],{"type":327,"attrs":427,"content":428},{"textAlign":59},[429,431,435,437,441],{"text":430,"type":332},"Within your callback, check the ",{"text":432,"type":332,"marks":433},"params",[434],{"type":371},{"text":436,"type":332}," parameter of the event to see what changed, and use the ",{"text":438,"type":332,"marks":439},"FC.json",[440],{"type":371},{"text":442,"type":332}," cart object to access other cart details you need.",{"type":346,"content":444},[445],{"type":327,"attrs":446,"content":447},{"textAlign":59},[448,450,457],{"text":449,"type":332},"In your ",{"text":451,"type":332,"marks":452},"pre-payment webhook",[453],{"type":454,"attrs":455},"link",{"href":456,"uuid":59,"anchor":59,"target":59,"linktype":31},"https:\u002F\u002Ffoxy.io\u002Fhelp\u002Farticles\u002Fconfirm-inventory-before-checkout-with-the-pre-payment-webhook",{"text":458,"type":332}," endpoint, confirm that existing inventory locks still match the current contents of the cart. If the cart requires more stock than is locked, confirm there’s enough available before letting the checkout proceed.",{"type":346,"content":460},[461],{"type":327,"attrs":462,"content":463},{"textAlign":59},[464,465,471],{"text":449,"type":332},{"text":466,"type":332,"marks":467},"transaction webhook",[468],{"type":454,"attrs":469},{"href":470,"uuid":59,"anchor":59,"target":59,"linktype":31},"https:\u002F\u002Ffoxy.io\u002Fhelp\u002Farticles\u002Ftrack-inventory-with-quantity-max-and-the-transaction-webhook",{"text":472,"type":332}," endpoint, clear out any inventory locks tied to that transaction once you’ve adjusted your actual inventory level.",{"type":334,"attrs":474,"content":475},{"level":336,"textAlign":59},[476],{"text":477,"type":332},"Notes",{"type":479,"content":480},"bullet_list",[481,488],{"type":346,"content":482},[483],{"type":327,"attrs":484,"content":485},{"textAlign":59},[486],{"text":487,"type":332},"This approach requires custom development on your end — Foxy provides the cart events and webhooks, but the lock tracking, matching, and clearing logic all live in your own system.",{"type":346,"content":489},[490],{"type":327,"attrs":491,"content":492},{"textAlign":59},[493],{"text":494,"type":332},"This is the most reliable way to prevent overselling, since stock is reserved as soon as a product is added to the cart rather than only checked at transaction time.",{"id":59,"alt":59,"name":13,"focus":59,"title":59,"source":59,"filename":13,"copyright":59,"fieldtype":81,"meta_data":496},{},"How to combine inventory locks with Foxy's cart JavaScript events and webhooks to reserve stock and prevent overselling on limited or one-off products.",[499],"587f2817-47a8-47ff-8f12-8fc3b4f3ec4d",[],"set-up-advanced-inventory-tracking-with-inventory-locks","help\u002Farticles\u002Fset-up-advanced-inventory-tracking-with-inventory-locks",-4690,[],2659,"4c778369-9892-48dc-9a43-fb151104cb5b",[],{"html":509,"sections":510,"segments":516},"\u003Cp>For stores that can’t afford to oversell — one-off items or products with strict limits like event tickets — combine inventory locks with Foxy’s cart JavaScript events and webhooks to reserve stock the moment a customer adds a product to their cart.\u003C\u002Fp>\u003Csection id=\"how-to-set-it-up\" data-title=\"How to set it up\" data-title-node=\"H2\">\u003Chr class=\"my-8\" style=\"margin-left: -48px; margin-right: -40vw\">\u003Ch2 data-anchor-id=\"how-to-set-it-up\">How to set it up\u003C\u002Fh2>\u003Col class=\"step step-icon-sm step-dashed step-border-last-0 mt-3\">\u003Cli class=\"step-item\">\u003Cdiv class=\"step-content-wrapper\">\u003Cspan class=\"step-icon step-icon-soft-primary\">1\u003C\u002Fspan>\u003Cdiv class=\"w-100 overflow-hidden\">\u003Cdiv class=\"step-content mt-2\">\u003Cp>Expand your own inventory system to track \u003Cstrong>inventory locks\u003C\u002Fstrong> — temporary holds on a specific quantity of a product tied to a customer’s cart. For example, if you’re tracking inventory in a database, add a table for locks with columns for the transaction ID, product ID or code, and how long the lock should last.\u003C\u002Fp>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003Cli class=\"step-item\">\u003Cdiv class=\"step-content-wrapper\">\u003Cspan class=\"step-icon step-icon-soft-primary\">2\u003C\u002Fspan>\u003Cdiv class=\"w-100 overflow-hidden\">\u003Cdiv class=\"step-content mt-2\">\u003Cp>On your add-to-cart page, calculate a product’s available stock by taking its normal inventory level and subtracting any active locks for that product. Use this adjusted value to determine whether the product is out of stock, and to set its \u003Ccode class=\"badge bg-soft-danger text-danger\">quantity_max\u003C\u002Fcode> value.\u003C\u002Fp>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003Cli class=\"step-item\">\u003Cdiv class=\"step-content-wrapper\">\u003Cspan class=\"step-icon step-icon-soft-primary\">3\u003C\u002Fspan>\u003Cdiv class=\"w-100 overflow-hidden\">\u003Cdiv class=\"step-content mt-2\">\u003Cp>Set the \u003Ccode class=\"badge bg-soft-danger text-danger\">expires\u003C\u002Fcode> attribute on the product to a time slightly before the corresponding lock is set to expire in your database. This avoids a gap where stock could become available again before the lock has actually cleared for the customer currently holding it.\u003C\u002Fp>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003Cli class=\"step-item\">\u003Cdiv class=\"step-content-wrapper\">\u003Cspan class=\"step-icon step-icon-soft-primary\">4\u003C\u002Fspan>\u003Cdiv class=\"w-100 overflow-hidden\">\u003Cdiv class=\"step-content mt-2\">\u003Cp>Use Foxy’s cart JavaScript events to create, update, and remove locks as customers interact with their cart. The relevant events are \u003Ccode class=\"badge bg-soft-danger text-danger\">cart-submit.done\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">cart-item-quantity-update.done\u003C\u002Fcode>, and \u003Ccode class=\"badge bg-soft-danger text-danger\">cart-item-remove.done\u003C\u002Fcode>. Add your custom callback for these events through the \u003Cstrong>Configuration\u003C\u002Fstrong> page in your store’s Foxy admin, in the “footer” textarea under \u003Cstrong>Add custom header and footer code to your templates\u003C\u002Fstrong>.\u003C\u002Fp>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003Cli class=\"step-item\">\u003Cdiv class=\"step-content-wrapper\">\u003Cspan class=\"step-icon step-icon-soft-primary\">5\u003C\u002Fspan>\u003Cdiv class=\"w-100 overflow-hidden\">\u003Cdiv class=\"step-content mt-2\">\u003Cp>Within your callback, check the \u003Ccode class=\"badge bg-soft-danger text-danger\">params\u003C\u002Fcode> parameter of the event to see what changed, and use the \u003Ccode class=\"badge bg-soft-danger text-danger\">FC.json\u003C\u002Fcode> cart object to access other cart details you need.\u003C\u002Fp>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003Cli class=\"step-item\">\u003Cdiv class=\"step-content-wrapper\">\u003Cspan class=\"step-icon step-icon-soft-primary\">6\u003C\u002Fspan>\u003Cdiv class=\"w-100 overflow-hidden\">\u003Cdiv class=\"step-content mt-2\">\u003Cp>In your \u003Ca href=\"https:\u002F\u002Ffoxy.io\u002Fhelp\u002Farticles\u002Fconfirm-inventory-before-checkout-with-the-pre-payment-webhook\" class=\"\">pre-payment webhook\u003C\u002Fa> endpoint, confirm that existing inventory locks still match the current contents of the cart. If the cart requires more stock than is locked, confirm there’s enough available before letting the checkout proceed.\u003C\u002Fp>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003Cli class=\"step-item\">\u003Cdiv class=\"step-content-wrapper\">\u003Cspan class=\"step-icon step-icon-soft-primary\">7\u003C\u002Fspan>\u003Cdiv class=\"w-100 overflow-hidden\">\u003Cdiv class=\"step-content mt-2\">\u003Cp>In your \u003Ca href=\"https:\u002F\u002Ffoxy.io\u002Fhelp\u002Farticles\u002Ftrack-inventory-with-quantity-max-and-the-transaction-webhook\" class=\"\">transaction webhook\u003C\u002Fa> endpoint, clear out any inventory locks tied to that transaction once you’ve adjusted your actual inventory level.\u003C\u002Fp>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003C\u002Fol>\u003C\u002Fsection>\u003Csection id=\"notes\" data-title=\"Notes\" data-title-node=\"H2\">\u003Chr class=\"my-8\" style=\"margin-left: -48px; margin-right: -40vw\">\u003Ch2 data-anchor-id=\"notes\">Notes\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Cp>This approach requires custom development on your end — Foxy provides the cart events and webhooks, but the lock tracking, matching, and clearing logic all live in your own system.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>This is the most reliable way to prevent overselling, since stock is reserved as soon as a product is added to the cart rather than only checked at transaction time.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fsection>",[511,514],{"id":512,"title":339,"level":513},"how-to-set-it-up","H2",{"id":515,"title":477,"level":513},"notes",[517],{"type":518,"content":519},"html","\u003Cp>For stores that can’t afford to oversell — one-off items or products with strict limits like event tickets — combine inventory locks with Foxy’s cart JavaScript events and webhooks to reserve stock the moment a customer adds a product to their cart.\u003C\u002Fp>\u003Ch2>How to set it up\u003C\u002Fh2>\u003Col order=\"1\">\u003Cli>\u003Cp>Expand your own inventory system to track \u003Cstrong>inventory locks\u003C\u002Fstrong> — temporary holds on a specific quantity of a product tied to a customer’s cart. For example, if you’re tracking inventory in a database, add a table for locks with columns for the transaction ID, product ID or code, and how long the lock should last.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>On your add-to-cart page, calculate a product’s available stock by taking its normal inventory level and subtracting any active locks for that product. Use this adjusted value to determine whether the product is out of stock, and to set its \u003Ccode class=\"badge bg-soft-danger text-danger\">quantity_max\u003C\u002Fcode> value.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>Set the \u003Ccode class=\"badge bg-soft-danger text-danger\">expires\u003C\u002Fcode> attribute on the product to a time slightly before the corresponding lock is set to expire in your database. This avoids a gap where stock could become available again before the lock has actually cleared for the customer currently holding it.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>Use Foxy’s cart JavaScript events to create, update, and remove locks as customers interact with their cart. The relevant events are \u003Ccode class=\"badge bg-soft-danger text-danger\">cart-submit.done\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">cart-item-quantity-update.done\u003C\u002Fcode>, and \u003Ccode class=\"badge bg-soft-danger text-danger\">cart-item-remove.done\u003C\u002Fcode>. Add your custom callback for these events through the \u003Cstrong>Configuration\u003C\u002Fstrong> page in your store’s Foxy admin, in the “footer” textarea under \u003Cstrong>Add custom header and footer code to your templates\u003C\u002Fstrong>.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>Within your callback, check the \u003Ccode class=\"badge bg-soft-danger text-danger\">params\u003C\u002Fcode> parameter of the event to see what changed, and use the \u003Ccode class=\"badge bg-soft-danger text-danger\">FC.json\u003C\u002Fcode> cart object to access other cart details you need.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>In your \u003Ca href=\"https:\u002F\u002Ffoxy.io\u002Fhelp\u002Farticles\u002Fconfirm-inventory-before-checkout-with-the-pre-payment-webhook\" class=\"\">pre-payment webhook\u003C\u002Fa> endpoint, confirm that existing inventory locks still match the current contents of the cart. If the cart requires more stock than is locked, confirm there’s enough available before letting the checkout proceed.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>In your \u003Ca href=\"https:\u002F\u002Ffoxy.io\u002Fhelp\u002Farticles\u002Ftrack-inventory-with-quantity-max-and-the-transaction-webhook\" class=\"\">transaction webhook\u003C\u002Fa> endpoint, clear out any inventory locks tied to that transaction once you’ve adjusted your actual inventory level.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003Ch2>Notes\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Cp>This approach requires custom development on your end — Foxy provides the cart events and webhooks, but the lock tracking, matching, and clearing logic all live in your own system.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>This is the most reliable way to prevent overselling, since stock is reserved as soon as a product is added to the cart rather than only checked at transaction time.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>",{"name":521,"created_at":522,"published_at":523,"updated_at":524,"id":525,"uuid":47,"content":526,"slug":48,"full_slug":48,"sort_by_date":59,"position":704,"tag_list":705,"is_startpage":24,"parent_id":59,"meta_data":59,"group_id":706,"first_published_at":707,"release_id":59,"lang":65,"path":59,"alternates":708,"default_full_slug":59,"translated_slugs":59},"Contact","2022-09-23T19:56:58.957Z","2025-05-08T18:24:40.382Z","2025-05-08T18:24:40.392Z",3138,{"seo":527,"_uid":530,"title":531,"action":532,"fields":533,"method":680,"columns":681,"subtitle":695,"component":48,"button_text":701,"submit_title":702,"submit_subtitle":703},{"_uid":528,"title":521,"plugin":529,"description":13},"24ff7574-3bcc-48d2-85b5-e529dfea1cc4","meta-fields","8f54f1da-9d8f-49b2-89e7-840e886491cb","We're here to help.","https:\u002F\u002Fusebasin.com\u002Ff\u002F029f48d65402",[534,539,543,651,654,659,674],{"_uid":535,"name":536,"type":332,"label":537,"options":13,"required":33,"component":538,"placeholder":13},"9a70b226-2036-4f90-a052-b3efa61c5896","name","Name","form___field",{"_uid":540,"name":541,"type":541,"label":542,"options":13,"required":33,"component":538,"placeholder":13},"86ba35be-ff43-4a28-8633-14052a8f6622","email","Email Address",{"_uid":544,"name":545,"type":546,"label":547,"options":548,"required":33,"component":538,"conditions":549,"placeholder":13},"3f827475-492c-4f97-aa1e-2386ac263b6c","topic","select","Topic","Presales, Support, Billing, Partnerships, Order Enquiry, Other",[550,605,615,622,630,638,644],{"_uid":551,"equals":552,"fields":553,"component":604},"e21d97dd-e68e-4fa6-ba97-bc40f3041dde","Order Enquiry",[554],{"_uid":555,"body":556,"type":602,"title":13,"component":603},"b64992bc-6d53-48b8-b7a0-d81e5a062e50",{"type":324,"content":557},[558],{"type":327,"content":559},[560,562,569,571,573,574,578,580,585,593,595,600],{"text":561,"type":332},"We are ",{"text":563,"type":332,"marks":564},"Foxy.io",[565],{"type":454,"attrs":566},{"href":567,"uuid":59,"anchor":59,"custom":568,"target":59,"linktype":31},"http:\u002F\u002FFoxy.io",{},{"text":570,"type":332},", an ecommerce platform powering ecommerce for other merchants. We do not sell products, and are unable to assist with questions about order statuses or refunds for any merchants using our platform. Please contact the merchant you ordered from for assistance. If you’d like to report a store using Foxy for fraudulent practices, please select ‘other’ in the subject.",{"type":572},"hard_break",{"type":572},{"text":575,"type":332,"marks":576},"NOTE:",[577],{"type":357},{"text":579,"type":332}," We are ",{"text":581,"type":332,"marks":582},"not ",[583],{"type":584},"italic",{"text":586,"type":332,"marks":587},"Foxy.in",[588,592],{"type":454,"attrs":589},{"href":590,"uuid":59,"anchor":59,"custom":591,"target":59,"linktype":31},"http:\u002F\u002FFoxy.in",{},{"type":584},{"text":594,"type":332},". We are not in any way affiliated with ",{"text":586,"type":332,"marks":596},[597],{"type":454,"attrs":598},{"href":590,"uuid":59,"anchor":59,"custom":599,"target":59,"linktype":31},{},{"text":601,"type":332},", and cannot help in any way with your order from that website.","danger","global___alert","form___condition",{"_uid":606,"equals":607,"fields":608,"component":604},"8765c3e1-25cf-44aa-b8ea-fc6094acf9c3","Presales",[609],{"_uid":610,"name":611,"type":612,"label":13,"options":13,"required":24,"component":538,"conditions":613,"placeholder":13,"default_value":614},"cf464f8e-d643-4f6e-af29-d3abffaf7380","department_email_address","hidden",[],"hello@foxy.io",{"_uid":616,"equals":208,"fields":617,"component":604},"4007b6d8-77e5-421d-bd1e-6f336dd853fb",[618],{"_uid":619,"name":611,"type":612,"label":13,"options":13,"required":24,"component":538,"conditions":620,"placeholder":13,"default_value":621},"7b4c6aa5-a68c-45e0-9ce1-0a36af10c0c2",[],"help@foxy.io",{"_uid":623,"equals":624,"fields":625,"component":604},"1dbb8f11-613d-43cd-9e09-1b94f6e19219","Billing",[626],{"_uid":627,"name":611,"type":612,"label":13,"options":13,"required":24,"component":538,"conditions":628,"placeholder":13,"default_value":629},"a0ac0d1b-bc4f-4a6c-a682-581d450b0b73",[],"help+billing@foxy.io",{"_uid":631,"equals":632,"fields":633,"component":604},"a0a53a50-7172-4a29-ba58-181e38874e12","Partnerships",[634],{"_uid":635,"name":611,"type":612,"label":13,"options":13,"required":24,"component":538,"conditions":636,"placeholder":13,"default_value":637},"7aa011d9-f374-4aed-b5a5-929b54aaf152",[],"partners@foxy.io",{"_uid":639,"equals":552,"fields":640,"component":604},"a4cd431f-25d5-41c7-bfdc-02c908c8fb47",[641],{"_uid":642,"name":611,"type":612,"label":13,"options":13,"required":24,"component":538,"conditions":643,"placeholder":13,"default_value":614},"f5d52168-d6ae-451b-94ee-2ced1cbd28ad",[],{"_uid":645,"equals":646,"fields":647,"component":604},"25aba1ed-eb41-4bbc-aa89-f7a7167ea86e","Other",[648],{"_uid":649,"name":611,"type":612,"label":13,"options":13,"required":24,"component":538,"conditions":650,"placeholder":13,"default_value":614},"f40dfaef-c203-4b71-bf4e-e1b43cef192b",[],{"_uid":652,"component":653},"e9c53a05-f40a-4510-aaf8-bc072a235a0c","form___subject",{"_uid":655,"name":656,"type":657,"label":658,"options":13,"required":33,"component":538,"placeholder":13},"a4c4d385-fff4-4978-99fb-b68cfea623d6","message","textarea","Message",{"_uid":660,"name":661,"type":546,"label":662,"options":663,"required":33,"component":538,"conditions":664,"placeholder":13},"8a3c9f85-f438-427d-9c7a-d7b295a14b5b","existing_user","Are you an existing user?","No, Yes",[665],{"_uid":666,"equals":667,"fields":668,"component":604},"115933d6-262a-4b59-8fa8-579c5ad73de1","Yes",[669],{"_uid":670,"name":671,"type":332,"label":672,"options":13,"required":33,"component":538,"conditions":673,"placeholder":13},"44b6ff23-98f0-4e95-b7f5-c23e06415c2d","subdomain","Store Subdomain",[],{"_uid":675,"name":676,"type":546,"label":677,"options":678,"required":33,"component":538,"conditions":679,"placeholder":13},"922a5cef-3af2-4113-8855-36c7910e3ee3","user_type","What type of user are you?","Developer, Designer, Merchant",[],"POST",[682],{"_uid":683,"text":684,"title":693,"component":694},"7323b90d-a93a-4bf1-baa9-20d0b7ead61b",{"type":324,"content":685},[686],{"type":327,"content":687},[688,690,691],{"text":689,"type":332},"855.369.9227",{"type":572},{"text":692,"type":332},"9:30am-6pm Central M-F","Pre-sales, Sales, & Partnerships","contact___footer_column",{"type":324,"content":696},[697],{"type":327,"content":698},[699],{"text":700,"type":332},"Get in touch to get help from our friendly support team.","Submit","Success!","Your email has been received. We'll get back to you as soon as we can, but it might take a business day. If you don't hear back from us in a timely manner, please check your spam folder to ensure our reply didn't go there.",-80,[],"2fd9fb7d-a48a-4184-acfd-30022d8d6f08","2022-09-23T20:10:45.360Z",[],[288,710,738],{"name":711,"created_at":712,"published_at":713,"updated_at":714,"id":715,"uuid":716,"content":717,"slug":731,"full_slug":732,"sort_by_date":59,"position":733,"tag_list":734,"is_startpage":24,"parent_id":310,"meta_data":59,"group_id":735,"first_published_at":736,"release_id":59,"lang":65,"path":59,"alternates":737,"default_full_slug":59,"translated_slugs":59},"Products","2023-01-19T16:20:53.075Z","2024-06-05T04:29:14.851Z","2024-06-05T04:29:14.872Z",28236,"389d5512-29ba-4a93-9cfa-9491d1618f73",{"_uid":718,"icon":719,"name":711,"guides":720,"pinned":24,"summary":721,"category":13,"component":297,"blog_posts":722,"content_hub":24,"icon_custom":723,"case_studies":724,"faq_sections":725,"help_articles":726,"featured_guides":727,"mailbox_category":13,"featured_articles":728,"featured_blog_posts":729,"featured_case_studies":730},"3551f6e8-765a-4b8d-8587-2e2eda4d2b23","fa-tags",[],"How products work, supported product types, inventory management, and more.",[],{"id":59,"alt":59,"name":13,"focus":59,"title":59,"filename":13,"copyright":59,"fieldtype":81},[],[],[],[],[],[],[],"products","help\u002Fcategories\u002Fproducts",150,[],"c025c7a7-0d20-4244-938a-c8d6588e1269","2023-01-19T17:25:32.570Z",[],{"name":739,"created_at":740,"published_at":741,"updated_at":742,"id":743,"uuid":499,"content":744,"slug":757,"full_slug":758,"sort_by_date":59,"position":759,"tag_list":760,"is_startpage":24,"parent_id":310,"meta_data":59,"group_id":761,"first_published_at":741,"release_id":59,"lang":65,"path":59,"alternates":762,"default_full_slug":59,"translated_slugs":59},"Inventory Management","2026-07-24T21:09:48.661Z","2026-07-24T21:10:19.366Z","2026-07-24T21:10:19.375Z",201677982405661,{"_uid":745,"icon":13,"name":739,"type":746,"pinned":24,"summary":747,"category":716,"component":297,"blog_posts":748,"icon_custom":749,"case_studies":751,"faq_sections":752,"featured_guides":753,"mailbox_category":13,"featured_articles":754,"featured_blog_posts":755,"featured_case_studies":756},"627df0ff-c9fd-4689-928c-c66ebb1c67d5","simple","How to track product inventory, including limiting cart quantities, confirming stock before checkout, and setting up advanced inventory locks.",[],{"id":59,"alt":59,"name":13,"focus":59,"title":59,"source":59,"filename":13,"copyright":59,"fieldtype":81,"meta_data":750},{},[],[],[],[],[],[],"inventory-management","help\u002Fcategories\u002Finventory-management",-880,[],"7c5de71b-c82b-4c04-a8fb-dfda525b32f6",[],{},1784930206884]