[{"data":1,"prerenderedAt":4351},["ShallowReactive",2],{"$fdQ0Pjt-mq6RlOD_o8V2938L6QVbhPfRhPPwEAQJJjOo":3,"footer:default":2645,"header:blog":2832,"story:navigation\u002Fsearch:blog":2928,"blog:blog\u002Fbuild-a-jamstack-ecommerce-website-with-next-js-contentful-and-foxy":2967,"richtext:post:86a93102-b0a3-4bb2-ad7d-d02f94e0dd16":4343,"_apollo:default":4350},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307,310,313,316,319,322,325,328,331,334,337,340,343,346,349,352,355,358,361,364,367,370,373,376,379,382,385,388,391,394,397,400,403,406,409,412,415,418,421,424,427,430,433,436,439,442,445,448,451,454,457,460,463,466,469,472,475,478,481,484,487,490,493,496,499,502,505,508,511,514,517,520,523,526,529,532,535,538,541,544,547,550,553,556,559,562,565,568,571,574,577,580,583,586,589,592,595,598,601,604,607,610,613,616,619,620,623,626,629,632,635,638,641,644,647,650,653,656,659,662,665,668,671,674,677,680,683,686,689,692,695,698,701,704,707,710,713,716,719,722,725,728,731,734,737,740,743,746,749,752,755,758,761,764,767,770,773,776,779,782,785,788,791,794,797,800,803,806,809,812,815,818,821,824,827,830,833,836,839,842,845,848,851,854,857,860,863,866,869,871,873,875,877,879,881,883,885,887,889,891,893,895,897,899,901,903,905,907,909,911,913,915,917,919,921,923,925,927,929,931,933,936,939,942,945,948,951,954,957,960,963,966,969,972,975,978,981,984,987,990,993,996,999,1002,1005,1008,1011,1014,1017,1020,1023,1026,1029,1032,1035,1038,1041,1044,1047,1050,1053,1056,1059,1062,1065,1068,1071,1074,1077,1080,1083,1086,1089,1092,1095,1098,1101,1104,1107,1110,1113,1116,1119,1122,1125,1128,1131,1134,1137,1140,1143,1146,1149,1152,1155,1158,1161,1164,1167,1170,1173,1176,1179,1182,1185,1188,1191,1194,1197,1200,1203,1206,1209,1212,1215,1217,1220,1222,1225,1227,1230,1232,1235,1237,1240,1242,1245,1247,1250,1252,1255,1257,1260,1262,1265,1267,1270,1272,1275,1277,1280,1282,1285,1287,1290,1292,1295,1297,1300,1302,1305,1307,1310,1312,1315,1317,1320,1322,1325,1327,1330,1332,1335,1337,1340,1342,1345,1347,1350,1352,1355,1357,1360,1362,1365,1367,1370,1372,1375,1377,1380,1382,1385,1387,1390,1392,1395,1397,1400,1402,1405,1407,1410,1412,1415,1417,1420,1422,1425,1427,1430,1432,1435,1437,1440,1442,1445,1447,1450,1452,1455,1457,1460,1462,1465,1467,1470,1472,1475,1477,1480,1482,1485,1487,1490,1492,1495,1497,1500,1502,1505,1507,1510,1512,1515,1517,1520,1522,1525,1527,1530,1532,1535,1537,1540,1542,1545,1547,1550,1552,1555,1557,1560,1562,1565,1567,1570,1572,1575,1577,1580,1582,1585,1587,1590,1592,1595,1597,1600,1602,1605,1607,1610,1612,1615,1617,1620,1622,1625,1627,1630,1632,1635,1637,1640,1642,1645,1647,1650,1652,1655,1657,1660,1662,1665,1667,1670,1672,1675,1677,1680,1682,1685,1687,1690,1692,1695,1697,1700,1702,1705,1707,1710,1712,1715,1717,1720,1722,1725,1727,1730,1732,1735,1737,1740,1742,1745,1747,1750,1752,1755,1757,1760,1762,1765,1767,1770,1772,1775,1778,1781,1784,1787,1790,1793,1796,1799,1802,1805,1808,1811,1814,1817,1820,1823,1826,1829,1832,1835,1838,1841,1844,1847,1850,1853,1856,1859,1862,1865,1868,1871,1874,1877,1880,1883,1886,1889,1892,1895,1898,1901,1904,1907,1910,1913,1916,1919,1922,1925,1928,1931,1934,1937,1940,1943,1946,1949,1952,1955,1958,1961,1964,1967,1970,1973,1976,1979,1982,1985,1988,1991,1994,1997,2000,2003,2006,2009,2012,2015,2018,2021,2024,2027,2030,2033,2036,2039,2042,2045,2048,2051,2054,2057,2060,2063,2066,2069,2072,2075,2078,2081,2084,2087,2090,2093,2096,2099,2102,2105,2108,2111,2114,2117,2120,2123,2126,2129,2132,2135,2138,2141,2144,2147,2150,2153,2156,2159,2162,2165,2168,2171,2174,2177,2180,2183,2186,2189,2192,2195,2198,2201,2204,2207,2210,2213,2216,2219,2222,2225,2228,2231,2234,2237,2240,2243,2246,2249,2252,2255,2258,2261,2264,2267,2270,2273,2276,2279,2282,2285,2288,2291,2294,2297,2300,2303,2306,2309,2312,2315,2318,2321,2324,2327,2330,2333,2336,2339,2342,2345,2348,2351,2354,2357,2360,2363,2366,2369,2372,2375,2378,2381,2384,2387,2390,2393,2396,2399,2402,2405,2408,2411,2414,2417,2420,2423,2426,2429,2432,2435,2438,2441,2444,2447,2450,2453,2456,2459,2462,2465,2468,2471,2474,2477,2480,2483,2486,2489,2492,2495,2498,2501,2504,2507,2510,2513,2516,2519,2522,2525,2528,2531,2534,2537,2540,2543,2546,2549,2552,2555,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602,2604,2606,2608,2610,2612,2615,2618,2621,2624,2627,2630,2633,2635,2637,2639,2641,2643],{"path":5,"uuid":6},"\u002Fcall","f79a96d9-dfe3-4b8b-8f7e-cbed745a5463",{"path":8,"uuid":9},"\u002Fpricing-new","7753aa92-8cfc-47a7-a311-5cf4fd0a785a",{"path":11,"uuid":12},"\u002Fpricing","c450c58d-761d-48c0-a9af-0b064611689b",{"path":14,"uuid":15},"\u002Fwebflow-printful","14dfa3f2-0387-4caa-b3f9-ed31ec31da85",{"path":17,"uuid":18},"\u002Fadmin-selection","163a84b8-86e1-43b3-93d3-b46b1c4b591d",{"path":20,"uuid":21},"\u002Fcbd","55cec003-cd36-4287-817d-b297dde47955",{"path":23,"uuid":24},"\u002Fsecurity-contact","1f58fb2c-8681-4742-b6e8-09999beae9f6",{"path":26,"uuid":27},"\u002Fupgrade","78eb6fdf-918a-4909-b756-692390538fcf",{"path":29,"uuid":30},"\u002Fpci","55cbfcc3-425a-4261-8037-54e919851d2d",{"path":32,"uuid":33},"\u002Ffor-good","dc6657d7-7f4f-4c0d-b781-e971b038ee26",{"path":35,"uuid":36},"\u002Faccelerate","9e9de431-021d-4247-ba4c-c44d7f1574d6",{"path":38,"uuid":39},"\u002Fabout-us","63634293-a749-4226-9439-9f38ee6dcda0",{"path":41,"uuid":42},"\u002F","1e9858a9-397f-45fd-9b69-a6e661ebe6a6",{"path":44,"uuid":45},"\u002Findustries\u002Fcbd","667ef91d-b6a8-4204-9c77-f899cfb92772",{"path":47,"uuid":48},"\u002Fcompare\u002Fasecurecart","a0825db5-eaa0-4fea-8e96-63e373f12c2f",{"path":50,"uuid":51},"\u002Fcompare\u002F1shoppingcart","ae24fe69-f483-43e0-85a0-fed7631e7c43",{"path":53,"uuid":54},"\u002Faudiences\u002Fservice-providers","bedcbaa9-ceda-4cd2-9ca2-84ce6dbec47f",{"path":56,"uuid":57},"\u002Fcompare\u002Fplasso","ab566afe-7658-4ad9-97f3-a81d80ca9cbf",{"path":59,"uuid":60},"\u002Fcompare\u002Flemonstand","4e84345b-7e70-4a96-9bc8-65ffa89d7bcb",{"path":62,"uuid":63},"\u002Fcompare\u002Fstripe","b64b1102-1af6-4bdf-9431-b1f83dc64c2b",{"path":65,"uuid":66},"\u002Fcompare\u002Fgumroad","717d56db-d2b7-4875-a030-cdd65a1fcafe",{"path":68,"uuid":69},"\u002Fcompare\u002Fbigcommerce","8ce909c7-8a12-431c-8185-6510e2d35985",{"path":71,"uuid":72},"\u002Fcompare\u002Fcelery","4682738a-40a1-494e-afed-533a20a298a7",{"path":74,"uuid":75},"\u002Faudiences\u002Fenterprise","d72fa527-64b1-41f5-a2e4-9a91f7534311",{"path":77,"uuid":78},"\u002Faudiences\u002Fdevelopers","e9ecdb06-b3f4-4004-aacf-32037946d4c1",{"path":80,"uuid":81},"\u002Fuse-cases\u002Fdigital-products","c5fba9f5-31c1-44be-8653-b882ecb95946",{"path":83,"uuid":84},"\u002Faudiences\u002Fsaas-and-platforms","f9716688-4b1b-4ce1-be64-2ba754e77c89",{"path":86,"uuid":87},"\u002Faudiences\u002Fmerchants","899579ca-edc2-45f4-87de-916d1bf5eaf7",{"path":89,"uuid":90},"\u002Fuse-cases\u002Fdonations","48643895-3ce9-427f-8aed-f361e226afca",{"path":92,"uuid":93},"\u002Fsuccess-stories","3f7d4365-068d-4d2b-9be2-c3279d413dbd",{"path":95,"uuid":96},"\u002Fhow-foxy-works","26cb7c55-faed-4a77-a291-1552d4111b3e",{"path":98,"uuid":99},"\u002Fterms-of-service","60ba16a2-c1f4-485f-b978-8d2eeeafbf5a",{"path":101,"uuid":102},"\u002Fprivacy-policy","332302b9-1d18-4016-b9c8-9b33c72d782b",{"path":104,"uuid":105},"\u002Fbrand-assets","23cae210-baf4-4588-9862-d09f4f52ccd2",{"path":107,"uuid":108},"\u002Fcompare","056a7857-b18f-4025-8f97-91a38fc19bc8",{"path":110,"uuid":111},"\u002Fcontact","01e4e370-f9b9-45af-8fa9-f15540699b0d",{"path":113,"uuid":114},"\u002Fhelp","4a679eb7-662d-4ea4-a976-5a2acbf0b663",{"path":116,"uuid":117},"\u002Fintegrations","34235e3a-f951-45e3-8551-d8c2ea391b2d",{"path":119,"uuid":120},"\u002Fwhats-next","08876121-0df3-4ed9-aa11-902b3e41cd02",{"path":122,"uuid":123},"\u002Fpartners","bd4dfa41-8800-4eeb-90f8-781b25c464c6",{"path":125,"uuid":126},"\u002Fplayground","cb4b43ea-7d23-4175-9553-f2f9981ab1ab",{"path":128,"uuid":129},"\u002Fplatforms","d5ee0dd9-4b29-4fbe-968f-b9a7e93f340b",{"path":131,"uuid":132},"\u002Fpayment-methods","e4174198-79d4-49d1-9ffa-4ae2eee9cd13",{"path":134,"uuid":135},"\u002Fblog","6da84274-ebbf-4c71-9bc8-4eba47a6cb15",{"path":137,"uuid":138},"\u002Fchangelogs","d2c83612-d611-47f3-a3b4-ca7fe08540b8",{"path":140,"uuid":141},"\u002Ffeatures","bb04690f-fe98-4ce6-80be-05b950f2364f",{"path":143,"uuid":144},"\u002Fhelp\u002Farticles\u002Fcreate-a-new-payment-set","51d45caa-4d9e-4ad8-acf3-3a73d49e9f61",{"path":146,"uuid":147},"\u002Fhelp\u002Farticles\u002Fpayment-sets-overview","f4d72771-3f52-431c-8d77-6f64fa5573fd",{"path":149,"uuid":150},"\u002Fhelp\u002Farticles\u002Fmodify-a-payment-set","9e1f5f7c-23e4-417e-a3b5-b1d47a913d11",{"path":152,"uuid":153},"\u002Fhelp\u002Farticles\u002Fset-default-payment-set","8f429888-c80b-4957-8da2-596c98a23c31",{"path":155,"uuid":156},"\u002Fhelp\u002Farticles\u002Fapply-a-payment-set","5a1e4395-8bc3-44c9-adb7-9cf81094779b",{"path":158,"uuid":159},"\u002Fhelp\u002Farticles\u002Fdelete-a-payment-set","aac31d75-bef3-4e62-bb83-3cbf28aaadca",{"path":161,"uuid":162},"\u002Fhelp\u002Farticles\u002Fapply-a-template-set","c24bae11-ad9e-4e1a-bf05-e60646216c4d",{"path":164,"uuid":165},"\u002Fhelp\u002Farticles\u002Fdefault-template-set","8ca8cd8e-a6b4-4a5d-8bfe-339e8f10f0ba",{"path":167,"uuid":168},"\u002Fhelp\u002Farticles\u002Fmodify-a-template-set","0e1b9a1a-6b1f-4c32-ad3b-8e6ce406467e",{"path":170,"uuid":171},"\u002Fhelp\u002Farticles\u002Fdelete-a-template-set","eab2574f-0c0c-4b80-be67-530b8cd7d9a8",{"path":173,"uuid":174},"\u002Fhelp\u002Farticles\u002Fcreate-a-new-template-set","43aa96d6-b1f3-42af-924c-6a316ede6df9",{"path":176,"uuid":177},"\u002Fhelp\u002Farticles\u002Ftemplate-sets-overview","829f6c05-12f7-44f2-8381-6111cb5ee303",{"path":179,"uuid":180},"\u002Fhelp\u002Farticles\u002Faccept-user-invitation","d0ed94f2-066b-4a14-b2d4-5393585224f2",{"path":182,"uuid":183},"\u002Fhelp\u002Farticles\u002Fadd-a-new-user","996e8da1-8393-4dd9-87ef-957265a50895",{"path":185,"uuid":186},"\u002Fhelp\u002Farticles\u002Fresend-user-invitation","6db7bf28-c7e5-4d0d-b939-a23801c3f75a",{"path":188,"uuid":189},"\u002Fhelp\u002Farticles\u002Fdelete-a-user","82c17473-30df-4f73-b4f6-daf49632f968",{"path":191,"uuid":192},"\u002Fhelp\u002Farticles\u002Frevoke-a-user-s-access","ce5ba466-e8ed-4ea0-8e19-5ca2c054c946",{"path":194,"uuid":195},"\u002Fhelp\u002Farticles\u002Fcreate-a-new-category","af46955a-a736-40ab-9c53-b823c6ef3141",{"path":197,"uuid":198},"\u002Fhelp\u002Farticles\u002Fdelete-a-category","49fb898d-b270-485f-98b0-82a21073c8d0",{"path":200,"uuid":201},"\u002Fhelp\u002Farticles\u002Fmodify-a-category","0c02ee7d-6942-48ea-bd77-c152013bd404",{"path":203,"uuid":204},"\u002Fhelp\u002Farticles\u002Fproduct-categories-overview","8ae9b378-e102-447d-b0b4-a9a37e58e1f9",{"path":206,"uuid":207},"\u002Fhelp\u002Farticles\u002Fdiscount-parameters","c9f8aa4a-b960-4b96-842f-e7abb365e4db",{"path":209,"uuid":210},"\u002Fhelp\u002Farticles\u002Fgoogle-analytics-parameters","9131b28f-8115-49e8-9e4f-9f02eb2ac5a3",{"path":212,"uuid":213},"\u002Fhelp\u002Farticles\u002Fsubscription-parameters","59a7d1c4-7f0f-4a02-a382-19ea970b5bc4",{"path":215,"uuid":216},"\u002Fhelp\u002Farticles\u002Fstandard-parameters","a8391b5a-4a87-4794-becf-06640ea82773",{"path":218,"uuid":219},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-subscriptions","54c01e5d-67e2-4732-b110-7e046e509913",{"path":221,"uuid":222},"\u002Fhelp\u002Farticles\u002Fbuild-an-online-store-with-lovable-ai-prompts-supabase-and-foxy","67c17311-8277-4347-b18d-11b51771e3c1",{"path":224,"uuid":225},"\u002Fhelp\u002Farticles\u002Fbuild-a-subscription-form-with-lovable-ai-prompts-and-foxy","32228c52-9e8e-410c-9405-d055605b6ab5",{"path":227,"uuid":228},"\u002Fhelp\u002Farticles\u002Fbuild-a-product-configurator-with-convertcalculator","c0bf7f34-727c-4cda-ac26-aeb6b845fb7e",{"path":230,"uuid":231},"\u002Fhelp\u002Farticles\u002Fmanage-products-with-framer-cms","91d6f67f-c7d5-4571-bb9e-b8a55ce373ca",{"path":233,"uuid":234},"\u002Fhelp\u002Farticles\u002Fmanage-products-with-highlevel-ecommerce","2f6a62ca-f82e-4aaf-8d74-39c5235da937",{"path":236,"uuid":237},"\u002Fhelp\u002Farticles\u002Fmanage-products-with-wix-studio","5fdd523c-a983-4622-9326-7dd8bfb048f5",{"path":239,"uuid":240},"\u002Fhelp\u002Farticles\u002Fsync-foxy-transactions-with-printful-orders-via-byteline","f1734dbf-16a1-4516-b4c3-5580566cc5e5",{"path":242,"uuid":243},"\u002Fhelp\u002Farticles\u002Fsync-printful-products-with-webflow-cms-via-byteline","32efd5b6-cd64-4774-b921-bb17ea3416ca",{"path":245,"uuid":246},"\u002Fhelp\u002Farticles\u002Fvalidate-webflow-cms-product-pricing-with-foxy-automations","62d28b80-dcbe-488f-aa17-cb73b592f6f1",{"path":248,"uuid":249},"\u002Fhelp\u002Farticles\u002Fmanage-product-variants-with-webflow-cms-advanced","f0474e52-240c-4038-9844-7cd8ebccf820",{"path":251,"uuid":252},"\u002Fhelp\u002Farticles\u002Fconvert-asecurecart-add-to-cart-forms-to-foxy-forms","54a3f8df-1e5b-443a-99d9-3dfbd761add3",{"path":254,"uuid":255},"\u002Fhelp\u002Farticles\u002Flink-and-form-builder-overview","7ef4112c-0f9e-4d5c-b7f4-1d04d8716942",{"path":257,"uuid":258},"\u002Fhelp\u002Farticles\u002Fmanage-products-with-divhunt-cms","b0944fc1-6833-4a80-a0e9-3f96c1692d7a",{"path":260,"uuid":261},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxys-donation-element","bfea3d87-f603-4c0e-a70f-f08a39ed8df6",{"path":263,"uuid":264},"\u002Fhelp\u002Farticles\u002Fselling-gift-cards-with-the-gift-card-element","4a89b45c-db9c-442d-9437-b72dba6eae05",{"path":266,"uuid":267},"\u002Fhelp\u002Farticles\u002Fcreate-an-add-to-cart-link-in-canva","029ec240-8812-4bc4-99f8-f1605e6c8fe7",{"path":269,"uuid":270},"\u002Fhelp\u002Farticles\u002Fmultilingual-and-multi-currency-with-webflow-localization","b9e69059-3ae7-4ec6-95bf-7b0f55c31164",{"path":272,"uuid":273},"\u002Fhelp\u002Farticles\u002Fmanage-foxy-products-with-pagecloud-e-commerce","d5d60e5a-ff95-4deb-8aee-fbe99b80e032",{"path":275,"uuid":276},"\u002Fhelp\u002Farticles\u002Fset-up-a-customer-portal","1168ec39-1dd0-4fb5-b29a-581ed01a06eb",{"path":278,"uuid":279},"\u002Fhelp\u002Farticles\u002Fintegrate-foxy-with-square-online-weebly-product-manager","c50bb611-4036-4714-bb6a-d3105d7763cc",{"path":281,"uuid":282},"\u002Fhelp\u002Farticles\u002Fadd-or-remove-card-types-accepted-on-checkout","db6be093-3b1c-4fec-8149-b81ca13af24d",{"path":284,"uuid":285},"\u002Fhelp\u002Farticles\u002Fadd-the-stores-address-phone-to-the-email-receipt","bd29e1e8-142c-4f72-a10e-cf6c1086c169",{"path":287,"uuid":288},"\u002Fhelp\u002Farticles\u002Fhow-do-i-know-if-im-using-both-the-text-html-email-receipts","037fad5a-b01a-477f-898a-7a8248aac0ec",{"path":290,"uuid":291},"\u002Fhelp\u002Farticles\u002Fadd-store-address-phone-information-to-web-receipt","7e4c548e-78f0-4b75-b622-52f7e9aa3bbd",{"path":293,"uuid":294},"\u002Fhelp\u002Farticles\u002Fcustomize-the-message-in-web-and-email-receipts","9fffb8f9-015c-4ae7-bcb9-ccc2b09c208b",{"path":296,"uuid":297},"\u002Fhelp\u002Farticles\u002Fcreate-a-customer-portal-in-webflow","8a60adbc-cf44-4db8-872b-d9ca29edddbc",{"path":299,"uuid":300},"\u002Fhelp\u002Farticles\u002Fremove-elements-from-email-receipt","cfa03dd7-dfef-4353-a63f-2de601fb4bc2",{"path":302,"uuid":303},"\u002Fhelp\u002Farticles\u002Fchange-background-color-on-cart-and-checkout","c41cd092-77d3-4824-be24-4e555e17308c",{"path":305,"uuid":306},"\u002Fhelp\u002Farticles\u002Fcreate-ecommerce-ready-product-pages-in-umbraco-with-foxy-uskinned","03c2058a-3adf-4b48-86cd-070d127d7e8d",{"path":308,"uuid":309},"\u002Fhelp\u002Farticles\u002Fuse-godaddy-online-store-to-manage-foxy-products","c3d8ef3e-b3ea-41e3-927e-f49272e79e46",{"path":311,"uuid":312},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-zoho-sites","7ef16816-a6ca-4861-b044-8d1aeb0eb10a",{"path":314,"uuid":315},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-zoho-sites","c2a72341-8573-46e9-85e3-9b0bbf63bb4c",{"path":317,"uuid":318},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-weebly","214fd913-cf0a-4b00-b14b-cd3fb13b78ea",{"path":320,"uuid":321},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-weebly","32b22782-7999-4a83-bf2f-5ec30b255aad",{"path":323,"uuid":324},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-webydo","26332d27-8a46-47b6-a161-37d1f2879777",{"path":326,"uuid":327},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-webydo","77205734-195c-4389-8bb3-ccb417b9fbdc",{"path":329,"uuid":330},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-unbounce","1b384a7d-fa32-4d75-84ca-849206a092ad",{"path":332,"uuid":333},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-unbounce","87539dcd-182e-4ee4-8180-e6264ea38ebc",{"path":335,"uuid":336},"\u002Fhelp\u002Farticles\u002Fuse-squarespace-commerce-to-manage-your-foxy-products","4bb8ece7-1558-4069-967a-586babc714bd",{"path":338,"uuid":339},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-squarespace","e5fc9cfa-80e7-437f-8a9e-1dc7aecb9b73",{"path":341,"uuid":342},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-squarespace","3910b482-bfbc-4e4e-8f06-aac78302397c",{"path":344,"uuid":345},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-spacecraft","dab451c4-2520-41b2-8be9-086135e6e7b9",{"path":347,"uuid":348},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-spacecraft","7d62984a-e68c-424f-ba95-bd2e17b52078",{"path":350,"uuid":351},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-leadpages","1e0bad82-3d15-449e-927d-86d1cc2071b1",{"path":353,"uuid":354},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-leadpages","f665a6eb-6c02-4b3d-b2e0-0bf67d0e0e96",{"path":356,"uuid":357},"\u002Fhelp\u002Farticles\u002Fverify-your-browser","0099aefc-acdc-47a0-a226-730225745749",{"path":359,"uuid":360},"\u002Fhelp\u002Farticles\u002Flogin-or-browser-verification-issues","8b8c9131-0b21-4f71-a7a0-0a0701f7a93e",{"path":362,"uuid":363},"\u002Fhelp\u002Farticles\u002Ffiltering-transactions","fdf1dc6e-f1a7-4b4f-a6a0-61aa2a23272b",{"path":365,"uuid":366},"\u002Fhelp\u002Farticles\u002Fediting-voiding-refunding-transactions","0d8d8ffd-3377-4281-a027-b3304b489404",{"path":368,"uuid":369},"\u002Fhelp\u002Farticles\u002Fopening-the-browser-developer-console","b0e059fa-03ba-4e46-bf09-ecce7b013c29",{"path":371,"uuid":372},"\u002Fhelp\u002Farticles\u002Fsite24x7-synthetic-transaction-monitoring","c16872bc-7ff8-4d5c-86c8-129e641d2342",{"path":374,"uuid":375},"\u002Fhelp\u002Farticles\u002Fcreate-a-payment-set-for-testing-transactions-on-an-active-store","2183cfed-6745-481a-8882-b27d87db42b6",{"path":377,"uuid":378},"\u002Fhelp\u002Farticles\u002Fwhere-should-you-charge-sales-tax","9ff9982a-bb69-47d6-a0ed-01d88e201dd4",{"path":380,"uuid":381},"\u002Fhelp\u002Farticles\u002Fadd-a-customer-pickup-option-to-shipping","b45405a9-24ff-459c-8ed4-a5e5d9cbce2f",{"path":383,"uuid":384},"\u002Fhelp\u002Farticles\u002Flimit-shipping-to-specific-locations","bb2f5546-ab36-4dd4-9d8f-a9ff592b31cb",{"path":386,"uuid":387},"\u002Fhelp\u002Farticles\u002Fhelp-us-help-you","fed390be-6683-49fa-a553-a0b4051825a3",{"path":389,"uuid":390},"\u002Fhelp\u002Farticles\u002Four-official-domains-public-code","c3ac0fe3-83e2-4879-afbd-d4c83e1590df",{"path":392,"uuid":393},"\u002Fhelp\u002Farticles\u002Fcustom-reporting-beta","c4025dca-c0fa-4a53-a4ae-22af68eccf2c",{"path":395,"uuid":396},"\u002Fhelp\u002Farticles\u002Fupdate-subscription-frequency-in-the-foxy-admin","4ee37f0d-576c-4e15-a9ae-32b05a5f2609",{"path":398,"uuid":399},"\u002Fhelp\u002Farticles\u002Fadd-a-past-due-amount-to-a-subscription","95da3aff-5373-429a-9735-b7353f3906f6",{"path":401,"uuid":402},"\u002Fhelp\u002Farticles\u002Fmodify-a-subscription","7ad67a5c-bafd-49b6-b5e3-a66effe7023b",{"path":404,"uuid":405},"\u002Fhelp\u002Farticles\u002Fmodify-a-subscriptions-frequency","ab73e977-9d6d-4d50-bf20-06f7a4f24fdf",{"path":407,"uuid":408},"\u002Fhelp\u002Farticles\u002Fcreate-a-subscription","b4b6742e-c901-47e3-b70e-70d0ad1a6355",{"path":410,"uuid":411},"\u002Fhelp\u002Farticles\u002Fupdate-the-products-in-a-customers-subscription","1fbca5b0-ebb8-44eb-a9de-a8cf5427e256",{"path":413,"uuid":414},"\u002Fhelp\u002Farticles\u002Fmanually-redeliver-downloadable-product-links","d1aee27c-9902-4792-955e-07205a6c113e",{"path":416,"uuid":417},"\u002Fhelp\u002Farticles\u002Fdelete-a-downloadable-product","af6c871f-74c2-42dd-a157-396ac2997057",{"path":419,"uuid":420},"\u002Fhelp\u002Farticles\u002Fmodify-a-downloadable-product","3641a755-5762-4bc8-a7aa-9d5498be8f2c",{"path":422,"uuid":423},"\u002Fhelp\u002Farticles\u002Fcreate-a-downloadable-product","d43e02e7-8c65-486a-95d0-553db072089b",{"path":425,"uuid":426},"\u002Fhelp\u002Farticles\u002Fdownloadables-overview","24326b3d-4f64-44b8-bbdb-dfa2c0550ee1",{"path":428,"uuid":429},"\u002Fhelp\u002Farticles\u002Fwhere-are-products-managed","a301771c-6025-476f-a1c4-5989a91c16ab",{"path":431,"uuid":432},"\u002Fhelp\u002Farticles\u002Fpreorders-backorders-accepting-orders-without-payment","3d4ab377-4472-44ba-8010-3f98273d8c86",{"path":434,"uuid":435},"\u002Fhelp\u002Farticles\u002Fhide-product-options-in-the-cart-checkout-and-receipt","d23da0f0-368d-43a0-8698-36c41c7443cb",{"path":437,"uuid":438},"\u002Fhelp\u002Farticles\u002Fsetting-the-customer-portal-language","fe6ce68c-73ca-430d-a9c4-d2b90d3fc720",{"path":440,"uuid":441},"\u002Fhelp\u002Farticles\u002Fadd-coupon-to-subscription-in-foxy-admin","474774b2-d338-41e0-b4be-34619ba87c17",{"path":443,"uuid":444},"\u002Fhelp\u002Farticles\u002Fcreate-an-update-billing-information-link-for-customers","86e6d8e1-ca64-4683-a314-fab5f8872406",{"path":446,"uuid":447},"\u002Fhelp\u002Farticles\u002Fplace-an-order-on-behalf-of-a-customer","fe56949c-ccdf-4b0c-a35e-6c98c533104b",{"path":449,"uuid":450},"\u002Fhelp\u002Farticles\u002Fupdate-a-customers-billing-information","452a4db8-6d9d-408d-a462-75389870ad3d",{"path":452,"uuid":453},"\u002Fhelp\u002Farticles\u002Fupdating-a-subscribers-payment-or-address-information","9c223725-b58d-466c-89f1-33d7ba72f279",{"path":455,"uuid":456},"\u002Fhelp\u002Farticles\u002Fchange-existing-subscription-price-in-the-foxy-admin","67798f47-d7f7-40d1-94e7-1d1037fac596",{"path":458,"uuid":459},"\u002Fhelp\u002Farticles\u002Fcreate-a-buy-one-get-one-coupon","b312f323-3b2f-4ac8-9e8e-54990732417d",{"path":461,"uuid":462},"\u002Fhelp\u002Farticles\u002Fdont-allow-coupon-to-be-used-with-other-coupons","892088ff-a22e-460c-bb67-e5d8d95a1966",{"path":464,"uuid":465},"\u002Fhelp\u002Farticles\u002Fcancel-your-foxy-subscription","322179cd-ce27-4d6f-88b9-4006e22e9416",{"path":467,"uuid":468},"\u002Fhelp\u002Farticles\u002Ftransfer-your-foxy-subscription-to-a-different-email-address","373eb773-d3f8-4787-b6a8-dd7aba8849ad",{"path":470,"uuid":471},"\u002Fhelp\u002Farticles\u002Fupdate-your-foxy-subscription-billing-information","4d9244ae-fcf4-40b3-b4ed-cce34b6cfb0e",{"path":473,"uuid":474},"\u002Fhelp\u002Farticles\u002Fchange-your-foxy-subscription-plan","ebea5620-ddbe-4499-a9cc-fec9eaed6f0f",{"path":476,"uuid":477},"\u002Fhelp\u002Farticles\u002Fwhich-foxy-plan-is-right-for-you","12be0806-37e7-40a1-acb2-40b8dc57e017",{"path":479,"uuid":480},"\u002Fhelp\u002Farticles\u002Fstore-setup-worksheet","c9369645-ee0a-4774-bacd-1d80818307da",{"path":482,"uuid":483},"\u002Fhelp\u002Farticles\u002Fwhat-foxy-does-and-doesnt-do","0b1577a4-c299-4d1b-8baa-54a668bdc06d",{"path":485,"uuid":486},"\u002Fhelp\u002Farticles\u002Fintroduction-to-foxy","176b874d-7faf-4ba0-b2dc-530252ce4a65",{"path":488,"uuid":489},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-wix","2457ea38-0c28-4686-ace4-e92100c18d3b",{"path":491,"uuid":492},"\u002Fhelp\u002Farticles\u002Fmanage-products-with-wix","9698d75a-7359-498a-b8db-225af98d23bc",{"path":494,"uuid":495},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-wix","c8095d29-4c02-424d-b0f5-ace8fc447b13",{"path":497,"uuid":498},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-launchaco","f17e353b-10b5-4484-a8db-1926e23f3f3c",{"path":500,"uuid":501},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-launchaco","3ee54a65-9504-4d53-bca1-68fdafcf1a9c",{"path":503,"uuid":504},"\u002Fhelp\u002Farticles\u002Fmanage-product-variants-with-webflow-cms","109392a3-8040-40c6-9559-e829d8e19434",{"path":506,"uuid":507},"\u002Fhelp\u002Fcategories\u002Fgift-card-element","91d68267-c2bf-4deb-bfeb-2011ad2597fe",{"path":509,"uuid":510},"\u002Fhelp\u002Farticles\u002Fadd-a-mini-cart-to-your-webflow-website","829489a2-86f3-48f9-8742-fa039fb5fc11",{"path":512,"uuid":513},"\u002Fhelp\u002Farticles\u002Fadd-a-custom-header-and-footer-to-your-foxy-templates-in-webflow","bab2e145-d2f1-42bc-b3d4-b5cebb6810e3",{"path":515,"uuid":516},"\u002Fhelp\u002Fcategories\u002Fpayment-sets","18faa9bc-88a1-4057-b513-fd831eae2530",{"path":518,"uuid":519},"\u002Fhelp\u002Farticles\u002Fwebflow-frequently-asked-questions","acf799b3-c040-4d00-91c5-9c8619ae89d9",{"path":521,"uuid":522},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-instapage","1e6e8480-9712-4e1f-a7a6-e6a17dd02286",{"path":524,"uuid":525},"\u002Fhelp\u002Fcategories\u002Ftemplate-sets","b09f518b-789f-41aa-b9d5-36be3686da80",{"path":527,"uuid":528},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-form-in-carrd","806eb718-7481-4583-9a83-f469c4d6b973",{"path":530,"uuid":531},"\u002Fhelp\u002Fcategories\u002Fproduct-categories","ba278b8f-1c99-4680-9133-03f2433e6116",{"path":533,"uuid":534},"\u002Fhelp\u002Fcategories\u002Fproduct-parameters","fc90e31e-eb25-4492-b41a-6ac54b149038",{"path":536,"uuid":537},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-flauntly","2620e5a9-6942-401a-ba79-57ce1d87138d",{"path":539,"uuid":540},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-fastcomet-sitebuilder","95604e06-e095-43cf-ad61-132c4eac2489",{"path":542,"uuid":543},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-instapage","a2b37527-a784-4bdd-9c50-5520d60c5f8e",{"path":545,"uuid":546},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-clickfunnels","7738b01c-1ce6-4be4-bd93-5d1cad80b2f7",{"path":548,"uuid":549},"\u002Fhelp\u002Fcategories\u002Flovable","304bb7bc-1169-4460-a6a0-dae26c974a49",{"path":551,"uuid":552},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-clickfunnels","3b8c3971-1910-4a40-9a3a-87cf6cbdc237",{"path":554,"uuid":555},"\u002Fhelp\u002Fcategories\u002Fconvertcalculator","e62c86da-7adf-4506-8802-6dc6fb119fe8",{"path":557,"uuid":558},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-webflow","41e62db6-19b2-4038-82f1-04295fe7912d",{"path":560,"uuid":561},"\u002Fhelp\u002Fcategories\u002Fdivhunt","6ce4d6d1-8336-4855-94af-378acc9506a9",{"path":563,"uuid":564},"\u002Fhelp\u002Fparameters\u002Fgoogle-analytics-parameters","341d3414-1dbf-4bb3-bced-281ed138e639",{"path":566,"uuid":567},"\u002Fhelp\u002Fparameters\u002Femail","1b282589-2717-4433-b613-dc6f3a396715",{"path":569,"uuid":570},"\u002Fhelp\u002Fcategories\u002Fframer","a48e3198-73a1-4b24-a6d8-17897a18c809",{"path":572,"uuid":573},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-pagecloud","4fd243b5-a442-436b-8980-ec43123c052e",{"path":575,"uuid":576},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-pagecloud","a84f9f8e-e659-4f60-995b-8f5c19786d56",{"path":578,"uuid":579},"\u002Fhelp\u002Fparameters\u002Fcheckout-config-fc-json-config","742e9e8e-ffbb-4595-8658-413220fe8b28",{"path":581,"uuid":582},"\u002Fhelp\u002Fcategories\u002Fcanva","2dfd6ae4-1583-4ac7-8d8d-a8d3583d1b66",{"path":584,"uuid":585},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-fastcomet-sitebuilder","78dcc3e3-e510-464b-84fa-01267bd4aff4",{"path":587,"uuid":588},"\u002Fhelp\u002Fparameters\u002Fcheckout","07851ca5-19a4-47f3-bf18-7c6e8306f1a4",{"path":590,"uuid":591},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-flauntly","9e88502f-2a5d-4420-87ac-22c88f100a4a",{"path":593,"uuid":594},"\u002Fhelp\u002Fcategories\u002Fhighlevel","f92ea2a5-7830-4cb4-9ccb-a38ea8ffd586",{"path":596,"uuid":597},"\u002Fhelp\u002Farticles\u002Fmanage-products-with-webstudio-cms","77c99cc5-e911-4a6a-ba62-a21051239b03",{"path":599,"uuid":600},"\u002Fhelp\u002Fparameters\u002Fcart-config-fc-json-config","d7de03b4-de7a-4c34-920a-d9e8b886cd7d",{"path":602,"uuid":603},"\u002Fhelp\u002Fcategories\u002Fpayments","7093e179-f73f-4533-a5ed-230e211e3724",{"path":605,"uuid":606},"\u002Fhelp\u002Fcategories\u002Fasecurecart","2a7e7241-5e88-46e5-aa3d-692858f0dae9",{"path":608,"uuid":609},"\u002Fhelp\u002Farticles\u002Fmanage-products-with-webflow-cms","942b9388-4ddf-43c8-82e0-16ddcd3595a7",{"path":611,"uuid":612},"\u002Fhelp\u002Fparameters\u002Fcart","3ffd0b17-be7c-439d-a241-ff90569af527",{"path":614,"uuid":615},"\u002Fhelp\u002Fparameters\u002Fexcluding-options","e0eac317-77c7-4856-9839-7d68fe96cfd2",{"path":617,"uuid":618},"\u002Fhelp\u002Fcategories\u002Fshopping-carts","8f44cdf2-729e-4ce4-ba19-9de2997f2250",{"path":113,"uuid":114},{"path":621,"uuid":622},"\u002Fhelp\u002Fcategories\u002Flink-and-form-builder","0961f958-25ee-476a-8ad0-678d5b69ece4",{"path":624,"uuid":625},"\u002Fhelp\u002Fparameters\u002Fcustomer-information-pre-population","7ccd20ea-e893-4da3-a163-f47d5cb6cb4d",{"path":627,"uuid":628},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-site123","24cefb42-de19-436b-a65b-a4672e62d2f8",{"path":630,"uuid":631},"\u002Fhelp\u002Fcategories\u002Fdonation-element","b053e308-0ba6-4461-832c-e866ea89f65c",{"path":633,"uuid":634},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-site123","d512037e-77bd-4473-9dea-ebfc62e53302",{"path":636,"uuid":637},"\u002Fhelp\u002Fparameters\u002Fproduct-option-modifiers","16039a7a-03ba-4ed7-b551-57f9d0fa7f22",{"path":639,"uuid":640},"\u002Fhelp\u002Fparameters\u002Fproduct-discount-syntax","e8f0d929-d327-475e-b5f4-800309a97638",{"path":642,"uuid":643},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-carrd","e31148d5-2a7c-452a-8ff7-4fef7f9a558b",{"path":645,"uuid":646},"\u002Fhelp\u002Fcategories\u002Fwebstudio","10edc9af-832f-42db-8861-0c695dbc609d",{"path":648,"uuid":649},"\u002Fhelp\u002Fcategories\u002Ftemplates-overview","23f58889-7ab0-45fa-9110-a200c64684b5",{"path":651,"uuid":652},"\u002Fhelp\u002Fparameters\u002Fsubscription-parameters","3ac11574-1cf9-46a7-99ca-85d3feb1b8cf",{"path":654,"uuid":655},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-button-in-webflow","6aef4b9b-958d-433c-abab-08b1c6e084a8",{"path":657,"uuid":658},"\u002Fhelp\u002Farticles\u002Fcreate-a-purchase-form-with-webflows-form-builder","b07e5ff9-1954-45e9-99bf-9197b4ed2362",{"path":660,"uuid":661},"\u002Fhelp\u002Fcategories\u002Fweb-receipt","e450ed68-922d-4f94-9980-09a60f0411f5",{"path":663,"uuid":664},"\u002Fhelp\u002Fparameters\u002Fproduct-discount-types","4c149ad9-4ef7-4aa3-88bb-ba7124ef2888",{"path":666,"uuid":667},"\u002Fhelp\u002Farticles\u002Fadd-customer-reviews-to-webflow-cms-products-with-monto","2c73f3cd-1cef-427f-bbc8-32eff2139e5c",{"path":669,"uuid":670},"\u002Fhelp\u002Fcategories\u002Femail-receipt","d0cea977-ce89-46dd-bdf0-e59e50b5d6f0",{"path":672,"uuid":673},"\u002Fhelp\u002Fparameters\u002Fproduct-discount-methods","e9092d92-44ce-4e02-b94d-e0dc97c01e2c",{"path":675,"uuid":676},"\u002Fhelp\u002Fparameters\u002Fproduct-parameters","f89e2414-191b-43ef-bca5-665c6bd9a776",{"path":678,"uuid":679},"\u002Fhelp\u002Fcategories\u002Fgodaddy-website-builder","d9f1304c-e99c-4087-a7e3-c234c64b088c",{"path":681,"uuid":682},"\u002Fhelp\u002Farticles\u002Fcreate-a-foxy-purchase-form-with-jotform","17dbaa8e-d659-4c74-8c8a-1a199f4a4dce",{"path":684,"uuid":685},"\u002Fhelp\u002Farticles\u002Fadd-an-uploadcare-file-upload-field-to-checkout-page","35bc0f8e-603f-4f0b-a7f6-2cfb275921cd",{"path":687,"uuid":688},"\u002Fhelp\u002Fguides\u002Fwebflow-printful-online-store-guide","6a4f634f-6edd-42e2-86a7-a67da20c960b",{"path":690,"uuid":691},"\u002Fhelp\u002Fparameters\u002Ftransaction-options","3e8bf221-d2f9-49d3-9e37-6e298d64e736",{"path":693,"uuid":694},"\u002Fhelp\u002Fcategories\u002Fcheckout","60b73dc2-7635-487c-bd1f-fd7fba18ab4d",{"path":696,"uuid":697},"\u002Fhelp\u002Farticles\u002Fadd-an-uploadcare-file-upload-option-to-product-form","ba6db4a3-2b84-4a5c-beb9-ffa74723c08f",{"path":699,"uuid":700},"\u002Fhelp\u002Fcategories\u002Fpayment-methods","ef18e20b-2ce2-4b8d-a761-2b928d9c62b2",{"path":702,"uuid":703},"\u002Fhelp\u002Farticles\u002Fintegrate-foxy-with-zapier","7813ddb7-d54d-4451-81df-6bbcaa5d0f0d",{"path":705,"uuid":706},"\u002Fhelp\u002Fcategories\u002Fusers","7b7b1e43-97fc-4f5a-9395-b9bae8b9bb73",{"path":708,"uuid":709},"\u002Fhelp\u002Farticles\u002Fintegrating-the-foxy-webhook-with-make","905e2b17-590a-4419-88b8-b2f3c346877f",{"path":711,"uuid":712},"\u002Fhelp\u002Fcategories\u002Ftransactions","8af943be-0d7f-4add-8cde-b9e2495686ae",{"path":714,"uuid":715},"\u002Fhelp\u002Farticles\u002Fan-introduction-to-marketplaces-with-foxy","99a115b7-1797-48a7-9294-b9181d6211ee",{"path":717,"uuid":718},"\u002Fhelp\u002Fcategories\u002Fsite-monitoring","5bbbf5d1-7902-4515-883a-e5fba4a50446",{"path":720,"uuid":721},"\u002Fhelp\u002Farticles\u002Fmanage-product-inventory-with-webflow-cms","d27a301e-e003-4c6a-9f15-de869c8c868f",{"path":723,"uuid":724},"\u002Fhelp\u002Farticles\u002Fvalidate-product-pricing-and-inventory-before-completing-purchases","a56bfe83-fe06-46fa-9731-79cb79b2df9a",{"path":726,"uuid":727},"\u002Fhelp\u002Fcategories\u002Ftesting","d1bf21b8-01dc-4dfa-855c-91e96394c513",{"path":729,"uuid":730},"\u002Fhelp\u002Farticles\u002Fmanage-products-with-webflow-ecommerce","1263e1e0-9ad9-4cf9-ab3f-007ca37d37c1",{"path":732,"uuid":733},"\u002Fhelp\u002Fcategories\u002Ftemplates","d584ea62-7dcd-4152-be82-6ee0fdeb153c",{"path":735,"uuid":736},"\u002Fhelp\u002Farticles\u002Fgetting-started-with-foxy-carrd","cfe5c8e2-1aea-48a4-b1aa-81d8a312b000",{"path":738,"uuid":739},"\u002Fhelp\u002Fcategories\u002Ftaxes","1cc94adb-9972-46de-8012-0b747fec3c12",{"path":741,"uuid":742},"\u002Fhelp\u002Fcategories\u002Fshipping","d92c1375-75ba-48e1-bb02-a3ae35187e0b",{"path":744,"uuid":745},"\u002Fhelp\u002Fcategories\u002Fsecurity-policies","805729bf-0e8a-4d3f-92b4-fcc4c825b83a",{"path":747,"uuid":748},"\u002Fhelp\u002Fcategories\u002Freporting","926a5f61-4c01-4e7c-ba2d-42b7135a9d57",{"path":750,"uuid":751},"\u002Fhelp\u002Fcategories\u002Fsubscriptions","c7d66085-8f6f-4677-ae1b-d4595f6c3c3c",{"path":753,"uuid":754},"\u002Fhelp\u002Fcategories\u002Fdownloadables","7bfe6cb8-f9f3-4b6e-a351-9b30fb75c7e7",{"path":756,"uuid":757},"\u002Fhelp\u002Fcategories\u002Fproducts-overview","bcc7c113-9a0f-4f64-b7b2-ddf0c5912d89",{"path":759,"uuid":760},"\u002Fhelp\u002Fcategories\u002Fproducts","389d5512-29ba-4a93-9cfa-9491d1618f73",{"path":762,"uuid":763},"\u002Fhelp\u002Fcategories\u002Fcustomer-portal","b4ff4108-a4b3-41f7-96cf-7df60b55fff0",{"path":765,"uuid":766},"\u002Fhelp\u002Fcategories\u002Felements","bb85e13e-a675-4233-b77e-ec7015cfad77",{"path":768,"uuid":769},"\u002Fhelp\u002Fcategories\u002Fcustomers","28ceb72a-9aff-4499-a48e-7616f7d17033",{"path":771,"uuid":772},"\u002Fhelp\u002Fcategories\u002Fcoupons-discounts","3399647a-a5ec-4a36-a383-09069b49f04a",{"path":774,"uuid":775},"\u002Fhelp\u002Fcategories\u002Fbilling","5f5b6dbf-8ee7-40a5-b59a-5c7908678309",{"path":777,"uuid":778},"\u002Fhelp\u002Fcategories\u002Fgetting-started","24c4e979-f143-4ea7-abb2-005358b6fdef",{"path":780,"uuid":781},"\u002Fhelp\u002Fcategories\u002Fwebydo","7c580094-32d3-4aff-96c4-c54e8ad5afcf",{"path":783,"uuid":784},"\u002Fhelp\u002Fcategories\u002Fmarketplaces","832a2a81-7474-4d7d-be7c-173cd5cfcbdf",{"path":786,"uuid":787},"\u002Fhelp\u002Fcategories\u002Fweebly","a9c6a9e7-f4c0-4ca8-96ee-fcf975216163",{"path":789,"uuid":790},"\u002Fhelp\u002Fcategories\u002Fspacecraft","87f55075-87f6-427e-863a-d64988391562",{"path":792,"uuid":793},"\u002Fhelp\u002Fcategories\u002Fwix","3f2e5bee-905b-45a2-9f9e-63543b8d56b0",{"path":795,"uuid":796},"\u002Fhelp\u002Fcategories\u002Fautomations","f21af3d2-69e8-441d-8034-a4fd64d16f4b",{"path":798,"uuid":799},"\u002Fhelp\u002Fcategories\u002Fflauntly","3fd2d7f5-4bf7-4eb8-a660-df76c56a9e30",{"path":801,"uuid":802},"\u002Fhelp\u002Fcategories\u002Fsquarespace","0997e280-de93-4683-ad94-6aa8cb2356c1",{"path":804,"uuid":805},"\u002Fhelp\u002Fcategories\u002Fsite123","d99db09a-9650-46c9-8596-a80952841209",{"path":807,"uuid":808},"\u002Fhelp\u002Fcategories\u002Fpagecloud","1591b980-b28a-406b-b268-a052f12d076e",{"path":810,"uuid":811},"\u002Fhelp\u002Fcategories\u002Fleadpages","dc5eb959-c23f-4698-8440-8fa624f0ec94",{"path":813,"uuid":814},"\u002Fhelp\u002Fcategories\u002Ffile-uploads","610c281d-63ef-4676-bdd6-b6e78955e99a",{"path":816,"uuid":817},"\u002Fhelp\u002Fcategories\u002Fzapier","2a6c37b2-60c7-4a3f-880d-a70ce0e87da5",{"path":819,"uuid":820},"\u002Fhelp\u002Fcategories\u002Fuploadcare","a1b9deb5-e9fb-4c43-8521-2906da1721e7",{"path":822,"uuid":823},"\u002Fhelp\u002Fcategories\u002Fmake","93f04a01-67d2-4ee4-b7f2-84611e5bd776",{"path":825,"uuid":826},"\u002Fhelp\u002Fcategories\u002Fjotform","796e63a8-fd73-4dc7-a8a2-112052222ce9",{"path":828,"uuid":829},"\u002Fhelp\u002Fcategories\u002Fzoho-sites","fe781809-b739-4325-8332-41a56c8d4066",{"path":831,"uuid":832},"\u002Fhelp\u002Fcategories\u002Flaunchaco","a5527829-f6b6-41a2-892f-fc3aaa439d48",{"path":834,"uuid":835},"\u002Fhelp\u002Fcategories\u002Finstapage","8d5fce75-7d17-4a1c-af26-428fe0c1afb6",{"path":837,"uuid":838},"\u002Fhelp\u002Fcategories\u002Fhelp-scout","cdac12b3-10a4-4518-bf06-7595bbfb33fb",{"path":840,"uuid":841},"\u002Fhelp\u002Fcategories\u002Ffastcomet-sitebuilder","9f7d08d7-b42d-4fb2-8924-e1164dc157f5",{"path":843,"uuid":844},"\u002Fhelp\u002Fcategories\u002Fclickfunnels","27ad7776-42a6-4f7d-ab4f-f32c6f59a561",{"path":846,"uuid":847},"\u002Fhelp\u002Fcategories\u002Funbounce","07026041-b3ab-4baf-a66f-913b43585af7",{"path":849,"uuid":850},"\u002Fhelp\u002Fcategories\u002Fform-builders","a938ceb3-9d27-43ff-bf5e-5fe4fa056883",{"path":852,"uuid":853},"\u002Fhelp\u002Fcategories\u002Fuskinned","096c587d-ab62-4bf7-ba5f-58f2d1b11c05",{"path":855,"uuid":856},"\u002Fhelp\u002Fcategories\u002Fwebflow","77165c20-6213-4411-b8c9-0bc9a9186c82",{"path":858,"uuid":859},"\u002Fhelp\u002Fcategories\u002Fcarrd","d9c167fd-b386-477d-a749-07fbc9f39a13",{"path":861,"uuid":862},"\u002Fhelp\u002Fcategories\u002Fcms-website-builders","d642ff72-7262-4abd-b182-29730fbd0096",{"path":864,"uuid":865},"\u002Fhelp\u002Fcategories\u002Fintegrations","3dd64bd5-9f7a-4369-9b40-71880010c1ca",{"path":867,"uuid":868},"\u002Fhelp\u002Fcategories","4c0a2d99-ec30-4579-8ef1-6bf5564d4839",{"path":870},"\u002Fchangelogs\u002F2",{"path":872},"\u002Fchangelogs\u002F3",{"path":874},"\u002Fchangelogs\u002F4",{"path":876},"\u002Fchangelogs\u002F5",{"path":878},"\u002Fchangelogs\u002F6",{"path":880},"\u002Fchangelogs\u002F7",{"path":882},"\u002Fchangelogs\u002F8",{"path":884},"\u002Fchangelogs\u002F9",{"path":886},"\u002Fchangelogs\u002F10",{"path":888},"\u002Fchangelogs\u002F11",{"path":890},"\u002Fchangelogs\u002F12",{"path":892},"\u002Fchangelogs\u002F13",{"path":894},"\u002Fchangelogs\u002F14",{"path":896},"\u002Fchangelogs\u002F15",{"path":898},"\u002Fchangelogs\u002F16",{"path":900},"\u002Fchangelogs\u002F17",{"path":902},"\u002Fchangelogs\u002F18",{"path":904},"\u002Fchangelogs\u002F19",{"path":906},"\u002Fchangelogs\u002F20",{"path":908},"\u002Fchangelogs\u002F21",{"path":910},"\u002Fchangelogs\u002F22",{"path":912},"\u002Fchangelogs\u002F23",{"path":914},"\u002Fchangelogs\u002F24",{"path":916},"\u002Fchangelogs\u002F25",{"path":918},"\u002Fchangelogs\u002F26",{"path":920},"\u002Fchangelogs\u002F27",{"path":922},"\u002Fchangelogs\u002F28",{"path":924},"\u002Fchangelogs\u002F29",{"path":926},"\u002Fchangelogs\u002F30",{"path":928},"\u002Fchangelogs\u002F31",{"path":930},"\u002Fchangelogs\u002F32",{"path":932},"\u002Fchangelogs\u002F33",{"path":934,"uuid":935},"\u002Fintegrations\u002Fhumblytics","a6173465-4bb5-42eb-ac9d-6ff820ed8d63",{"path":937,"uuid":938},"\u002Fintegrations\u002Fgmail","7b8fcc0b-5b5d-4f74-9a67-8136e1010953",{"path":940,"uuid":941},"\u002Fintegrations\u002Fpostgresql","c5fb983d-9110-466b-8fa8-d912b1e40f66",{"path":943,"uuid":944},"\u002Fintegrations\u002Fmysql","141a2b04-637f-4922-8a07-587159a9c1bd",{"path":946,"uuid":947},"\u002Fintegrations\u002Fprintful","8dba8906-23b4-43f8-abb3-b563eb78b205",{"path":949,"uuid":950},"\u002Fintegrations\u002Fmailerlite","3891e7d8-ade3-4363-8ffb-517e7a3aee0a",{"path":952,"uuid":953},"\u002Fintegrations\u002Fhubspot","319c79ca-31b3-4861-aa74-ccffc2126386",{"path":955,"uuid":956},"\u002Fintegrations\u002Fgoogle-sheets","b67c145e-ea55-41a5-ab21-fc94eb2c395c",{"path":958,"uuid":959},"\u002Fintegrations\u002Fpipedrive","c48ae577-ec4e-4f16-b435-85a01b081974",{"path":961,"uuid":962},"\u002Fintegrations\u002Factivecampaign","7dbbaaf2-dc72-46c9-9fb1-525f00b9ee9b",{"path":964,"uuid":965},"\u002Fintegrations\u002Fpackagebee","e97bf162-5bc1-4cfd-8c5e-9d6371522de5",{"path":967,"uuid":968},"\u002Fintegrations\u002Fdrip","5713ffaa-26e6-4d37-98a4-c1ae5541f5b7",{"path":970,"uuid":971},"\u002Fintegrations\u002Fwordpress","347af825-5fcf-4e53-96f2-8851eb6b1ede",{"path":973,"uuid":974},"\u002Fintegrations\u002Fverticalresponse","c887b5e9-a1de-4afc-b5e9-16f8376c06cd",{"path":976,"uuid":977},"\u002Fintegrations\u002Fveracore","67385d5d-d72d-4540-b99f-6d2448c7c87c",{"path":979,"uuid":980},"\u002Fintegrations\u002Fumbraco-uskinned","101b1818-40b0-40af-b6ad-148996302512",{"path":982,"uuid":983},"\u002Fintegrations\u002Fbyteline-sync","660de31b-59ee-4dc1-980b-99056c5c7e4e",{"path":985,"uuid":986},"\u002Fintegrations\u002Fthomson-reuters-onesource","205f8d52-e081-46f8-abdb-c90545e5e2eb",{"path":988,"uuid":989},"\u002Fintegrations\u002Ftaxjar","d31c33a8-67d9-429f-a9d9-ac7afecc5565",{"path":991,"uuid":992},"\u002Fintegrations\u002Fstarshipit","e0b4b006-9b24-466c-905d-07103a799049",{"path":994,"uuid":995},"\u002Fintegrations\u002Fstamps-com","2d3d52ea-0631-4907-9045-e0396651a80f",{"path":997,"uuid":998},"\u002Fintegrations\u002Fshipworks","0e6e72a5-64f6-40f8-ac77-84dc8b502817",{"path":1000,"uuid":1001},"\u002Fintegrations\u002Fshipwire","640cf737-b05e-408a-83aa-179cdaba3590",{"path":1003,"uuid":1004},"\u002Fintegrations\u002Frejoiner","09a51830-4f64-496b-a157-8e9ae6087824",{"path":1006,"uuid":1007},"\u002Fintegrations\u002Fshippo-fulfillment","3a01e1d2-fa15-476c-b862-f2ffccd1f7d5",{"path":1009,"uuid":1010},"\u002Fintegrations\u002Fshippo-live-rates","d404f856-1089-4f93-a67c-6f62cab68689",{"path":1012,"uuid":1013},"\u002Fintegrations\u002Fred-stag-fulfillment","7716789e-843c-4503-9864-35ea659eafbf",{"path":1015,"uuid":1016},"\u002Fintegrations\u002Fpost-affiliate-pro","f9f62f30-2d5e-4fb7-ad52-46b2a4fd7fa5",{"path":1018,"uuid":1019},"\u002Fintegrations\u002Fosi-affiliate","04e4ab28-5fab-4673-b246-688fc53a8c3e",{"path":1021,"uuid":1022},"\u002Fintegrations\u002Fidevaffiliate","ed6cc6f4-c32e-4562-8a0d-644b5f4b38bb",{"path":1024,"uuid":1025},"\u002Fintegrations\u002Ficontact","3e1adba3-f575-4924-a7dc-67b85f705872",{"path":1027,"uuid":1028},"\u002Fintegrations\u002Fcraft-cms","787b01af-261d-4e7b-a1ec-1854d220d4bb",{"path":1030,"uuid":1031},"\u002Fintegrations\u002Fshipstation-fulfillment","e5f31cb6-2ce3-42f8-b0a0-cf6b2c0d5b25",{"path":1033,"uuid":1034},"\u002Fintegrations\u002Fquickbooks","d0460023-bfa4-4066-ab2f-85aa43c42ec9",{"path":1036,"uuid":1037},"\u002Fintegrations\u002Forder-desk","4f7e3e2a-460c-45cc-a608-481667f6cda5",{"path":1039,"uuid":1040},"\u002Fintegrations\u002Fhelp-scout","1b46a426-eadb-4044-b3c9-891c05788f6f",{"path":1042,"uuid":1043},"\u002Fintegrations\u002Ffulfillrite","686159a4-cca2-41e1-aec0-f1a2551e9866",{"path":1045,"uuid":1046},"\u002Fintegrations\u002Ffulfillment-by-amazon-fba","0c0f4f2f-b995-47f5-98c4-fa3f7a3b274d",{"path":1048,"uuid":1049},"\u002Fintegrations\u002Ffraudlabs-pro","2ebb68a2-3a5c-4d54-ad20-62d87e65ed06",{"path":1051,"uuid":1052},"\u002Fintegrations\u002Ffetchapp","55735481-8a88-4e20-af80-83112e9613a8",{"path":1054,"uuid":1055},"\u002Fintegrations\u002Fendicia","c6c034ec-060d-4cff-9ffc-875934173446",{"path":1057,"uuid":1058},"\u002Fintegrations\u002Fslack","05d77306-3e26-49a9-aea1-b7c25b6615f5",{"path":1060,"uuid":1061},"\u002Fintegrations\u002Fairtable","03d2b479-7f08-4f6a-94f1-7f893e0cf7a5",{"path":1063,"uuid":1064},"\u002Fintegrations\u002Fsalesforce","1449a312-6dce-490b-b3bb-90604d758adb",{"path":1066,"uuid":1067},"\u002Fintegrations\u002Fmailchimp","0c7fb93e-c1af-4372-86a5-576dd8fbfbef",{"path":1069,"uuid":1070},"\u002Fintegrations\u002Fsendy","142be3bb-7dbc-4286-be5e-dc855473406a",{"path":1072,"uuid":1073},"\u002Fintegrations\u002Fmonto-affiliates","7bb16d05-de7f-4ea0-a30c-c73e53302c43",{"path":1075,"uuid":1076},"\u002Fintegrations\u002Fmonto","30f9454b-7edc-4c4e-a2d6-f7b9cfb7bb87",{"path":1078,"uuid":1079},"\u002Fintegrations\u002Fmonto-abandoned-cart-recovery","25aca4b7-bdba-44dd-bf0f-e21d46c16b29",{"path":1081,"uuid":1082},"\u002Fintegrations\u002Fmonto-crm","97d1d4be-562d-4a7d-a043-82bcc651b7ad",{"path":1084,"uuid":1085},"\u002Fintegrations\u002Fmonto-customer-portal","ede6256f-d297-4734-8b56-3f15593dbfef",{"path":1087,"uuid":1088},"\u002Fintegrations\u002Fmonto-loyalty-rewards-referrals","62c6f95b-dee8-45c6-9f57-71e4084aba08",{"path":1090,"uuid":1091},"\u002Fintegrations\u002Fmonto-reviews","bc46fc5d-38fa-4ed2-a7bb-a0d2c9249e42",{"path":1093,"uuid":1094},"\u002Fintegrations\u002Fmonto-social-proof","868c126c-69ed-495c-b4ad-a59bb1320d41",{"path":1096,"uuid":1097},"\u002Fintegrations\u002Feasypost","9452814e-53ab-4eca-b73c-36772de2c7fe",{"path":1099,"uuid":1100},"\u002Fintegrations\u002Fefulfillment-service","19ffd96c-4f8d-4587-b7c9-d6c5078e7686",{"path":1102,"uuid":1103},"\u002Fintegrations\u002Ffetchify","9e5ca12b-4df0-42a5-b3a8-178509267d25",{"path":1105,"uuid":1106},"\u002Fintegrations\u002Fcartstack","6f020e81-a9c6-462b-b5f3-62350ba0f566",{"path":1108,"uuid":1109},"\u002Fintegrations\u002Fzapier","040931d6-928d-493e-989c-0cf02d3e01b2",{"path":1111,"uuid":1112},"\u002Fintegrations\u002Fpipedream","cda9ef0d-04cb-4eea-98f6-2669418bc914",{"path":1114,"uuid":1115},"\u002Fintegrations\u002Fmake","7c8614f2-4e24-4e29-8782-fe24914e3edc",{"path":1117,"uuid":1118},"\u002Fintegrations\u002Fhighlevel","0f692f95-743e-483e-888f-b18ca0055b82",{"path":1120,"uuid":1121},"\u002Fintegrations\u002Fgodaddy","103a92e9-1cfd-4f90-9a98-d37db419eef0",{"path":1123,"uuid":1124},"\u002Fintegrations\u002Fwebstudio","27048cf1-66ef-49fc-9c14-3671d2c98d2b",{"path":1126,"uuid":1127},"\u002Fintegrations\u002Fdivhunt","e365977e-ac72-4486-a161-1ff8ddd6146e",{"path":1129,"uuid":1130},"\u002Fintegrations\u002Fframer","79e18c54-38a6-4967-9314-1f22f623a50b",{"path":1132,"uuid":1133},"\u002Fintegrations\u002Flovable","3503537f-7380-4c77-bc51-a952851f6d64",{"path":1135,"uuid":1136},"\u002Fintegrations\u002Fzoho-sites","77ef856e-e28e-4d98-81f0-edbb6af18542",{"path":1138,"uuid":1139},"\u002Fintegrations\u002Fpagecloud","38be4e23-f2c5-4af0-832d-db9ed2476927",{"path":1141,"uuid":1142},"\u002Fintegrations\u002Fleadpages","df2f204a-312a-44f7-b3ee-2f62923bfa9d",{"path":1144,"uuid":1145},"\u002Fintegrations\u002Finstapage","6f39260c-6981-4f89-bcc6-c11f9452709c",{"path":1147,"uuid":1148},"\u002Fintegrations\u002Fsite123","a3a52cf2-0cf6-4418-8403-d2119eb27342",{"path":1150,"uuid":1151},"\u002Fintegrations\u002Fsquarespace","9a587f81-36a3-401f-a229-815949db9e6a",{"path":1153,"uuid":1154},"\u002Fintegrations\u002Fclickfunnels","597dc58d-9d42-4d5b-ad4d-2ee27cadd68c",{"path":1156,"uuid":1157},"\u002Fintegrations\u002Fcarrd","d259fc46-f7dd-4f22-8455-154145b34b0e",{"path":1159,"uuid":1160},"\u002Fintegrations\u002Funbounce","452da30e-3a1c-45cc-a194-a3f80725e3b9",{"path":1162,"uuid":1163},"\u002Fintegrations\u002Fwebydo","9b6fd2fe-143d-4096-bba5-ef1758b8c4fe",{"path":1165,"uuid":1166},"\u002Fintegrations\u002Fweebly","29a5fbdb-7ce3-4bfd-9463-264b1a131f5c",{"path":1168,"uuid":1169},"\u002Fintegrations\u002Fwix","927f0f0e-b013-4f1d-9646-f74645d2a976",{"path":1171,"uuid":1172},"\u002Fintegrations\u002Fcampaign-monitor","9a27107a-7022-4a4b-947a-6b75d418c135",{"path":1174,"uuid":1175},"\u002Fintegrations\u002Femma","936367ef-0561-4920-b656-8c96fcc2c7ca",{"path":1177,"uuid":1178},"\u002Fintegrations\u002Fconstant-contact","10a3127d-8c21-49dd-8c20-0617db04ab20",{"path":1180,"uuid":1181},"\u002Fintegrations\u002Fextensiv","38dd219e-05f2-45be-bf38-6f380df96f57",{"path":1183,"uuid":1184},"\u002Fintegrations\u002Faweber","49b603c8-7312-4ffe-89d5-97ca727c547d",{"path":1186,"uuid":1187},"\u002Fintegrations\u002Fconvertkit","cf3ca418-ca64-4826-bd71-5873ef1dc489",{"path":1189,"uuid":1190},"\u002Fintegrations\u002Famazon-web-services","93155414-ab2f-49da-b2bd-f336252ae237",{"path":1192,"uuid":1193},"\u002Fintegrations\u002Fdrupal","d6c9a3fa-ab76-450d-8cb7-f86abc198b79",{"path":1195,"uuid":1196},"\u002Fintegrations\u002Fgoogle-analytics","1a156476-25c1-4843-9ef0-ac3958988f69",{"path":1198,"uuid":1199},"\u002Fintegrations\u002Favalara-avatax","74cf0c58-9499-4b53-a1af-0d8372e155e3",{"path":1201,"uuid":1202},"\u002Fintegrations\u002Freferralcandy","3383e7a9-0226-4deb-9512-daee85811159",{"path":1204,"uuid":1205},"\u002Fintegrations\u002Fwebflow","cd7c7e90-42be-4a1c-ad1b-70c28dbb866f",{"path":1207,"uuid":1208},"\u002Fpayment-methods\u002Fpawapay","4be10b92-1353-4bf0-8e78-5caabfc96a0a",{"path":1210,"uuid":1208,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpawapay","help",{"path":1213,"uuid":1214},"\u002Fpayment-methods\u002Fwallee","823238a5-70c6-4942-a113-81caccc4d550",{"path":1216,"uuid":1214,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fwallee",{"path":1218,"uuid":1219},"\u002Fpayment-methods\u002Ftwint","397b53cf-413c-4a63-9f14-ff539a6803f5",{"path":1221,"uuid":1219,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ftwint",{"path":1223,"uuid":1224},"\u002Fpayment-methods\u002Faccept-blue","568db468-bb06-4541-8490-8db9663a4487",{"path":1226,"uuid":1224,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Faccept-blue",{"path":1228,"uuid":1229},"\u002Fpayment-methods\u002Fbank-of-america","8bc9cb97-897c-4a5d-bfe9-e87385f1a790",{"path":1231,"uuid":1229,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fbank-of-america",{"path":1233,"uuid":1234},"\u002Fpayment-methods\u002Fvenmo","8d2412f1-c3ab-4592-83b6-89d9ad036d7a",{"path":1236,"uuid":1234,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fvenmo",{"path":1238,"uuid":1239},"\u002Fpayment-methods\u002Ftasker-payment-gateways","3fef9fd9-37e0-469c-a491-d952ac6626ee",{"path":1241,"uuid":1239,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ftasker-payment-gateways",{"path":1243,"uuid":1244},"\u002Fpayment-methods\u002Falternative-horizons-group","c7ad9b4d-e65b-4c9f-aff7-8a5cbf75a3fa",{"path":1246,"uuid":1244,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Falternative-horizons-group",{"path":1248,"uuid":1249},"\u002Fpayment-methods\u002Fpaykings","c8bb3eaa-39cc-4a15-83d1-f10d0f75f7db",{"path":1251,"uuid":1249,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaykings",{"path":1253,"uuid":1254},"\u002Fpayment-methods\u002Fstitch-express","9ef8db50-b9b9-4d25-80b7-5a653c7e2cad",{"path":1256,"uuid":1254,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fstitch-express",{"path":1258,"uuid":1259},"\u002Fpayment-methods\u002Fpurchase-orders","d349f336-1a16-4fee-9f6a-8fd3ca7f196f",{"path":1261,"uuid":1259,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpurchase-orders",{"path":1263,"uuid":1264},"\u002Fpayment-methods\u002Fpaypal-plus","28d70eb5-7c88-48ab-97e9-ec35f9478179",{"path":1266,"uuid":1264,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaypal-plus",{"path":1268,"uuid":1269},"\u002Fpayment-methods\u002Fpaypal-payments-pro","0958520c-5431-4aee-87b5-8739f358d505",{"path":1271,"uuid":1269,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaypal-payments-pro",{"path":1273,"uuid":1274},"\u002Fpayment-methods\u002Fpaypal-payflow-pro","a14cf1a3-9ebd-4dce-b59c-e3ac9264f24e",{"path":1276,"uuid":1274,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaypal-payflow-pro",{"path":1278,"uuid":1279},"\u002Fpayment-methods\u002Fpaypal-micropayments","0ca080c9-570e-4bbb-bd7f-03a1c05235b5",{"path":1281,"uuid":1279,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaypal-micropayments",{"path":1283,"uuid":1284},"\u002Fpayment-methods\u002Fpaypal-express-checkout","60fe4c8a-8ca2-49de-ad33-16c38cf29e5d",{"path":1286,"uuid":1284,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaypal-express-checkout",{"path":1288,"uuid":1289},"\u002Fpayment-methods\u002Fintuit-quickbooks-payments","d7d187a3-6371-48e0-b36a-ddce46adc1b8",{"path":1291,"uuid":1289,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fintuit-quickbooks-payments",{"path":1293,"uuid":1294},"\u002Fpayment-methods\u002Ftotal-apps","5bc53482-bad4-48d3-b47a-ac61403d8902",{"path":1296,"uuid":1294,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ftotal-apps",{"path":1298,"uuid":1299},"\u002Fpayment-methods\u002Fplug-n-pay-smartscreen","8a6973a5-a009-48e2-a0b4-b9a101f206d9",{"path":1301,"uuid":1299,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fplug-n-pay-smartscreen",{"path":1303,"uuid":1304},"\u002Fpayment-methods\u002Fworldpay-b2b-paymetric","4bfd1840-ee0f-4512-bbed-b821486c4a73",{"path":1306,"uuid":1304,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fworldpay-b2b-paymetric",{"path":1308,"uuid":1309},"\u002Fpayment-methods\u002Fzage","fe3d187f-65d0-4150-8af7-ae78a4d59219",{"path":1311,"uuid":1309,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fzage",{"path":1313,"uuid":1314},"\u002Fpayment-methods\u002Fyuupay","c9fad5c8-380d-4e27-a65b-25f4e616b5ef",{"path":1316,"uuid":1314,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fyuupay",{"path":1318,"uuid":1319},"\u002Fpayment-methods\u002Fxendit","93832a2c-8df1-4ce0-b450-1939dd80b7ab",{"path":1321,"uuid":1319,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fxendit",{"path":1323,"uuid":1324},"\u002Fpayment-methods\u002Fworldpay-online","50971c2b-1d1b-4312-b7c0-fa04f9e80a01",{"path":1326,"uuid":1324,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fworldpay-online",{"path":1328,"uuid":1329},"\u002Fpayment-methods\u002Fworldpay","acf02427-3bad-4276-a62e-ea0070e1388a",{"path":1331,"uuid":1329,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fworldpay",{"path":1333,"uuid":1334},"\u002Fpayment-methods\u002Fwestpac-payway","07b985b7-6bc6-43e0-85c7-39197a623008",{"path":1336,"uuid":1334,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fwestpac-payway",{"path":1338,"uuid":1339},"\u002Fpayment-methods\u002Fviva-wallet","05e63b58-7de2-4edd-96c9-9f74f101a8fb",{"path":1341,"uuid":1339,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fviva-wallet",{"path":1343,"uuid":1344},"\u002Fpayment-methods\u002Fconverge-elavon","732de00d-3632-4a65-a5c1-a556f03445bd",{"path":1346,"uuid":1344,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fconverge-elavon",{"path":1348,"uuid":1349},"\u002Fpayment-methods\u002Fvanco","2a9c6d92-45f8-472a-96d3-f10551c5b3dd",{"path":1351,"uuid":1349,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fvanco",{"path":1353,"uuid":1354},"\u002Fpayment-methods\u002Fusa-epay","262120cd-0f4e-4ab7-b435-703143609765",{"path":1356,"uuid":1354,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fusa-epay",{"path":1358,"uuid":1359},"\u002Fpayment-methods\u002Ftrustcommerce","8f1a281a-4f03-42fe-afe2-56772a1b56b5",{"path":1361,"uuid":1359,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ftrustcommerce",{"path":1363,"uuid":1364},"\u002Fpayment-methods\u002Ftrust-payments","5a8d5c55-9ba4-4f66-97a7-b029df9d2020",{"path":1366,"uuid":1364,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ftrust-payments",{"path":1368,"uuid":1369},"\u002Fpayment-methods\u002Ftransfirst-transaction-express","6a6fcade-4cfe-400d-a1f0-7ef6f74a915c",{"path":1371,"uuid":1369,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ftransfirst-transaction-express",{"path":1373,"uuid":1374},"\u002Fpayment-methods\u002Ftransaction-central-by-transfirst","b934ed42-d4fb-40d7-bbaa-b9c75df35f93",{"path":1376,"uuid":1374,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ftransaction-central-by-transfirst",{"path":1378,"uuid":1379},"\u002Fpayment-methods\u002Fsquare-platform","72f30a69-97e7-4f36-8209-27ffe54c3e08",{"path":1381,"uuid":1379,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fsquare-platform",{"path":1383,"uuid":1384},"\u002Fpayment-methods\u002Fskrill","bc103daf-58ea-4425-b299-4f06a2fadbf6",{"path":1386,"uuid":1384,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fskrill",{"path":1388,"uuid":1389},"\u002Fpayment-methods\u002Fsezzle","4078d95a-1015-4c5e-9084-050ed27b1edb",{"path":1391,"uuid":1389,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fsezzle",{"path":1393,"uuid":1394},"\u002Fpayment-methods\u002Frealex","8f4419ae-2e26-4ee9-9db9-d1f6c9ecb29f",{"path":1396,"uuid":1394,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Frealex",{"path":1398,"uuid":1399},"\u002Fpayment-methods\u002Fquantum-gateway-cdg-commerce","6161ef31-74a7-4c15-8a50-d5f241501d1e",{"path":1401,"uuid":1399,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fquantum-gateway-cdg-commerce",{"path":1403,"uuid":1404},"\u002Fpayment-methods\u002Fpsigate","0b556ad6-34cf-4229-bf5b-0ba36e64d8f6",{"path":1406,"uuid":1404,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpsigate",{"path":1408,"uuid":1409},"\u002Fpayment-methods\u002Fplug-n-pay","35932884-dace-45dc-aea1-b6f35af67f22",{"path":1411,"uuid":1409,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fplug-n-pay",{"path":1413,"uuid":1414},"\u002Fpayment-methods\u002Fpesapal","c471520d-b5eb-4d11-8618-aa47a813109d",{"path":1416,"uuid":1414,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpesapal",{"path":1418,"uuid":1419},"\u002Fpayment-methods\u002Fpayvector","cf71ea91-4b91-4596-838b-0b08494bb617",{"path":1421,"uuid":1419,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpayvector",{"path":1423,"uuid":1424},"\u002Fpayment-methods\u002Fpayu","b2fc34c6-cf17-4434-b74d-de8461197b2e",{"path":1426,"uuid":1424,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpayu",{"path":1428,"uuid":1429},"\u002Fpayment-methods\u002Fpaytrace","c3b5c92b-f9fb-4784-b513-eb60ea2f9b1c",{"path":1431,"uuid":1429,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaytrace",{"path":1433,"uuid":1434},"\u002Fpayment-methods\u002Fpaypal-complete-payments","dd6cc5f6-c8b1-4eca-a24c-03e4559b4360",{"path":1436,"uuid":1434,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaypal-complete-payments",{"path":1438,"uuid":1439},"\u002Fpayment-methods\u002Fpaymentsense","ad7b7e1b-d780-4493-87d8-49ec4fec315c",{"path":1441,"uuid":1439,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaymentsense",{"path":1443,"uuid":1444},"\u002Fpayment-methods\u002Fwindcave-pxpost","c1d686d4-49cc-48e6-bb5d-43bcfa7eaba1",{"path":1446,"uuid":1444,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fwindcave-pxpost",{"path":1448,"uuid":1449},"\u002Fpayment-methods\u002Fwindcave-web-service","06a0fc37-4181-4408-9537-66bd771547b8",{"path":1451,"uuid":1449,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fwindcave-web-service",{"path":1453,"uuid":1454},"\u002Fpayment-methods\u002Fpayline","5a8fc6e4-6de0-4d41-b31c-48ac01498fa5",{"path":1456,"uuid":1454,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpayline",{"path":1458,"uuid":1459},"\u002Fpayment-methods\u002Fpayleap","2aee0358-5d30-49d8-9a0e-f2c499c30dc5",{"path":1461,"uuid":1459,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpayleap",{"path":1463,"uuid":1464},"\u002Fpayment-methods\u002Fpayjunction","a2866753-56e4-4d7a-87ea-0c78af9c9711",{"path":1466,"uuid":1464,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpayjunction",{"path":1468,"uuid":1469},"\u002Fpayment-methods\u002Fpaygate","d49106be-e0bf-4508-8abd-c6357a4768bd",{"path":1471,"uuid":1469,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaygate",{"path":1473,"uuid":1474},"\u002Fpayment-methods\u002Fpayconex","86b34a75-e034-4e27-9676-82395f02434d",{"path":1476,"uuid":1474,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpayconex",{"path":1478,"uuid":1479},"\u002Fpayment-methods\u002Fpaya","58d0c56d-03ab-4b6c-b9da-2cbdde897f07",{"path":1481,"uuid":1479,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaya",{"path":1483,"uuid":1484},"\u002Fpayment-methods\u002Fpay360","f93aee2a-ff1a-43a3-9d9e-5a385b1159d3",{"path":1486,"uuid":1484,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpay360",{"path":1488,"uuid":1489},"\u002Fpayment-methods\u002Fpaperless","d8b999ca-c200-4632-bd8e-851c1d613669",{"path":1491,"uuid":1489,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaperless",{"path":1493,"uuid":1494},"\u002Fpayment-methods\u002Fopayo","5cd15dac-6549-4336-a194-56ccc19dfb22",{"path":1496,"uuid":1494,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fopayo",{"path":1498,"uuid":1499},"\u002Fpayment-methods\u002Fnmi","d73675c3-2e24-45d6-90ee-78eb6c2e9b7f",{"path":1501,"uuid":1499,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fnmi",{"path":1503,"uuid":1504},"\u002Fpayment-methods\u002Fnetbilling","245cbdd0-92b6-4e67-82cf-73bf0a8a8acb",{"path":1506,"uuid":1504,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fnetbilling",{"path":1508,"uuid":1509},"\u002Fpayment-methods\u002Fmoneris","6b103576-f97a-491c-a889-7e525658395d",{"path":1511,"uuid":1509,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fmoneris",{"path":1513,"uuid":1514},"\u002Fpayment-methods\u002Fmollie","9ea7dbad-2201-445d-a8f7-bc65d1a4cfea",{"path":1516,"uuid":1514,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fmollie",{"path":1518,"uuid":1519},"\u002Fpayment-methods\u002Fmastercard-gateway","a36d0afc-cddb-4bc9-ac3a-030ca46345e2",{"path":1521,"uuid":1519,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fmastercard-gateway",{"path":1523,"uuid":1524},"\u002Fpayment-methods\u002Fmerchant-accounts-ca","2b018946-bab2-4565-9170-42be0b5364c7",{"path":1526,"uuid":1524,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fmerchant-accounts-ca",{"path":1528,"uuid":1529},"\u002Fpayment-methods\u002Fmercado-pago","0eb0a290-1b61-4d70-b456-d521c6ae53f5",{"path":1531,"uuid":1529,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fmercado-pago",{"path":1533,"uuid":1534},"\u002Fpayment-methods\u002Fcynergydata-lucy-gateway","f68868cf-dc92-493c-8250-1d3bec4e8edd",{"path":1536,"uuid":1534,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcynergydata-lucy-gateway",{"path":1538,"uuid":1539},"\u002Fpayment-methods\u002Fklarna","1ffbb4b7-45e4-41bb-9a94-045a2cd41f2e",{"path":1541,"uuid":1539,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fklarna",{"path":1543,"uuid":1544},"\u002Fpayment-methods\u002Finspire-commerce","7fc9bd58-1c88-4f9f-87ce-a49f019d6088",{"path":1546,"uuid":1544,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Finspire-commerce",{"path":1548,"uuid":1549},"\u002Fpayment-methods\u002Fideal","bb7e342d-ab05-4fe9-a1c6-82d8f62d5df4",{"path":1551,"uuid":1549,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fideal",{"path":1553,"uuid":1554},"\u002Fpayment-methods\u002Fhelcim","e8ba5919-bed2-4fec-ac38-76e8f88499a3",{"path":1556,"uuid":1554,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fhelcim",{"path":1558,"uuid":1559},"\u002Fpayment-methods\u002Fgoemerchant","2f0af120-c03d-4f13-b8ec-c8ebdbb9da02",{"path":1561,"uuid":1559,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fgoemerchant",{"path":1563,"uuid":1564},"\u002Fpayment-methods\u002Fglobal-payments","43c7c690-cdb0-43aa-9785-da0f4d0b028f",{"path":1566,"uuid":1564,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fglobal-payments",{"path":1568,"uuid":1569},"\u002Fpayment-methods\u002Ffosdick","883c959e-eb16-4a7c-94c7-6f55e33ea67a",{"path":1571,"uuid":1569,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ffosdick",{"path":1573,"uuid":1574},"\u002Fpayment-methods\u002Fpayeezy","16e1f81a-6bc3-4f99-a723-a179344102d0",{"path":1576,"uuid":1574,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpayeezy",{"path":1578,"uuid":1579},"\u002Fpayment-methods\u002Ffirst-data-global-gateway","a3f4b3bf-f3a6-46f2-8b2b-68c0b37f4b6f",{"path":1581,"uuid":1579,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ffirst-data-global-gateway",{"path":1583,"uuid":1584},"\u002Fpayment-methods\u002Ffat-zebra","e435cdfa-b450-4802-8750-dd4f413ae7e5",{"path":1586,"uuid":1584,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ffat-zebra",{"path":1588,"uuid":1589},"\u002Fpayment-methods\u002Feway","ab81bfce-a22e-4445-a55d-e3afc47d6ba0",{"path":1591,"uuid":1589,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Feway",{"path":1593,"uuid":1594},"\u002Fpayment-methods\u002Feprocessingnetwork","1d660865-8f20-4aa7-8e92-8d09802d77da",{"path":1596,"uuid":1594,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Feprocessingnetwork",{"path":1598,"uuid":1599},"\u002Fpayment-methods\u002Fems-pay","697425b1-c0c6-4c42-972c-7d6cc50d31e5",{"path":1601,"uuid":1599,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fems-pay",{"path":1603,"uuid":1604},"\u002Fpayment-methods\u002Fdwolla","76228181-5036-4b6e-bb1b-aa12cc8f7b36",{"path":1606,"uuid":1604,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fdwolla",{"path":1608,"uuid":1609},"\u002Fpayment-methods\u002Fdurango","ddf48264-b40e-49a5-a2ea-e782454d6cdf",{"path":1611,"uuid":1609,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fdurango",{"path":1613,"uuid":1614},"\u002Fpayment-methods\u002Fdigital-river","abdbfbc9-f432-41e4-96de-18470b9f2e0d",{"path":1616,"uuid":1614,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fdigital-river",{"path":1618,"uuid":1619},"\u002Fpayment-methods\u002Fdibs","fcc6ea50-a189-42a4-8f00-c90fa90e90e6",{"path":1621,"uuid":1619,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fdibs",{"path":1623,"uuid":1624},"\u002Fpayment-methods\u002Fdatacash","467a1aed-8ae0-4404-a58f-16a2f8f864e0",{"path":1626,"uuid":1624,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fdatacash",{"path":1628,"uuid":1629},"\u002Fpayment-methods\u002Fcybersource-secure-acceptance-web-mobile","eaf7bda0-cc83-4944-b38b-9e9f42677cdf",{"path":1631,"uuid":1629,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcybersource-secure-acceptance-web-mobile",{"path":1633,"uuid":1634},"\u002Fpayment-methods\u002Fcybersource-magnetic-stripe-swiper","2731c9db-833a-45eb-8711-25aa8f3f0ca3",{"path":1636,"uuid":1634,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcybersource-magnetic-stripe-swiper",{"path":1638,"uuid":1639},"\u002Fpayment-methods\u002Fcybersource","906a031f-c895-4d22-aec8-780fc517b1b6",{"path":1641,"uuid":1639,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcybersource",{"path":1643,"uuid":1644},"\u002Fpayment-methods\u002Fcommweb","250d562a-61b1-4644-a2b2-e2fb0e30ea44",{"path":1646,"uuid":1644,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcommweb",{"path":1648,"uuid":1649},"\u002Fpayment-methods\u002Fcomgate","45b3a169-7f2f-4bfd-8666-6143b9fd9832",{"path":1651,"uuid":1649,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcomgate",{"path":1653,"uuid":1654},"\u002Fpayment-methods\u002Fcoinbase","390eeff8-e3f6-45d6-b141-7fdf3b0281eb",{"path":1656,"uuid":1654,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcoinbase",{"path":1658,"uuid":1659},"\u002Fpayment-methods\u002Fcielo-payments-merchant-e-solutions","7523556a-8fc7-48e2-9174-e3c47e4a97f0",{"path":1661,"uuid":1659,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcielo-payments-merchant-e-solutions",{"path":1663,"uuid":1664},"\u002Fpayment-methods\u002Fcheckout-com","31847d59-f8e5-4c12-b84d-d103832b10e6",{"path":1666,"uuid":1664,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcheckout-com",{"path":1668,"uuid":1669},"\u002Fpayment-methods\u002Fchase-paymentech-orbital-tampa-tandem","d99d1d53-1e95-42f7-bb26-a8131df7d2a5",{"path":1671,"uuid":1669,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fchase-paymentech-orbital-tampa-tandem",{"path":1673,"uuid":1674},"\u002Fpayment-methods\u002Fchase-paymentech-orbital-salem-stratus","ad2d86ad-42e6-4c30-a966-2c4ab0a0f31e",{"path":1676,"uuid":1674,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fchase-paymentech-orbital-salem-stratus",{"path":1678,"uuid":1679},"\u002Fpayment-methods\u002Fccavenue","4f6df9cd-0f1b-444e-b196-fcfc79319a4c",{"path":1681,"uuid":1679,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fccavenue",{"path":1683,"uuid":1684},"\u002Fpayment-methods\u002Fcardx","dcb21314-f828-47d0-b191-df30b3bdd6dc",{"path":1686,"uuid":1684,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcardx",{"path":1688,"uuid":1689},"\u002Fpayment-methods\u002Fcardstream","a24cf314-93b4-4c23-8146-6dd27cf08a07",{"path":1691,"uuid":1689,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fcardstream",{"path":1693,"uuid":1694},"\u002Fpayment-methods\u002Fbraintree","4a67b540-84a0-431a-b859-1b9ad2ca24f7",{"path":1696,"uuid":1694,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fbraintree",{"path":1698,"uuid":1699},"\u002Fpayment-methods\u002Fbluesnap","a2d0a524-735b-4c95-912f-fba85f18641b",{"path":1701,"uuid":1699,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fbluesnap",{"path":1703,"uuid":1704},"\u002Fpayment-methods\u002Ffiserv","0cfc4484-5e20-4d97-b49d-f5330bf3b56a",{"path":1706,"uuid":1704,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Ffiserv",{"path":1708,"uuid":1709},"\u002Fpayment-methods\u002Fbluefin","0ef97da3-7cc8-4d34-9a65-aa56678e5c70",{"path":1711,"uuid":1709,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fbluefin",{"path":1713,"uuid":1714},"\u002Fpayment-methods\u002Fbitpay","182e493f-2200-4647-ac4f-5aad098ee4de",{"path":1716,"uuid":1714,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fbitpay",{"path":1718,"uuid":1719},"\u002Fpayment-methods\u002Fbarclaycard","0c5a6fcb-932d-4161-a1d9-40b02dba1934",{"path":1721,"uuid":1719,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fbarclaycard",{"path":1723,"uuid":1724},"\u002Fpayment-methods\u002Fworldline","b7240cf1-48e2-4dce-a949-49da64634f31",{"path":1726,"uuid":1724,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fworldline",{"path":1728,"uuid":1729},"\u002Fpayment-methods\u002Fanz-egate","8145a86e-4307-4273-a5e7-1705e6d8fe4c",{"path":1731,"uuid":1729,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fanz-egate",{"path":1733,"uuid":1734},"\u002Fpayment-methods\u002Fadyen","bbfe99a0-b299-454b-ab76-99d9a3d014de",{"path":1736,"uuid":1734,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fadyen",{"path":1738,"uuid":1739},"\u002Fpayment-methods\u002Fpaypal","dc3cd192-c313-4321-ab4a-75f044ba9827",{"path":1741,"uuid":1739,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fpaypal",{"path":1743,"uuid":1744},"\u002Fpayment-methods\u002Fstripe","09422138-02ce-49a4-b3b2-012cbacb4e89",{"path":1746,"uuid":1744,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fstripe",{"path":1748,"uuid":1749},"\u002Fpayment-methods\u002Famazon-pay","5b00fdcf-c32f-48ec-9457-9cd3bcfe6027",{"path":1751,"uuid":1749,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Famazon-pay",{"path":1753,"uuid":1754},"\u002Fpayment-methods\u002Fsquare","7c9e301a-3379-4533-a662-ac0448f340db",{"path":1756,"uuid":1754,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fsquare",{"path":1758,"uuid":1759},"\u002Fpayment-methods\u002Fauthorize-net","5b65ee3e-36ab-4ab5-83c7-6988bb1f925d",{"path":1761,"uuid":1759,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fauthorize-net",{"path":1763,"uuid":1764},"\u002Fpayment-methods\u002Fapple-pay","d6672c9a-fc92-46c4-b021-b666f57b8af3",{"path":1766,"uuid":1764,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002Fapple-pay",{"path":1768,"uuid":1769},"\u002Fpayment-methods\u002F2checkout","46879cb0-a0ee-43e0-a2f3-af5f2282a576",{"path":1771,"uuid":1769,"context":1211},"\u002Fhelp\u002Fpayment-methods\u002F2checkout",{"path":1773,"uuid":1774},"\u002Fplayground\u002Fcustomer-portal","2e3cd95c-66aa-4e59-80ba-53f27dc9399e",{"path":1776,"uuid":1777},"\u002Fplayground\u002Fgeneral-products","54b34509-a15d-4497-a6fd-efd59058cafe",{"path":1779,"uuid":1780},"\u002Fplayground\u002Fdigital-products","42d1b80d-e617-4160-8f72-4bf842abb3be",{"path":1782,"uuid":1783},"\u002Fplayground\u002Fsubscriptions","9008102d-5ced-478f-9cdf-87faa31e130e",{"path":1785,"uuid":1786},"\u002Fplayground\u002Fdonations","50eeefd5-c0da-4e90-9d03-22234ed6f613",{"path":1788,"uuid":1789},"\u002Fblog\u002Fcategories","eb635c18-c560-4181-aff5-76f0b1355a04",{"path":1791,"uuid":1792},"\u002Fblog\u002Fbest-practices","dce05794-d738-496b-a9e8-034faf3991a0",{"path":1794,"uuid":1795},"\u002Fblog\u002Fchangelogs","1172bb09-19f9-4c9b-988c-43f291893054",{"path":1797,"uuid":1798},"\u002Fblog\u002Fculture","162d0ab2-b116-490f-9561-49716c21307a",{"path":1800,"uuid":1801},"\u002Fblog\u002Fhow-to","bef9b718-6bb9-4667-942a-b128d9c81d46",{"path":1803,"uuid":1804},"\u002Fblog\u002Fmarketing","c8562e56-bd84-4a0b-9238-714040642e2a",{"path":1806,"uuid":1807},"\u002Fblog\u002Fproduct-updates","fab20ad9-e76a-4947-b709-3a6fdfa88028",{"path":1809,"uuid":1810},"\u002Fblog\u002Fsecurity","889da5d5-51b5-426a-a01e-0b724c9a8690",{"path":1812,"uuid":1813},"\u002Fblog\u002Fsystems-infrastructure","bd7fb715-7466-47b2-ae2f-54680d12918c",{"path":1815,"uuid":1816},"\u002Fblog\u002Funcategorized","ebe16b36-481f-4c24-b386-7dfbad9cc4a7",{"path":1818,"uuid":1819},"\u002Fblog\u002Funlock-deeper-ecommerce-insights-with-foxy-and-humblytics","0a036b43-6378-4735-959c-4e64300e931c",{"path":1821,"uuid":1822},"\u002Fblog\u002Fai-ecommerce-with-foxy-lovable","db0006b3-b134-4860-a81f-5bfa92b63c22",{"path":1824,"uuid":1825},"\u002Fblog\u002Fbuild-product-configurators-with-convertcalculator-foxy","0ca9e7c6-ea55-4c9a-a008-ecf98e237315",{"path":1827,"uuid":1828},"\u002Fblog\u002Fjuly-2025-product-roundup","c0a818dc-9542-408c-937e-3af874d7711b",{"path":1830,"uuid":1831},"\u002Fblog\u002Fg2-reviews-why-they-matter-and-how-to-list-your-business","e83080ad-7e95-4a4a-89dc-7d4aa54612c5",{"path":1833,"uuid":1834},"\u002Fblog\u002Fsmall-tech-big-impact-why-foxy-is-different","962790be-a384-433a-843c-5d98f94c4cd2",{"path":1836,"uuid":1837},"\u002Fblog\u002Fsecure-ecommerce-for-framer-websites","657599e9-e406-472a-8995-b5ad35b1daf4",{"path":1839,"uuid":1840},"\u002Fblog\u002Fadd-secure-ecommerce-to-divhunt-websites","7a2776ad-7b70-4f81-90be-38feaf4a2053",{"path":1842,"uuid":1843},"\u002Fblog\u002Fsecure-ecommerce-for-webstudio-websites","7c867d5e-78cf-4695-a43e-29d6eade281f",{"path":1845,"uuid":1846},"\u002Fblog\u002Fadd-super-powers-to-your-foxy-store-with-byteline","2c21a3b9-4e3b-45f4-9a32-11b40c19d404",{"path":1848,"uuid":1849},"\u002Fblog\u002Fjune-2025-product-roundup","8907f196-c2b1-4f3f-93e6-c7f781a439a5",{"path":1851,"uuid":1852},"\u002Fblog\u002Ftransaction-folders-are-here","e95e31b6-8fd8-499c-9c3d-e2217b98df1d",{"path":1854,"uuid":1855},"\u002Fblog\u002Fthe-generic-currency-symbol-currency-and-why-we-love-it","b5315ef1-59e6-4262-ba53-2035c959c9cc",{"path":1857,"uuid":1858},"\u002Fblog\u002Ffoxy-highlevel","2f2872e6-4bd7-4aa7-bd91-eddeba1e4a3b",{"path":1860,"uuid":1861},"\u002Fblog\u002Ffoxy-wix-studio","33433a70-2426-4a1d-ac55-dc0b4410c352",{"path":1863,"uuid":1864},"\u002Fblog\u002Fapril-2025-product-roundup","7ea3ee4e-cc2b-43af-8973-17b1039e6d3e",{"path":1866,"uuid":1867},"\u002Fblog\u002Fbuild-a-printful-powered-online-store-with-foxy-webflow-and-byteline","37cdbf2c-fbdf-462e-9fd1-3b88c5fb2d79",{"path":1869,"uuid":1870},"\u002Fblog\u002Ffoxy-is-your-asecurecart-alternative","9ec139cc-0656-4fe3-8c14-c31d0e79bf05",{"path":1872,"uuid":1873},"\u002Fblog\u002Ffoxy-the-best-1shoppingcart-alternative","914351c7-2e4a-4eda-9e61-2de9790ded19",{"path":1875,"uuid":1876},"\u002Fblog\u002Ffebruary-2025-product-roundup","b44ef1a4-ad76-4bfa-816f-81d824d15579",{"path":1878,"uuid":1879},"\u002Fblog\u002Ffoxyshop-wordpress-plugin-updates","019835cc-88a4-4570-ac7f-46e38e3b00c5",{"path":1881,"uuid":1882},"\u002Fblog\u002Fthe-new-foxy-admin-is-live","2bee6137-6e12-4cdd-87d5-24bc299b457e",{"path":1884,"uuid":1885},"\u002Fblog\u002Ftax-inclusive-pricing-is-here","6a97bd51-be4a-4836-a7f5-fe7059648a99",{"path":1887,"uuid":1888},"\u002Fblog\u002Ffoxy-wigwag","f8bb5213-5c85-44bb-8735-6351cd7b8b25",{"path":1890,"uuid":1891},"\u002Fblog\u002Fposts","6eaedd54-63da-4574-8ec5-155b31fc57bc",{"path":1893,"uuid":1894},"\u002Fblog\u002Ffraudsters-are-getting-so-advanced-it-doesn-t-make-sense","3d5b7870-81b4-4e5b-a715-697a9d8b1303",{"path":1896,"uuid":1897},"\u002Fblog\u002F2017-year-in-review","499c065f-32fc-4ee4-8ff1-20a0d8c907c4",{"path":1899,"uuid":1900},"\u002Fblog\u002F2020-what-a-year","5b6bbfc1-4b1c-4db5-8978-99a9dffa6047",{"path":1902,"uuid":1903},"\u002Fblog\u002F2021-in-review","0f61976e-f35e-46a2-baa7-ea9207f7509f",{"path":1905,"uuid":1906},"\u002Fblog\u002F2022-in-review","eb23a16a-8b89-4d21-b4cb-84109cb6de05",{"path":1908,"uuid":1909},"\u002Fblog\u002F2-0-beta-progress-report","ee6de40e-e975-4214-85cd-6244bd62e17d",{"path":1911,"uuid":1912},"\u002Fblog\u002F4-steps-to-prep-your-store-for-cyber-monday-black-friday","51410323-7403-4c41-b11c-7533eb0ec0c2",{"path":1914,"uuid":1915},"\u002Fblog\u002Fa-book-your-client-should-read-avoiding-a-goat-rodeo","677e07d4-069b-4c65-ac94-cd9265f08442",{"path":1917,"uuid":1918},"\u002Fblog\u002Fadd-to-cart-buttons-for-inspiration","ee37d3e6-2c7a-431c-8e6d-c14db64a443f",{"path":1920,"uuid":1921},"\u002Fblog\u002Fa-look-at-2019","79fc30c2-ea12-4815-842d-44f98039820e",{"path":1923,"uuid":1924},"\u002Fblog\u002Fa-pleasure-to-integrate","90c0db90-973d-4174-b37c-33dd5d48d49b",{"path":1926,"uuid":1927},"\u002Fblog\u002Fa-service-architecture-approach-to-ecommerce","fea4b36b-6ac6-4257-bfcb-c4aa99872f55",{"path":1929,"uuid":1930},"\u002Fblog\u002Fautomagically-collect-and-display-customer-reviews-with-monto-in-your-foxy-webflow-store","1447ea56-ffa2-44bc-952f-2c6e5f3bbc72",{"path":1932,"uuid":1933},"\u002Fblog\u002Fbasic-analytics-tip-filter-out-your-own-ip","4983503b-25c2-40ff-a3c9-581ff2366627",{"path":1935,"uuid":1936},"\u002Fblog\u002Fbasic-guidelines-for-ecommerce-video-marketing","07861cbb-d930-47ee-8596-c317ec1077c8",{"path":1938,"uuid":1939},"\u002Fblog\u002Fbehaviour-driven-development-bdd-and-foxycart","313229cb-d3f1-4263-a025-829e4fbab17d",{"path":1941,"uuid":1942},"\u002Fblog\u002Fbelievers-make-the-sale","7c61f2e6-b44b-4b09-a71c-38ffa0eb5acd",{"path":1944,"uuid":1945},"\u002Fblog\u002Fbots-the-rising-threat-to-ecommerce","a541d0ed-bd7f-477c-862c-11c38901d829",{"path":1947,"uuid":1948},"\u002Fblog\u002Fbrowser-development-and-testing-tools","eaf57ea4-b286-46ee-a242-f6c8d97d9dd0",{"path":1950,"uuid":1951},"\u002Fblog\u002Fbuild-a-jamstack-ecommerce-website-with-next-js-contentful-and-foxy","86a93102-b0a3-4bb2-ad7d-d02f94e0dd16",{"path":1953,"uuid":1954},"\u002Fblog\u002Fbuild-an-ecommerce-landing-page-with-unbounce-and-foxy","f6593dca-59e6-45b6-85a1-1c375d4c8cc2",{"path":1956,"uuid":1957},"\u002Fblog\u002Fbuilding-a-turnkey-fundraising-mini-site-with-foxy-and-eleventy","1186aa89-2abb-4a98-91a5-f9281cece1ac",{"path":1959,"uuid":1960},"\u002Fblog\u002Fcloudfront-vs-cloudflare-and-how-to-reduce-response-times-for-both-by-35","c92e34f2-5b78-4c45-b192-fa3ad0951da4",{"path":1962,"uuid":1963},"\u002Fblog\u002Fcoinbase-commerce-support-for-foxy","5ce17b83-9fd5-4c22-b7a9-b5fbcc345228",{"path":1965,"uuid":1966},"\u002Fblog\u002Fcollecting-and-remitting-the-correct-sales-taxes-for-your-ecommerce-store","73ddd979-9e60-4626-b595-25b4e2db01a5",{"path":1968,"uuid":1969},"\u002Fblog\u002Fconnecting-to-quickbooks","7192d972-04cf-41a9-abd4-cb54be9c4f33",{"path":1971,"uuid":1972},"\u002Fblog\u002Fconvert-any-weebly-element-into-a-secure-purchase-option-with-foxy","2bc638cd-f4a7-4168-84f3-8d1dac6deb36",{"path":1974,"uuid":1975},"\u002Fblog\u002Fcould-bitcoin-be-more-disruptive-than-the-internet","c70c7a4c-b949-4229-8270-8dc1bc49163b",{"path":1977,"uuid":1978},"\u002Fblog\u002Fcoupon-improvement-blacklist-products","fc0f764a-e7ba-488a-91e3-5f9c03629826",{"path":1980,"uuid":1981},"\u002Fblog\u002Fcoupon-improvements-product-specific-coupons-and-per-customer-usage-control","974edded-b94e-46a7-986a-e68981f83db2",{"path":1983,"uuid":1984},"\u002Fblog\u002Fcoupons-are-great-except-when-theyre-not","d8a33cd4-f923-4c02-b68f-188b2e3f614c",{"path":1986,"uuid":1987},"\u002Fblog\u002Fcreate-an-online-store-with-notion-and-foxy","5ae4c982-e3f6-4c12-9463-2e7adeb5226f",{"path":1989,"uuid":1990},"\u002Fblog\u002Fcredit-card-processing-for-high-risk-merchants","69b729f9-b0b7-45a9-a900-0a30374a0d97",{"path":1992,"uuid":1993},"\u002Fblog\u002Fcustomer-service-anaesthetics-good-for-business","a8eb9c46-8074-4564-b658-e43618d8b39f",{"path":1995,"uuid":1996},"\u002Fblog\u002Fcustom-tax-calculations-for-foxy-via-a-quick-easy-netlify-serverless-app","c17c54a0-ebcc-4d84-bf5b-44b9b94c524d",{"path":1998,"uuid":1999},"\u002Fblog\u002Fdecoy-marketing-and-compromise-marketing","c589cf1c-f39c-43f0-a9c3-50e3ab124930",{"path":2001,"uuid":2002},"\u002Fblog\u002Fdetecting-a-visitors-social-networks","a6041fea-e643-42b5-886c-47e74044c68e",{"path":2004,"uuid":2005},"\u002Fblog\u002Fdo-you-even-need-a-website-to-sell-your-products","821ea14c-2abc-4fb4-99e4-9a9065652560",{"path":2007,"uuid":2008},"\u002Fblog\u002Fdo-you-hate-mondays","9cfc1024-bec8-4de8-8d6c-03a5a58cf18c",{"path":2010,"uuid":2011},"\u002Fblog\u002Feasily-promote-and-sell-your-product-with-launchaco-and-foxy","90b83ba5-9571-49ff-b8d5-219eff847cff",{"path":2013,"uuid":2014},"\u002Fblog\u002Feasy-to-setup-ecommerce-in-5-minutes","a1f18074-1d44-4709-aa1b-ee2ec0504304",{"path":2016,"uuid":2017},"\u002Fblog\u002Fecommerce-faqs-finally-get-answered","e0890d26-25ee-4494-8e16-f767fb53f0c4",{"path":2019,"uuid":2020},"\u002Fblog\u002Fecommerce-integration-with-campaign-monitor-and-foxycart","6c08a300-f534-4a9c-bc2e-1bd4848c2b25",{"path":2022,"uuid":2023},"\u002Fblog\u002Feverything-you-need-to-know-about-cross-border-fees","74e6e7d5-63fa-45da-934c-0e5e70d5a4cd",{"path":2025,"uuid":2026},"\u002Fblog\u002Ffaster-pageloads-effectively-using-http-caching-cache-busting-and-a-cdn","ee2ffaf7-5176-4744-975a-bb056c505fb2",{"path":2028,"uuid":2029},"\u002Fblog\u002Ffeatured-site-narwhal-company","b989413b-637d-41df-8bb4-5029e43b2372",{"path":2031,"uuid":2032},"\u002Fblog\u002Ffollow-up-on-our-new-pricing","82df753e-e303-4d67-9d6c-1d3295515573",{"path":2034,"uuid":2035},"\u002Fblog\u002Ffoxy-a-celery-alternative-you-can-start-using-today","0696beb6-6856-46d2-9823-90d59cde028c",{"path":2037,"uuid":2038},"\u002Fblog\u002Ffoxycart-2-0-is-out-of-beta","a3f30b1c-8c89-4b98-9fdf-419a26be73e7",{"path":2040,"uuid":2041},"\u002Fblog\u002Ffoxycart-admin-as-a-standalone-app","ec009256-825a-4765-a224-b6b0c47bef9f",{"path":2043,"uuid":2044},"\u002Fblog\u002Ffoxycart-constant-contact","85c77b03-7053-482a-8109-aeeb98edd1c5",{"path":2046,"uuid":2047},"\u002Fblog\u002Ffoxycart-customer-quotes-part-1","a1bd1408-ab68-4f3c-877d-b46621a8d8a3",{"path":2049,"uuid":2050},"\u002Fblog\u002Ffoxycart-forum-security-breach","e47a29a6-053f-4fb1-a230-7df3649572ad",{"path":2052,"uuid":2053},"\u002Fblog\u002Ffoxycart-joins-skyhighs-cloud-trust-program","7a353571-5fda-42b1-b5f5-1abd51fc1be8",{"path":2055,"uuid":2056},"\u002Fblog\u002Ffoxycart-partners-with-avalara-upcoming-webinar","5d7d1527-302f-4e3d-ad12-f467da4b9073",{"path":2058,"uuid":2059},"\u002Fblog\u002Ffoxycarts-new-fair-pricing","a0154146-a39f-4691-b69b-9aedf534737e",{"path":2061,"uuid":2062},"\u002Fblog\u002Ffoxycart-v0-7-2-public-beta","805e4ff1-cdca-46f0-86eb-26d1fc88137e",{"path":2064,"uuid":2065},"\u002Fblog\u002Ffoxycart-v1-0-is-here-after-5-years-really","fc86e9ed-80a0-4513-8834-e919243b1267",{"path":2067,"uuid":2068},"\u002Fblog\u002Ffoxycart-v1-1-and-an-update","b6580a96-2fff-4695-bfc2-64f18bfe2b48",{"path":2070,"uuid":2071},"\u002Fblog\u002Ffoxycart-youre-my-new-best-friend","54fa56e4-8e9d-4342-bba8-e85ccc81b7a0",{"path":2073,"uuid":2074},"\u002Fblog\u002Ffoxycomplete-new-awesome-on-our-checkouts-country-state-autocompleter","bc7b7c21-c088-4ffa-9731-25211e1fa370",{"path":2076,"uuid":2077},"\u002Fblog\u002Ffoxy-ios-tips-for-better-security-vulnerability-reports","4decfdec-fb25-4554-9517-5ac34dd5f0da",{"path":2079,"uuid":2080},"\u002Fblog\u002Ffoxys-covid-19-update-were-here-for-you","33dc15bf-bb0c-4f30-8b29-04c4b293e580",{"path":2082,"uuid":2083},"\u002Fblog\u002Ffoxy-the-affordable-gumroad-alternative","bb11a124-a489-452f-9e45-8ba830f40a99",{"path":2085,"uuid":2086},"\u002Fblog\u002Ffoxy-webflow-cart-abandonment-recovery-with-monto","afb17bf2-11fc-41f6-b4e0-b8143db0fb0b",{"path":2088,"uuid":2089},"\u002Fblog\u002Fgateway-improvement-ach-support","2985b98c-f3b5-4d67-81bc-d5e4dedd27bd",{"path":2091,"uuid":2092},"\u002Fblog\u002Fgateway-improvement-apple-pay-support","efc20e78-ad23-45e8-8e25-936a5c1cac8c",{"path":2094,"uuid":2095},"\u002Fblog\u002Fgateway-improvement-jcb-card-support","be775713-1585-4a3a-ba1c-7dd359d1b16e",{"path":2097,"uuid":2098},"\u002Fblog\u002Fgateway-improvement-paypal-credit","6cf854e9-daa8-44c1-8adc-8455bbda4fad",{"path":2100,"uuid":2101},"\u002Fblog\u002Fget-more-conversions-with-instapage-and-foxy","0a7f04f5-7f35-42cf-a70d-5289617556d4",{"path":2103,"uuid":2104},"\u002Fblog\u002Fgirl-scouts-use-foxycart-to-collect-donations","65c1104e-cda6-4b28-988f-b2ec162664bf",{"path":2106,"uuid":2107},"\u002Fblog\u002Fhackathons-for-remote-teams-our-first-attempt","f412eaa7-ce12-466a-a50a-5497f95cf057",{"path":2109,"uuid":2110},"\u002Fblog\u002Fhappy-2008-from-foxycart","13008b94-7d06-4e8c-81d3-0f5d2e872f0a",{"path":2112,"uuid":2113},"\u002Fblog\u002Fhappy-holidays-2007","30a30c4d-723f-4ec5-bb4c-ed92fb55cab1",{"path":2115,"uuid":2116},"\u002Fblog\u002Fhard-crashing-ie6-with-html-css-alone","cefad5ee-4e26-4b12-8bb3-5938db6d0fa7",{"path":2118,"uuid":2119},"\u002Fblog\u002Fhelp-scout-vs-zoho-desk-best-of-breed-or-all-in-one","013e9816-1a90-41b3-b386-f6fa58107bd0",{"path":2121,"uuid":2122},"\u002Fblog\u002Fheres-a-look-at-2018-and-onward","2e5a2103-16ef-4a62-b19b-4fa4867defbe",{"path":2124,"uuid":2125},"\u002Fblog\u002Fholiday-sales-without-the-stress","4da276f8-b4ce-4de7-b890-29fa17d1f2df",{"path":2127,"uuid":2128},"\u002Fblog\u002Fhow-1100-in-fraudulent-charges-encouraged-me","95d528fd-a519-414d-b14e-4acd50c42fd5",{"path":2130,"uuid":2131},"\u002Fblog\u002Fhow-okiefoodtrucks-is-using-foxy-webflow-to-change-the-food-truck-industry","43972f52-5bb1-4cd0-9411-2752a6b6cc20",{"path":2133,"uuid":2134},"\u002Fblog\u002Fhow-to-accept-payments-in-clickfunnels-with-foxy","326de6be-670e-46d2-8225-54dac4f64935",{"path":2136,"uuid":2137},"\u002Fblog\u002Fhow-to-collect-customer-feedback-and-use-it-to-boost-loyalty","c3907bfb-c261-43da-a6e8-8a610957eac3",{"path":2139,"uuid":2140},"\u002Fblog\u002Fhow-to-design-imagery-for-non-tangible-products","3bb7655a-0d5a-4064-a1fd-ab66099ebd6e",{"path":2142,"uuid":2143},"\u002Fblog\u002Fhow-to-pick-the-right-cms-for-your-online-store","e9ba73a6-f077-41eb-9924-00aba4a584ab",{"path":2145,"uuid":2146},"\u002Fblog\u002Fhow-to-sell-your-products-and-services-in-leadpages-with-foxy","b50b8b73-40bc-48e5-8b62-3e7673ff21e4",{"path":2148,"uuid":2149},"\u002Fblog\u002Fhow-to-set-up-recurring-payments-and-subscriptions-with-foxy-webflow","3591c0bd-d883-491d-b463-2fda98f08681",{"path":2151,"uuid":2152},"\u002Fblog\u002Fhow-to-upgrade-your-legacy-shopping-cart","b517c39f-13d3-440b-8dcd-79c79eacf723",{"path":2154,"uuid":2155},"\u002Fblog\u002Fhypermedia-dog-food","d702f3bd-bf49-4cca-bca5-75dd31b92c63",{"path":2157,"uuid":2158},"\u002Fblog\u002Fi-cant-go-back","48cb89fc-f1f8-4d33-acc6-8fb0549c81ef",{"path":2160,"uuid":2161},"\u002Fblog\u002Fincrease-sales-with-these-foxycart-features","874ab3d1-6d13-4623-b444-1405245a6f48",{"path":2163,"uuid":2164},"\u002Fblog\u002Fintegrating-foxycart-carthook","d1ecb269-4755-4eb9-8691-c3c035d6fba6",{"path":2166,"uuid":2167},"\u002Fblog\u002Fintegrating-foxycart-cartstack","d04157fb-9fa0-4dbb-b90f-3e06dbb37ebe",{"path":2169,"uuid":2170},"\u002Fblog\u002Fintegrating-foxycart-coinbase","74237553-f0f8-41df-abe2-62a41087dc80",{"path":2172,"uuid":2173},"\u002Fblog\u002Fintegrating-foxycart-craft-cms","f0cbcccb-f857-47e6-b5e5-34fff8ffac5d",{"path":2175,"uuid":2176},"\u002Fblog\u002Fintegrating-foxycart-craft-cms-part-2","fa51138e-cc98-4c01-8325-cfa252eeb57c",{"path":2178,"uuid":2179},"\u002Fblog\u002Fintroducing-our-new-blog-at-foxyio","a6f6c460-0819-4c90-80b5-61bf9fc73c10",{"path":2181,"uuid":2182},"\u002Fblog\u002Fin-which-we-talk-security","0e3b7e78-63f1-4490-999f-77c5a23e4be4",{"path":2184,"uuid":2185},"\u002Fblog\u002Fis-your-ecommerce-shop-thinking-globally","b88b6c82-2edc-4c91-8f23-81c0cef3eb5a",{"path":2187,"uuid":2188},"\u002Fblog\u002Fis-your-shopping-cart-like-the-tail-wagging-the-dog","1c1cd852-a10f-4cca-9dd5-7942ae41084c",{"path":2190,"uuid":2191},"\u002Fblog\u002Fkeeping-your-favicon-consistent","442134c6-9ace-4d8d-89a1-b36f46f1c25a",{"path":2193,"uuid":2194},"\u002Fblog\u002Flaunch-a-beautiful-one-page-ecommerce-site-with-carrd-and-foxy","0dccc682-23a8-4f15-b06b-977d4de6a93f",{"path":2196,"uuid":2197},"\u002Fblog\u002Flive-shipping-rates-with-easypost","909ac793-1493-4e69-9bec-fe177377cbb6",{"path":2199,"uuid":2200},"\u002Fblog\u002Flooking-back-and-looking-ahead-2016-in-review","6adbb1f3-37c2-4c09-87d1-2e7df18faba6",{"path":2202,"uuid":2203},"\u002Fblog\u002Fmore-ways-to-pay-for-your-foxycart-subscription","1383fcc4-ea84-47c4-a71c-236cf8be6731",{"path":2205,"uuid":2206},"\u002Fblog\u002Fmulti-currency-support-is-here","add2a9e7-d2d2-4ac9-8e13-7b45478d63ed",{"path":2208,"uuid":2209},"\u002Fblog\u002Fmultiship-multiple-ship-to-addresses-one-page-checkout","cea97d5e-c761-469d-83ce-7252a0a1a49a",{"path":2211,"uuid":2212},"\u002Fblog\u002Fnetwork-status-massive-ddos-affecting-latency-and-connectivity","2c2e87bb-5641-4741-bd80-3f9c64ec4471",{"path":2214,"uuid":2215},"\u002Fblog\u002Fnew-and-improved-subscription-management-features","268e2efe-e19e-47e1-ae38-9ecee934414b",{"path":2217,"uuid":2218},"\u002Fblog\u002Fnew-feature-custom-order-numbers","a014138c-dc70-422e-8c71-d9f1fd1f65fe",{"path":2220,"uuid":2221},"\u002Fblog\u002Fnew-feature-custom-shipping-code","1ce805a0-d3db-43dc-b0e4-f89df0968e26",{"path":2223,"uuid":2224},"\u002Fblog\u002Fnew-feature-custom-shipping-endpoint","abf107c1-e924-47d8-9a4d-94f6fbec15a9",{"path":2226,"uuid":2227},"\u002Fblog\u002Fnew-feature-googles-recaptcha","78d32189-21c1-4b6d-9223-18369f65173c",{"path":2229,"uuid":2230},"\u002Fblog\u002Fnew-feature-json-webhook","e659861c-8b2d-4a2f-8048-ff6cb2284cc3",{"path":2232,"uuid":2233},"\u002Fblog\u002Fnew-feature-payment-sets","2bf19dd9-751e-4fc1-9767-0b3ee34a352e",{"path":2235,"uuid":2236},"\u002Fblog\u002Fnew-feature-pre-payment-webhook","0acf872c-db2b-4287-8910-7ea4a4c1901f",{"path":2238,"uuid":2239},"\u002Fblog\u002Fnew-feature-shared-coupon-codes","39e25c7c-5235-4fb9-9cb6-15b8d4c384c4",{"path":2241,"uuid":2242},"\u002Fblog\u002Fnew-feature-use-your-own-smtp-server","cd07fbbd-1445-488c-b692-74add983af26",{"path":2244,"uuid":2245},"\u002Fblog\u002Fnew-gateway-adyen","33d9427a-478e-4c31-8879-6ff7caf59f93",{"path":2247,"uuid":2248},"\u002Fblog\u002Fnew-gateway-comgate","2ed8d80c-b99e-45f4-aa51-1a8ed2199069",{"path":2250,"uuid":2251},"\u002Fblog\u002Fnew-gateway-ems-pay","1b0490c7-9887-4bb5-8d23-5f3bf90eeaa6",{"path":2253,"uuid":2254},"\u002Fblog\u002Fnew-gateway-paypal-plus","15e95f1e-3823-44eb-9956-744b3224f405",{"path":2256,"uuid":2257},"\u002Fblog\u002Fnew-gateway-payu","2c4e8986-0a4b-49c0-bd05-d120d0099b6f",{"path":2259,"uuid":2260},"\u002Fblog\u002Fnew-integration-address-autocompletion-and-validation-with-crafty-clicks","65e3d808-548e-49e6-a312-b5046fcd71c2",{"path":2262,"uuid":2263},"\u002Fblog\u002Fnew-integration-fraudlabs-pro","736bfaa4-6f0d-49b2-9e6b-8306f4694920",{"path":2265,"uuid":2266},"\u002Fblog\u002Fnew-integration-help-scout","8c5c3280-cf4c-4547-954e-3ca36020737c",{"path":2268,"uuid":2269},"\u002Fblog\u002Fnew-integration-square","ba16228d-e038-4c7e-941d-83edbbccae74",{"path":2271,"uuid":2272},"\u002Fblog\u002Fnew-integration-webflow-product-inventory-management","b85c5c06-65b5-469d-9132-2809b07a23b9",{"path":2274,"uuid":2275},"\u002Fblog\u002Fnew-possibilities-for-typography-on-the-web","8047be00-f30d-4416-a4da-3a0010cdc47d",{"path":2277,"uuid":2278},"\u002Fblog\u002Fnew-status-site-and-scheduled-maintenance","da5dd265-175e-47bc-99f0-abbbfe83abec",{"path":2280,"uuid":2281},"\u002Fblog\u002Fnew-years-resolutions","e8e59c04-680c-4876-a502-a3924279e147",{"path":2283,"uuid":2284},"\u002Fblog\u002Fnice-free-ecommerce-y","2382a1b6-4147-4721-adbc-3ebab7c55471",{"path":2286,"uuid":2287},"\u002Fblog\u002Fnow-with-even-more-ways-to-get-paid","021fec23-5836-4fc4-83a9-769d085d025c",{"path":2289,"uuid":2290},"\u002Fblog\u002Fone-of-the-best-tools-for-web-developers","c1ccfb9b-6175-4c2e-9bcd-d2a1a0ed484e",{"path":2292,"uuid":2293},"\u002Fblog\u002Fonline-shoppers-and-product-reviews","57993e4b-3728-46ef-b565-d9980be014d8",{"path":2295,"uuid":2296},"\u002Fblog\u002Four-featured-ecommerce-site-gallery-launches","4307ea50-1788-4612-8bdf-dba8460d406e",{"path":2298,"uuid":2299},"\u002Fblog\u002Four-new-website-or-how-it-took-us-two-years-to-launch","ba9baca0-4d98-4435-95ac-527220d8a97f",{"path":2301,"uuid":2302},"\u002Fblog\u002Foverheard-at-foxycart","5be7ead2-df09-491d-853c-5f58f25fba18",{"path":2304,"uuid":2305},"\u002Fblog\u002Fpassing-on-credit-card-fees-to-customers-how-businesses-save-with-surcharging","7daedc08-1bd6-4d28-a9f7-95a801ad3f40",{"path":2307,"uuid":2308},"\u002Fblog\u002Fpassive-groups-in-regular-expressions","6f738121-d011-4dd6-90bb-178b8435242a",{"path":2310,"uuid":2311},"\u002Fblog\u002Fplasso-is-closing-shop-but-that-doesnt-mean-you-have-to","f51d3496-08ec-4a2c-a669-251fa4570007",{"path":2313,"uuid":2314},"\u002Fblog\u002Fpossibly-our-most-satisfied-user-ever","373b38eb-1f46-40a5-95b8-6dff1a8fd276",{"path":2316,"uuid":2317},"\u002Fblog\u002Fpostmortem-failing-over-to-our-backup-environment","cb0c3423-11e5-4edd-96f9-2fbdbf40c944",{"path":2319,"uuid":2320},"\u002Fblog\u002Fprivacy-foxy-and-the-eus-gdpr","eb750840-e811-4cac-9b45-de96d4f2c9ad",{"path":2322,"uuid":2323},"\u002Fblog\u002Fproduct-update-automate-your-subscription-management-and-billing-errors","7570ffcc-de75-4065-aff7-b61f368a040d",{"path":2325,"uuid":2326},"\u002Fblog\u002Fproduct-update-payment-sets-custom-order-numbers-and-more","c267a7cd-1adf-4171-949d-d60bd7c1eeb7",{"path":2328,"uuid":2329},"\u002Fblog\u002Fproduct-update-paypal-credit-and-googles-recaptcha","3f10476a-ffb4-421e-b43a-ec7c12918d7f",{"path":2331,"uuid":2332},"\u002Fblog\u002Fproduct-updates-october-2018","d49cfece-ed89-4255-8bcc-35b979aa4699",{"path":2334,"uuid":2335},"\u002Fblog\u002Fpsd2-and-strong-customer-authentication","c87f6b8a-99c4-48c4-97d9-b73863bc05d3",{"path":2337,"uuid":2338},"\u002Fblog\u002Fqa-the-first-impression-part-1","ec265308-7999-428b-9a6f-02880c78d2a4",{"path":2340,"uuid":2341},"\u002Fblog\u002Fqa-the-first-impression-part-2","f8c35dbd-6691-40dc-a62a-53ee3f7b2f7c",{"path":2343,"uuid":2344},"\u002Fblog\u002Freasons-to-be-paranoid-keyboards","b3269238-ee52-4fa5-a015-f9ab8252897f",{"path":2346,"uuid":2347},"\u002Fblog\u002Freintroducing-foxyshop-our-free-wordpress-plugin","c6f37144-cdc2-4a30-ac21-19f51f86af97",{"path":2349,"uuid":2350},"\u002Fblog\u002Fresources-for-regular-expressions","e9b7bb46-2eb1-4c29-81e9-2cc1d1c6196a",{"path":2352,"uuid":2353},"\u002Fblog\u002Freverse-sso-upsells-and-more","548ecc54-03c7-428e-8c42-a3a6959175a8",{"path":2355,"uuid":2356},"\u002Fblog\u002Fsafe-harbor-is-dead-long-live-something-else","c9fa0ab4-9f81-4fa7-90ed-31804bfa9232",{"path":2358,"uuid":2359},"\u002Fblog\u002Fscheduled-downtime-status-and-failover","ce2c3c5b-6c90-4a5c-b17e-30e7087d86d7",{"path":2361,"uuid":2362},"\u002Fblog\u002Fscreencast-live-editing-css-for-rapid-styling","c874aa90-e9d1-4325-8c10-523823df6caa",{"path":2364,"uuid":2365},"\u002Fblog\u002Fsecure-ecommerce-in-your-pagecloud-website-with-foxy","5d30eaa5-4df5-472f-b4e3-cab806c3bd59",{"path":2367,"uuid":2368},"\u002Fblog\u002Fsecurity-update-turning-off-certain-older-encryption-protocols","103acf29-ecc4-4af2-b5f5-2f30600fb930",{"path":2370,"uuid":2371},"\u002Fblog\u002Fsharing-store-access-from-within-the-foxycart-admin","93bd842c-70b3-4ac1-8bdc-15b4f8127f4b",{"path":2373,"uuid":2374},"\u002Fblog\u002Fshout-out-to-foxycart-merchants-we-patronize","3e3f44e7-3e8b-41f1-a0fa-c5d2b16cf113",{"path":2376,"uuid":2377},"\u002Fblog\u002Fsitegrinder-3-announced-with-foxycart-support","94f33457-c518-4bc5-93d7-78e3ac5191a2",{"path":2379,"uuid":2380},"\u002Fblog\u002Fsites-ecommerce-and-a-bad-economy","f9c90d72-70bd-4b55-a0c4-19b7cbe9b289",{"path":2382,"uuid":2383},"\u002Fblog\u002Fsix-0-non-traditional-marketing-ideas-that-work","2e8c8479-9733-44f4-94ca-784dcf840961",{"path":2385,"uuid":2386},"\u002Fblog\u002Fskrill-and-pesapal-support","9ff35ac8-0f1b-473b-bee0-40e8c739ec3e",{"path":2388,"uuid":2389},"\u002Fblog\u002Fslideshowpro-e-commerce-with-foxycart","1e7a4a75-3df2-4632-902d-239076d00df3",{"path":2391,"uuid":2392},"\u002Fblog\u002Fsolving-cloudfront-mysteries-with-aws-athena","43300722-6722-4b70-aedf-ef07b80b2ced",{"path":2394,"uuid":2395},"\u002Fblog\u002Fssl-vulnerabilities-poodle","b672283b-3230-43f3-a9ff-27c3deec12f1",{"path":2397,"uuid":2398},"\u002Fblog\u002Fstart-selling-in-minutes-with-flauntly-and-foxy","6466802e-1a3c-4d3d-bc3b-0d01658efbf9",{"path":2400,"uuid":2401},"\u002Fblog\u002Fsubscription-functionality-improvements","41f84a95-17b1-4049-a590-2f615bb2b9c1",{"path":2403,"uuid":2404},"\u002Fblog\u002Fsubscriptions-dun-right","64edff39-9a8e-48e3-aed2-51e9f8250305",{"path":2406,"uuid":2407},"\u002Fblog\u002Fsupport-for-klarnas-extra-merchant-data-emd-allows-more-travel-and-event-merchants-to-sell","c81a6fb9-4c7b-4644-afc0-016231ffb56d",{"path":2409,"uuid":2410},"\u002Fblog\u002Fsysadmins-patch-servers-doctors-patch-sysadmins","4839cc72-1e17-474c-8a35-b29151423485",{"path":2412,"uuid":2413},"\u002Fblog\u002Fthe-3-bs-of-healthy-remote-teams-bbqs-beer-bourbon","13d5931c-e599-426d-a935-7f577d3e2670",{"path":2415,"uuid":2416},"\u002Fblog\u002Fthe-danger-of-bootstrapping-customers-business","bd66a776-8b42-4139-91e0-6824ddfe48e6",{"path":2418,"uuid":2419},"\u002Fblog\u002Fthe-drown-attack","6b38c009-8fe4-4b57-82a7-71df844a1e9d",{"path":2421,"uuid":2422},"\u002Fblog\u002Fthe-foxy-conference-booth-effective-affordable-fun","d17d00ca-76e3-4842-8274-19a63ad55f84",{"path":2424,"uuid":2425},"\u002Fblog\u002Fthe-growing-importance-of-design","ecf0d612-71aa-4797-ab67-fd46325438d0",{"path":2427,"uuid":2428},"\u002Fblog\u002Fthe-heartbleed-bug","7cebc94d-680e-46a9-bcc0-e503c29d11f3",{"path":2430,"uuid":2431},"\u002Fblog\u002Fthe-hypermedia-debate","1867ab28-e3cb-49e3-a725-eed78e8299d5",{"path":2433,"uuid":2434},"\u002Fblog\u002Fthe-importance-of-copy-on-e-commerce-websites","ae030bb6-0bfb-4a1b-961d-f2e3e3a37183",{"path":2436,"uuid":2437},"\u002Fblog\u002Fthe-importance-of-the-number-1-0","3721535e-1eec-4adc-9ccc-0a8ea715bcf8",{"path":2439,"uuid":2440},"\u002Fblog\u002Fthe-myths-of-pci-compliance-a-pci-compliant-box","8ac207d1-6f01-4bd9-9ff8-fc7fdfe49f7c",{"path":2442,"uuid":2443},"\u002Fblog\u002Fthe-right-tools-for-the-job-part-1","9f73dbcb-0c8d-47bb-aa4e-735b4686eb1a",{"path":2445,"uuid":2446},"\u002Fblog\u002Fthe-right-tools-for-the-job-part-2","d0c6bddc-052c-4c09-8715-fac7220f5515",{"path":2448,"uuid":2449},"\u002Fblog\u002Fthe-story-people-dont-tell-you-about-building-a-business","51d77ab8-cad6-40cc-be83-b1c82c2e6368",{"path":2451,"uuid":2452},"\u002Fblog\u002Fthe-thing-we-hope-to-always-hate-doing","aeea5f0c-b848-46a9-ba3e-afdbfdd305fe",{"path":2454,"uuid":2455},"\u002Fblog\u002Fthe-wobbly-wheel","2540d3e0-5c81-46d5-9d22-5a48e0a67aad",{"path":2457,"uuid":2458},"\u002Fblog\u002Fthings-we-learned-in-may-2021","bea3db13-fff0-472d-9a61-3a2906ce5733",{"path":2460,"uuid":2461},"\u002Fblog\u002Fthought-leadership-or-wishful-thinking","aef6c0f0-0ca9-4a62-9d43-4331b592b0e8",{"path":2463,"uuid":2464},"\u002Fblog\u002Fthrow-off-the-plague-of-pci-when-choosing-a-website-platform","7783a005-be1d-4fdf-a466-c9a46859caa2",{"path":2466,"uuid":2467},"\u002Fblog\u002Ftrying-to-see-better-visual-accessibility-and-foxycart","63cbc43f-c6a7-41de-a638-655df407402c",{"path":2469,"uuid":2470},"\u002Fblog\u002Fturn-your-zoho-sites-website-into-a-powerful-online-store","cab7af72-852b-4794-add3-88b594545d59",{"path":2472,"uuid":2473},"\u002Fblog\u002Funacceptable-outages-today","0c779aef-3a95-4f39-befc-a76d3ab7b039",{"path":2475,"uuid":2476},"\u002Fblog\u002Fupcoming-mastercard-changes-and-what-you-should-know","9d9441a0-99bb-44d9-8ca7-899ddf9b18fc",{"path":2478,"uuid":2479},"\u002Fblog\u002Fuse-jotform-to-visually-build-your-foxy-purchase-forms","793eee8a-791a-468e-80e9-86845c1e0a61",{"path":2481,"uuid":2482},"\u002Fblog\u002Fuse-postman-to-explore-the-foxy-hypermedia-api-a-20-minute-webinar","b455463a-cdbd-4300-bf70-a66033f738f1",{"path":2484,"uuid":2485},"\u002Fblog\u002Fuse-site123s-free-website-builder-and-foxy-to-affordably-launch-an-online-store","508e4533-81b8-47b4-ae68-0a22f1542fae",{"path":2487,"uuid":2488},"\u002Fblog\u002Fusing-migration-and-pre-signup-triggers-with-aws-cognito","15159f73-0140-46f3-8220-d7dfaa8a9846",{"path":2490,"uuid":2491},"\u002Fblog\u002Fusing-product-reviews-for-market-research","5be69a65-775e-4121-a900-bee92887ecb6",{"path":2493,"uuid":2494},"\u002Fblog\u002Fv050-notes-death-taxes","072eefba-dfcc-4b3f-95cf-8a14df9797ed",{"path":2496,"uuid":2497},"\u002Fblog\u002Fv060-notes-paypal-guest-checkouts-and-more","23f3ae29-700f-4f26-bf7c-cba99889040c",{"path":2499,"uuid":2500},"\u002Fblog\u002Fversion-control-at-foxycart","6880619c-6a0d-45ec-af23-79f45a7508f8",{"path":2502,"uuid":2503},"\u002Fblog\u002Fvisiting-firehost","125b9b2b-c640-4738-a633-bced67ac6772",{"path":2505,"uuid":2506},"\u002Fblog\u002Fwant-to-say-hello-in-person-foxycart-meetups","231367e3-da02-4913-acbd-a4090893b4ca",{"path":2508,"uuid":2509},"\u002Fblog\u002Fwe-love-aws-lambda-but-its-concurrency-handling-with-sqs-is-silly","50b80eee-b86a-4331-9e4a-2681df8acb39",{"path":2511,"uuid":2512},"\u002Fblog\u002Fwere-sponsoring-longhorn-php-in-austin","73986cd0-33b2-4a7a-a98b-ed78d5fc61aa",{"path":2514,"uuid":2515},"\u002Fblog\u002Fwere-still-alive","9923418c-8816-4665-b55c-c3c0a7387661",{"path":2517,"uuid":2518},"\u002Fblog\u002Fwe-took-a-risk-with-bitcoin-should-you","99b922ec-4369-4506-bcd8-226e59a77980",{"path":2520,"uuid":2521},"\u002Fblog\u002Fwhen-a-select-element-isnt-a-select-element","c4781077-c7a9-45f0-bc15-15bc0237289a",{"path":2523,"uuid":2524},"\u002Fblog\u002Fwhy-build-a-shopping-cart-for-developers","4aa4be45-54d0-4e98-93d3-bed17f8786f3",{"path":2526,"uuid":2527},"\u002Fblog\u002Fwhy-design-matters-in-ecommerce","4fa79843-a0f7-4b13-928e-4f68fd362246",{"path":2529,"uuid":2530},"\u002Fblog\u002Fwhy-does-foxycart-support-bitcoin","004770a9-1707-43a1-82b3-681f67bf2729",{"path":2532,"uuid":2533},"\u002Fblog\u002Fwhy-good-product-photos-matter-how-to-take-them","d3ef31cf-78a5-40a8-ac61-4ba4e92bee7a",{"path":2535,"uuid":2536},"\u002Fblog\u002Fwhy-multi-homed-bandwidth-is-essential-for-ecommerce","f579774b-97ca-4774-9cab-d7b63e3f0a03",{"path":2538,"uuid":2539},"\u002Fblog\u002Fwhy-shouldnt-you-accept-bitcoin","1827dae9-cb7a-48e6-ac22-7a8aefb7cd97",{"path":2541,"uuid":2542},"\u002Fblog\u002Fwhy-we-have-a-public-phone-number","bd247a45-7c96-4d49-81ff-42429e166c43",{"path":2544,"uuid":2545},"\u002Fblog\u002Fwhy-your-colleagues-still-dont-understand-hypermedia-apis","edb23c20-ebff-4d48-b077-83fb0ee87db3",{"path":2547,"uuid":2548},"\u002Fblog\u002Fwhy-you-should-separate-your-shopping-cart-from-your-cms","9363c152-1721-4bbb-b3b0-92a44067a6f0",{"path":2550,"uuid":2551},"\u002Fblog\u002Fyear-in-review-what-happened-and-whats-to-come","80b8c9de-bb50-42fe-9a91-5380fd9f848c",{"path":2553,"uuid":2554},"\u002Fblog\u002Fyour-brain-responds-better-to-marketing-than-you-think-it-does","19e2b904-d1a9-4002-9d7d-e0c736138ecf",{"path":2556,"uuid":2557},"\u002Fblog\u002Fyour-cart-bistro-studios","15604a8b-7b52-481f-b0b3-367de708ce8d",{"path":2559},"\u002Fblog\u002F2",{"path":2561},"\u002Fblog\u002F3",{"path":2563},"\u002Fblog\u002F4",{"path":2565},"\u002Fblog\u002F5",{"path":2567},"\u002Fblog\u002F6",{"path":2569},"\u002Fblog\u002F7",{"path":2571},"\u002Fblog\u002F8",{"path":2573},"\u002Fblog\u002F9",{"path":2575},"\u002Fblog\u002F10",{"path":2577},"\u002Fblog\u002F11",{"path":2579},"\u002Fblog\u002F12",{"path":2581},"\u002Fblog\u002F13",{"path":2583},"\u002Fblog\u002F14",{"path":2585},"\u002Fblog\u002F15",{"path":2587},"\u002Fblog\u002F16",{"path":2589},"\u002Fblog\u002F17",{"path":2591},"\u002Fblog\u002F18",{"path":2593},"\u002Fblog\u002F19",{"path":2595},"\u002Fblog\u002F20",{"path":2597},"\u002Fblog\u002F21",{"path":2599},"\u002Fblog\u002F22",{"path":2601},"\u002Fblog\u002F23",{"path":2603},"\u002Fblog\u002F24",{"path":2605},"\u002Fblog\u002F25",{"path":2607},"\u002Fblog\u002F26",{"path":2609},"\u002Fblog\u002F27",{"path":2611},"\u002Fblog\u002F28",{"path":2613,"uuid":2614},"\u002Fsuccess-stories\u002Fa-better-sign","bb240bcd-96a3-4a69-a7e3-4a99f1518655",{"path":2616,"uuid":2617},"\u002Fsuccess-stories\u002Fcolina-coffee-co","b75dc0dc-0111-486b-8102-f8f3e93dbf7c",{"path":2619,"uuid":2620},"\u002Fsuccess-stories\u002Fcivilgg","42cbb6d6-a688-4d5a-85ac-cb356c0034e1",{"path":2622,"uuid":2623},"\u002Fsuccess-stories\u002Fsushi-world","1b7fbbf6-8b96-4535-9cf8-1f08036af9c6",{"path":2625,"uuid":2626},"\u002Fsuccess-stories\u002Fquagga-designs","f2d5ed8d-4b22-40e5-a034-92a31e38d59c",{"path":2628,"uuid":2629},"\u002Fsuccess-stories\u002Fabsorb","8cbef5e7-9f3d-4aeb-87b7-8d09eb2f1627",{"path":2631,"uuid":2632},"\u002Fsuccess-stories\u002Fbayer","6145ebf4-2496-423a-86f1-fcc2b2578316",{"path":2634},"\u002Fnot-found",{"path":2636},"\u002F400",{"path":2638},"\u002F403",{"path":2640},"\u002F404",{"path":2642},"\u002F500",{"path":2644},"\u002Fsearch",{"name":2646,"created_at":2647,"published_at":2648,"updated_at":2649,"id":2650,"uuid":2651,"content":2652,"slug":2822,"full_slug":2823,"sort_by_date":2824,"position":2825,"tag_list":2826,"is_startpage":2700,"parent_id":2827,"meta_data":2824,"group_id":2828,"first_published_at":2829,"release_id":2824,"lang":2830,"path":2824,"alternates":2831,"default_full_slug":2824,"translated_slugs":2824},"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":2653,"about":2654,"logos":2655,"socials":2661,"sections":2689,"component":2806,"cta_title":2807,"bottom_links":2808,"cta_subtitle":2820,"cta_button_link":2821,"cta_button_text":2756},"830983f5-c4c4-43c8-b150-86a5e3fa6dc8","Foxy’s hosted cart & payment page allow you to sell anything, using your existing website or platform.",[2656],{"id":2657,"alt":2658,"name":2658,"focus":2658,"title":2658,"filename":2659,"copyright":2658,"fieldtype":2660},14760,"","https:\u002F\u002Fa-us.storyblok.com\u002Ff\u002F1001040\u002Fx\u002F3b030847ec\u002Fb-corp.svg","asset",[2662,2671,2677,2683],{"_uid":2663,"icon":2664,"link":2665,"name":2669,"component":2670},"faf0a618-ea94-42ea-9182-03be18c43216","fa-facebook",{"id":2658,"url":2666,"linktype":2667,"fieldtype":2668,"cached_url":2666},"https:\u002F\u002Fwww.facebook.com\u002Ffoxycart","url","multilink","Facebook","footer___social",{"_uid":2672,"icon":2673,"link":2674,"name":2676,"component":2670},"14309c18-7e79-423e-b375-34555bac0811","fa-instagram",{"id":2658,"url":2675,"linktype":2667,"fieldtype":2668,"cached_url":2675},"https:\u002F\u002Fwww.instagram.com\u002Ffoxy_io","Instagram",{"_uid":2678,"icon":2679,"link":2680,"name":2682,"component":2670},"8f7fe7cf-0dd3-4596-8334-226ea466716a","fa-linkedin",{"id":2658,"url":2681,"linktype":2667,"fieldtype":2668,"cached_url":2681},"https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Ffoxycart.com","LinkedIn",{"_uid":2684,"icon":2685,"link":2686,"name":2688,"component":2670},"90a675b4-dd97-40b5-be09-00a87223d4c5","fa-youtube",{"id":2658,"url":2687,"linktype":2667,"fieldtype":2668,"cached_url":2687},"https:\u002F\u002Fwww.youtube.com\u002Fuser\u002Ffoxycart","Youtube",[2690,2718,2757,2776],{"_uid":2691,"name":2692,"items":2693,"component":2717},"82849945-282f-488c-b18d-a8d2252f514a","Company",[2694,2702,2707,2712],{"_uid":2695,"link":2696,"title":2699,"new_tab":2700,"component":2701},"1f699ab1-938b-4d9d-9825-aabcbe6f57fe",{"id":39,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2698},"story","about-us","About Us",false,"footer___menu_items",{"_uid":2703,"link":2704,"title":2706,"new_tab":2700,"component":2701},"b26b00f1-a0e7-4be2-8ab3-428b8cc841f8",{"id":96,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2705},"how-foxy-works","How Foxy Works",{"_uid":2708,"link":2709,"title":2711,"new_tab":2700,"component":2701},"b40c68a0-1ceb-4226-9515-6176534f61fe",{"id":33,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2710},"for-good","Foxy For Good",{"_uid":2713,"link":2714,"title":2716,"new_tab":2700,"component":2701},"3ad0c134-bef9-4fff-b891-e09f16109036",{"id":105,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2715},"brand-assets","Brand Assets","footer___section",{"_uid":2719,"name":2720,"items":2721,"component":2717},"a6805fa8-ac60-47f1-b8f0-f27aded0afbe","Product",[2722,2727,2732,2737,2742,2747,2752],{"_uid":2723,"link":2724,"title":2726,"new_tab":2700,"component":2701},"b39c8a4e-2383-486f-b76a-11fbb15d8134",{"id":141,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2725},"features\u002F","Features",{"_uid":2728,"link":2729,"title":2731,"new_tab":2700,"component":2701},"64f8a41f-c181-433d-bc0a-fc94e71ecbf6",{"id":12,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2730},"pricing","Pricing",{"_uid":2733,"link":2734,"title":2736,"new_tab":2700,"component":2701},"6e0b287f-fd8c-4146-9e0e-0ab0b5c9ce3c",{"id":1807,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2735},"blog\u002Fcategories\u002Fproduct-updates","Product Updates",{"_uid":2738,"link":2739,"title":2741,"new_tab":2700,"component":2701},"47e5a074-a6b5-4f1c-8c2f-89a2ae9f83eb",{"id":138,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2740},"changelogs\u002F","Changelogs",{"_uid":2743,"link":2744,"title":2746,"new_tab":2700,"component":2701},"b5c08774-542f-4ffd-b357-c94d674488b9",{"id":120,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2745},"whats-next","What's Next",{"_uid":2748,"link":2749,"title":2751,"new_tab":2700,"component":2701},"9c2704ed-6d9f-43e1-9e67-c8d91c083288",{"id":108,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2750},"compare\u002F","Compare",{"_uid":2753,"link":2754,"title":2756,"new_tab":2700,"component":2701},"5f2db35b-674b-406a-8fa7-d246633af9fe",{"id":2658,"url":2755,"linktype":2667,"fieldtype":2668,"cached_url":2755},"https:\u002F\u002Fadmin.foxy.io\u002Fsign-up","Try Foxy Free",{"_uid":2758,"name":2759,"items":2760,"component":2717},"63fa1f29-4252-4640-9922-fe310e69e54a","Security",[2761,2766,2771],{"_uid":2762,"link":2763,"title":2765,"new_tab":2700,"component":2701},"1158ddb6-9eb0-466f-8eb6-7ca2ae66c8b8",{"id":24,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2764},"security-contact","Security Contact",{"_uid":2767,"link":2768,"title":2770,"new_tab":2700,"component":2701},"9a79c54a-6022-4dfd-854b-766f5e4703ba",{"id":30,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2769},"pci","PCI Compliance",{"_uid":2772,"link":2773,"title":2775,"new_tab":2700,"component":2701},"0b85f5b6-9534-4071-b323-b39d053dd4d7",{"id":390,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2774},"help\u002Farticles\u002Four-official-domains-public-code","Domains & Codebases",{"_uid":2777,"name":2778,"items":2779,"component":2717},"998ded67-d107-49f4-8154-ca6be51671ec","Support",[2780,2785,2791,2796,2801],{"_uid":2781,"link":2782,"title":2784,"new_tab":2700,"component":2701},"594ffd35-3049-4004-bb08-0db568ebd819",{"id":114,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2783},"help\u002F","Help Center",{"_uid":2786,"link":2787,"title":2789,"new_tab":2790,"component":2701},"0a1a55ab-a985-4f9d-8b42-26da714d0c1c",{"id":2658,"url":2788,"linktype":2667,"fieldtype":2668,"cached_url":2788},"https:\u002F\u002Fwiki.foxycart.com\u002F","Documentation",true,{"_uid":2792,"link":2793,"title":2795,"new_tab":2790,"component":2701},"61e0b7c8-aadf-419b-a339-b3ccabc65bf4",{"id":2658,"url":2794,"linktype":2667,"fieldtype":2668,"cached_url":2794},"https:\u002F\u002Fapi.foxycart.com\u002F","API Documentation",{"_uid":2797,"link":2798,"title":2800,"new_tab":2790,"component":2701},"fd67a89e-1c54-4d31-94b5-64be999062d6",{"id":2658,"url":2799,"linktype":2667,"fieldtype":2668,"cached_url":2799},"https:\u002F\u002Fstatus.foxy.io\u002F","System Status",{"_uid":2802,"link":2803,"title":2805,"new_tab":2700,"component":2701},"231a6f71-e996-4ad4-b033-d4d5542f34f0",{"id":111,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2804},"contact","Contact Us","footer","Get started with our *unlimited free trial*.",[2809,2815],{"_uid":2810,"link":2811,"text":2813,"component":2814},"f0b77210-2632-45a2-8436-e57cad84d01a",{"id":99,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2812},"terms-of-service","Terms of Service","footer___bottom_links",{"_uid":2816,"link":2817,"text":2819,"component":2814},"4bd497b0-993f-4b4d-a5b7-8a49c7c8fec9",{"id":102,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2818},"privacy-policy","Privacy Policy","No credit card required.",{"id":2658,"url":2755,"linktype":2667,"fieldtype":2668,"cached_url":2755},"default-footer","navigation\u002Fdefault-footer",null,50,[],10082747,"11006268-07f9-41e9-96f3-c51fb723399d","2022-09-21T20:39:02.357Z","default",[],{"name":2833,"created_at":2834,"published_at":2835,"updated_at":2836,"id":2837,"uuid":2838,"content":2839,"slug":2921,"full_slug":2922,"sort_by_date":2824,"position":2923,"tag_list":2924,"is_startpage":2700,"parent_id":2827,"meta_data":2824,"group_id":2925,"first_published_at":2926,"release_id":2824,"lang":2830,"path":2824,"alternates":2927,"default_full_slug":2824,"translated_slugs":2824},"Blog Header","2024-08-09T18:06:34.232Z","2024-12-20T16:33:42.571Z","2024-12-20T16:33:42.584Z",10082750,"3d37f2a3-56a0-440d-910d-46752bc3ad68",{"_uid":2840,"badge":2841,"items":2842,"buttons":2886,"subitems":2887,"alignment":2901,"component":2902,"badge_link":2903,"top_menu_items":2905},"e33a7694-80ed-4829-a536-ccc69a1ee4a6","Blog",[2843,2850,2856,2861,2867,2873],{"_uid":2844,"link":2845,"title":2847,"new_tab":2700,"submenu":2848,"component":2849},"da52f9a1-b72b-4956-8c38-d53c8f404a08",{"id":1801,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2846},"blog\u002Fcategories\u002Fhow-to","How To",[],"header___item",{"_uid":2851,"link":2852,"title":2854,"new_tab":2700,"submenu":2855,"component":2849},"6d66bf9d-847a-4fce-8ed6-02bf4ad3e616",{"id":1792,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2853},"blog\u002Fcategories\u002Fbest-practices","Best Practices",[],{"_uid":2857,"link":2858,"title":2759,"new_tab":2700,"submenu":2860,"component":2849},"bfbc1f59-d307-403b-a985-4624cbe6a4d5",{"id":1810,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2859},"blog\u002Fcategories\u002Fsecurity",[],{"_uid":2862,"link":2863,"title":2865,"new_tab":2700,"submenu":2866,"component":2849},"c6ae2e48-c06d-4a28-8768-6db0402ffddf",{"id":1804,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2864},"blog\u002Fcategories\u002Fmarketing","Marketing",[],{"_uid":2868,"link":2869,"title":2871,"new_tab":2700,"submenu":2872,"component":2849},"01f12d6e-1bb9-41bc-b7b2-034ecbee0d84",{"id":1798,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2870},"blog\u002Fcategories\u002Fculture","Culture",[],{"_uid":2874,"link":2875,"title":2876,"new_tab":2700,"submenu":2877,"component":2849},"5fdd716b-74c1-4a5f-9b30-893ede39929d",{"id":2658,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2658},"What's New",[2878,2882],{"_uid":2879,"link":2880,"title":2736,"new_tab":2700,"submenu":2881,"component":2849},"d33be302-8cfc-4be2-a623-155ef5c9bcd6",{"id":1807,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2735},[],{"_uid":2883,"link":2884,"title":2741,"new_tab":2700,"submenu":2885,"component":2849},"e45ba655-019c-4d5a-ba56-d89057b9c399",{"id":138,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2740},[],[],[2888,2893,2898],{"_uid":2889,"link":2890,"text":2892,"component":2814},"47d30abe-ca41-40a0-96a9-edd30145130a",{"id":42,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2891},"home","Home",{"_uid":2894,"link":2895,"text":2897,"component":2814},"b196923b-1101-4127-91bb-c2c9d3077c4b",{"id":96,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2896},"what-foxy-does","What's Foxy",{"_uid":2899,"link":2900,"text":2756,"component":2814},"e7943c1b-5f0b-44c5-a63e-aba38c7de9fd",{"id":2658,"url":2755,"linktype":2667,"fieldtype":2668,"cached_url":2755},"right","header",{"id":135,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2904},"blog\u002F",[2906,2912,2917],{"_uid":2907,"link":2908,"title":2910,"new_tab":2700,"submenu":2911,"component":2849},"a9601db4-b3ab-40ff-b9a6-1d886aa317cc",{"id":42,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2909},"homepage","Foxy Home",[],{"_uid":2913,"link":2914,"title":2915,"new_tab":2700,"submenu":2916,"component":2849},"e5c54802-434c-4f90-a162-00a38e1d4b0d",{"id":2658,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2658},"What's Foxy?",[],{"_uid":2918,"link":2919,"title":2756,"new_tab":2700,"submenu":2920,"component":2849},"8a52540f-18f1-4f38-b7da-17f60690aaee",{"id":2658,"url":2658,"linktype":2697,"fieldtype":2668,"cached_url":2658},[],"blog-header","navigation\u002Fblog-header",-10,[],"f4698a33-9da4-417e-a96b-2ca7b8fb4d60","2022-09-27T17:04:43.424Z",[],{"name":2929,"created_at":2930,"published_at":2931,"updated_at":2932,"id":2933,"uuid":2934,"content":2935,"slug":2958,"full_slug":2961,"sort_by_date":2824,"position":2962,"tag_list":2963,"is_startpage":2700,"parent_id":2827,"meta_data":2824,"group_id":2964,"first_published_at":2965,"release_id":2824,"lang":2830,"path":2824,"alternates":2966,"default_full_slug":2824,"translated_slugs":2824},"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":2936,"name":2929,"indices":2937,"summary":2658,"component":2958,"primary_image":2959},"5e4a56e8-76f1-4790-b3a7-70f1be97d042",[2938,2943,2948,2953],{"key":2939,"_uid":2940,"icon":2658,"name":2941,"component":2942},"all","c12a3210-7323-4273-8217-5215e52efe84","All","index",{"key":2944,"_uid":2945,"icon":2946,"name":2947,"component":2942},"help_center_article","5acff080-95e4-44d3-8dcf-1b19720af382","fa-file-alt","Articles",{"key":2949,"_uid":2950,"icon":2951,"name":2952,"component":2942},"help_center_guide","b8fbc206-c083-471e-a1f0-0ebeb90a669d","fa-book","Guides",{"key":2954,"_uid":2955,"icon":2956,"name":2957,"component":2942},"blog_post","23419e83-2e56-4c4c-8a05-9fd1b3c9a9bd","fa-file-image","Blog Posts","search",{"id":2824,"alt":2824,"name":2658,"focus":2824,"title":2824,"source":2824,"filename":2658,"copyright":2824,"fieldtype":2660,"meta_data":2960},{},"navigation\u002Fsearch",60,[],"11e1fd31-95cd-4fc9-b736-8b8910663e6c","2024-10-21T23:17:05.904Z",[],{"name":2968,"created_at":2969,"published_at":2970,"updated_at":2971,"id":2972,"uuid":1951,"content":2973,"slug":4335,"full_slug":4336,"sort_by_date":2824,"position":4337,"tag_list":4338,"is_startpage":2700,"parent_id":4339,"meta_data":2824,"group_id":4340,"first_published_at":4341,"release_id":2824,"lang":2830,"path":2824,"alternates":4342,"default_full_slug":2824,"translated_slugs":2824},"Build a JAMstack Ecommerce Website with Next.js, Contentful, and Foxy","2023-03-24T17:10:36.235Z","2024-11-07T20:50:06.079Z","2024-11-07T20:50:06.121Z",64373,{"_uid":2974,"tags":2658,"title":2968,"content":2975,"summary":4308,"component":2954,"thumbnail":4314,"categories":4318},"01b28b09-9feb-40a9-a7a5-8ae913cc5b74",{"type":2976,"content":2977},"doc",[2978,2984,3050,3057,3063,3068,3073,3091,3118,3124,3129,3152,3157,3173,3179,3202,3207,3219,3224,3239,3244,3259,3264,3285,3290,3300,3305,3314,3319,3324,3329,3375,3380,3389,3532,3537,3547,3552,3580,3601,3606,3616,3621,3645,3650,3655,3664,3686,3691,3713,3728,3733,3737,3742,3747,3751,3761,3766,3792,3796,3813,3818,3823,3828,3849,3854,3859,3864,3874,3879,3889,3894,3903,3921,3926,3931,3942,3957,3962,3978,3983,3994,4033,4038,4054,4059,4069,4073,4078,4099,4104,4109,4113,4118,4123,4143,4166,4171,4183,4192,4197,4207,4212,4244,4249,4258,4263,4267,4272,4277,4281],{"type":2979,"content":2980},"paragraph",[2981],{"text":2982,"type":2983},"In this step-by-step guide, we’re going to build a ecommerce website from scratch using:","text",{"type":2985,"attrs":2986,"content":2987},"bullet_list",{"tight":2700},[2988,3002,3014,3026,3038],{"type":2989,"content":2990},"list_item",[2991],{"type":2979,"content":2992},[2993,3000],{"text":2994,"type":2983,"marks":2995},"Next.js",[2996],{"type":2997,"attrs":2998},"link",{"href":2999,"title":2824},"https:\u002F\u002Fnextjs.org\u002F",{"text":3001,"type":2983}," – a React framework that offers features like image optimization, hybrid static & server rendering, TypeScript support, smart bundling, route pre-fetching and more.",{"type":2989,"content":3003},[3004],{"type":2979,"content":3005},[3006,3012],{"text":3007,"type":2983,"marks":3008},"Contentful",[3009],{"type":2997,"attrs":3010},{"href":3011,"title":2824},"https:\u002F\u002Fwww.contentful.com\u002F",{"text":3013,"type":2983}," – a headless CMS (content management system).",{"type":2989,"content":3015},[3016],{"type":2979,"content":3017},[3018,3024],{"text":3019,"type":2983,"marks":3020},"Foxy",[3021],{"type":2997,"attrs":3022},{"href":3023,"title":2824},"https:\u002F\u002Ffoxy.io\u002F",{"text":3025,"type":2983}," – a headless ecommerce solution providing a highly customizable and powerful shopping cart and checkout experience.",{"type":2989,"content":3027},[3028],{"type":2979,"content":3029},[3030,3036],{"text":3031,"type":2983,"marks":3032},"Tailwind CSS",[3033],{"type":2997,"attrs":3034},{"href":3035,"title":2824},"https:\u002F\u002Ftailwindcss.com\u002F",{"text":3037,"type":2983}," – a utility-first CSS framework.",{"type":2989,"content":3039},[3040],{"type":2979,"content":3041},[3042,3048],{"text":3043,"type":2983,"marks":3044},"GraphQL",[3045],{"type":2997,"attrs":3046},{"href":3047,"title":2824},"https:\u002F\u002Fgraphql.org\u002F",{"text":3049,"type":2983}," – a query language for APIs.",{"type":3051,"attrs":3052,"content":3054},"heading",{"level":3053},3,[3055],{"text":3056,"type":2983},"Take a sneak peek of what we’re building",{"type":2979,"content":3058},[3059],{"type":3060,"attrs":3061},"image",{"alt":2824,"src":3062,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app-1024x580.png",{"type":2979,"content":3064},[3065],{"type":3060,"attrs":3066},{"alt":2824,"src":3067,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app1-1024x580.png",{"type":2979,"content":3069},[3070],{"type":3060,"attrs":3071},{"alt":2824,"src":3072,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app2-1024x580.png",{"type":2979,"content":3074},[3075,3077,3082,3084,3086],{"text":3076,"type":2983},"Live demo: ",{"text":3078,"type":2983,"marks":3079},"https:\u002F\u002Ffoxy-contentful-nextjs.vercel.app\u002F",[3080],{"type":2997,"attrs":3081},{"href":3078,"title":2824},{"type":3083},"hard_break",{"text":3085,"type":2983},"Source code: ",{"text":3087,"type":2983,"marks":3088},"https:\u002F\u002Fgithub.com\u002FFoxy\u002Ffoxy-contentful-nextjs-example-site",[3089],{"type":2997,"attrs":3090},{"href":3087,"title":2824},{"type":2979,"content":3092},[3093,3095,3100,3102,3108,3110,3116],{"text":3094,"type":2983},"⚠️ ",{"text":3096,"type":2983,"marks":3097},"Note",[3098],{"type":3099},"bold",{"text":3101,"type":2983},": This guide assumes you have basic knowledge of JavaScript and React. If you’re new to React, feel free to check out the ",{"text":3103,"type":2983,"marks":3104},"official React tutorial",[3105],{"type":2997,"attrs":3106},{"href":3107,"title":2824},"https:\u002F\u002Freactjs.org\u002Ftutorial\u002Ftutorial.html",{"text":3109,"type":2983}," first. It’ll also be helpful to go through the ",{"text":3111,"type":2983,"marks":3112},"basics of Next.js",[3113],{"type":2997,"attrs":3114},{"href":3115,"title":2824},"https:\u002F\u002Fnextjs.org\u002Flearn\u002Fbasics\u002Fcreate-nextjs-app",{"text":3117,"type":2983},".",{"type":3051,"attrs":3119,"content":3121},{"level":3120},2,[3122],{"text":3123,"type":2983},"Initialize project",{"type":3051,"attrs":3125,"content":3126},{"level":3053},[3127],{"text":3128,"type":2983},"Requirements",{"type":2979,"content":3130},[3131,3133,3138,3140,3144,3146,3150],{"text":3132,"type":2983},"Next.js requires Node.js 10.13 or later and Tailwind CSS requires Node.js 12.13.0 or higher. You can run ",{"text":3134,"type":2983,"marks":3135},"node -v",[3136],{"type":3137},"code",{"text":3139,"type":2983}," in the terminal to check the version on your system. ",{"text":3141,"type":2983,"marks":3142},"npm",[3143],{"type":3137},{"text":3145,"type":2983}," and ",{"text":3147,"type":2983,"marks":3148},"npx",[3149],{"type":3137},{"text":3151,"type":2983}," are also required to install dependencies and run commands, which should come out of the box when you install Node.js.",{"type":3051,"attrs":3153,"content":3154},{"level":3053},[3155],{"text":3156,"type":2983},"Create a Next.js app",{"type":2979,"content":3158},[3159,3161,3165,3167,3171],{"text":3160,"type":2983},"In the terminal, ",{"text":3162,"type":2983,"marks":3163},"cd",[3164],{"type":3137},{"text":3166,"type":2983}," to a directory you want to start this project, and run the following command to create a new Next.js app called ",{"text":3168,"type":2983,"marks":3169},"foxy-contentful-nextjs",[3170],{"type":3137},{"text":3172,"type":2983}," (or whatever you like):",{"type":3174,"attrs":3175,"content":3176},"code_block",{"params":2658},[3177],{"text":3178,"type":2983},"npx create-next-app foxy-contentful-nextjs",{"type":2979,"content":3180},[3181,3183,3187,3189,3193,3195,3200],{"text":3182,"type":2983},"After the installation is complete, ",{"text":3184,"type":2983,"marks":3185},"cd foxy-contentful-nextjs",[3186],{"type":3137},{"text":3188,"type":2983}," and run ",{"text":3190,"type":2983,"marks":3191},"npm run dev",[3192],{"type":3137},{"text":3194,"type":2983}," . The development server will start on port 3000. Open ",{"text":3196,"type":2983,"marks":3197},"http:\u002F\u002Flocalhost:3000\u002F",[3198],{"type":2997,"attrs":3199},{"href":3196,"title":2824},{"text":3201,"type":2983}," in your browser, you’ll then see a “Welcome to Next.js!” page.",{"type":3051,"attrs":3203,"content":3204},{"level":3053},[3205],{"text":3206,"type":2983},"Set up Tailwind CSS",{"type":2979,"content":3208},[3209,3211,3217],{"text":3210,"type":2983},"Following ",{"text":3212,"type":2983,"marks":3213},"Tailwind’s Next.js setup guide",[3214],{"type":2997,"attrs":3215},{"href":3216,"title":2824},"https:\u002F\u002Ftailwindcss.com\u002Fdocs\u002Fguides\u002Fnextjs",{"text":3218,"type":2983},", we can run the command below to install Tailwind and its peer-dependencies:",{"type":3174,"attrs":3220,"content":3221},{"params":2658},[3222],{"text":3223,"type":2983},"npm install -D tailwindcss@latest postcss@latest autoprefixer@latest",{"type":2979,"content":3225},[3226,3228,3232,3233,3237],{"text":3227,"type":2983},"Then, generate ",{"text":3229,"type":2983,"marks":3230},"tailwind.config.js",[3231],{"type":3137},{"text":3145,"type":2983},{"text":3234,"type":2983,"marks":3235},"postcss.config.js",[3236],{"type":3137},{"text":3238,"type":2983}," configuration files using this command:",{"type":3174,"attrs":3240,"content":3241},{"params":2658},[3242],{"text":3243,"type":2983},"npx tailwindcss init -p",{"type":2979,"content":3245},[3246,3248,3251,3253,3257],{"text":3247,"type":2983},"Open ",{"text":3229,"type":2983,"marks":3249},[3250],{"type":3137},{"text":3252,"type":2983}," in the text editor, and configure the ",{"text":3254,"type":2983,"marks":3255},"purge",[3256],{"type":3137},{"text":3258,"type":2983}," option so that unused styles would be removed in production:",{"type":3174,"attrs":3260,"content":3261},{"params":2658},[3262],{"text":3263,"type":2983},"\u002F\u002F tailwind.config.js\n\nmodule.exports = {\n  purge: [\".\u002Fpages\u002F**\u002F*.{js,ts,jsx,tsx}\", \".\u002Fcomponents\u002F**\u002F*.{js,ts,jsx,tsx}\"],\n  darkMode: false, \u002F\u002F or 'media' or 'class'\n  theme: {\n    extend: {},\n  },\n  variants: {\n    extend: {},\n  },\n  plugins: [],\n};",{"type":2979,"content":3265},[3266,3268,3272,3274,3278,3279,3283],{"text":3267,"type":2983},"After importing Tailwind in ",{"text":3269,"type":2983,"marks":3270},"pages\u002F_app.js",[3271],{"type":3137},{"text":3273,"type":2983},", we can delete the CSS files Next.js creates by default like ",{"text":3275,"type":2983,"marks":3276},"globals.css",[3277],{"type":3137},{"text":3145,"type":2983},{"text":3280,"type":2983,"marks":3281},"Home.module.css",[3282],{"type":3137},{"text":3284,"type":2983},", and any references to them.",{"type":3174,"attrs":3286,"content":3287},{"params":2658},[3288],{"text":3289,"type":2983},"\u002F\u002F pages\u002F_app.js\n\nimport \"tailwindcss\u002Ftailwind.css\";\n\nfunction MyApp({ Component, pageProps }) {\n  return \u003CComponent {...pageProps} \u002F>;\n}\n\nexport default MyApp;",{"type":2979,"content":3291},[3292,3294,3298],{"text":3293,"type":2983},"Now, let’s make some changes in the ",{"text":3295,"type":2983,"marks":3296},"index.js",[3297],{"type":3137},{"text":3299,"type":2983}," page:",{"type":3174,"attrs":3301,"content":3302},{"params":2658},[3303],{"text":3304,"type":2983},"\u002F\u002F pages\u002Findex.js\n\nexport default function Home() {\n  return (\n    \u003Cdiv className=\"px-16 py-10 md:px-24 lg:px-28\">\n      \u003Ch1 className=\"text-2xl\">Welcome to foxy-contentful-nextjs!\u003C\u002Fh1>\n    \u003C\u002Fdiv>\n  );\n}",{"type":2979,"content":3306},[3307,3309,3312],{"text":3308,"type":2983},"If the dev server was shut down in a previous step, run ",{"text":3190,"type":2983,"marks":3310},[3311],{"type":3137},{"text":3313,"type":2983}," again and we’ll see Tailwind is applied to the index page.",{"type":2979,"content":3315},[3316],{"type":3060,"attrs":3317},{"alt":2824,"src":3318,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-Screenshot-1024x580.png",{"type":3051,"attrs":3320,"content":3321},{"level":3120},[3322],{"text":3323,"type":2983},"Add products in Contentful and fetch product data",{"type":3051,"attrs":3325,"content":3326},{"level":3053},[3327],{"text":3328,"type":2983},"Set up Contentful",{"type":2979,"content":3330},[3331,3333,3337,3339,3345,3347,3351,3353,3357,3359,3362,3364,3368,3370,3374],{"text":3332,"type":2983},"Sign up or log in at ",{"text":3007,"type":2983,"marks":3334},[3335],{"type":2997,"attrs":3336},{"href":3011,"title":2824},{"text":3338,"type":2983}," and create a new empty space from the ",{"text":3340,"type":2983,"marks":3341},"dashboard",[3342],{"type":2997,"attrs":3343},{"href":3344,"title":2824},"https:\u002F\u002Fapp.contentful.com\u002F",{"text":3346,"type":2983},". From the newly created space, go to the ",{"text":3348,"type":2983,"marks":3349},"Content model",[3350],{"type":3099},{"text":3352,"type":2983}," tab and add a new content type: give it the ",{"text":3354,"type":2983,"marks":3355},"Name",[3356],{"type":3099},{"text":3358,"type":2983}," ",{"text":2720,"type":2983,"marks":3360},[3361],{"type":3137},{"text":3363,"type":2983},", and the ",{"text":3365,"type":2983,"marks":3366},"Api Identifier",[3367],{"type":3099},{"text":3369,"type":2983}," will be auto-generated as ",{"text":3371,"type":2983,"marks":3372},"product",[3373],{"type":3137},{"text":3117,"type":2983},{"type":2979,"content":3376},[3377],{"type":3060,"attrs":3378},{"alt":2824,"src":3379,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreen-Shot-2021-06-02-at-5.23.05-PM-1-1024x762.png",{"type":2979,"content":3381},[3382,3384,3387],{"text":3383,"type":2983},"Then, add the following fields to the ",{"text":2720,"type":2983,"marks":3385},[3386],{"type":3137},{"text":3388,"type":2983}," model and configure all fields as required:",{"type":2985,"attrs":3390,"content":3391},{"tight":2700},[3392,3414,3449,3468,3486,3504,3518],{"type":2989,"content":3393},[3394],{"type":2979,"content":3395},[3396,3400,3402,3406,3408,3412],{"text":3397,"type":2983,"marks":3398},"name",[3399],{"type":3137},{"text":3401,"type":2983}," – ",{"text":3403,"type":2983,"marks":3404},"Text",[3405],{"type":3099},{"text":3407,"type":2983}," field (type ",{"text":3409,"type":2983,"marks":3410},"short text",[3411],{"type":3099},{"text":3413,"type":2983},")",{"type":2989,"content":3415},[3416],{"type":2979,"content":3417},[3418,3422,3423,3426,3427,3430,3432,3436,3438,3442,3444,3447],{"text":3419,"type":2983,"marks":3420},"slug",[3421],{"type":3137},{"text":3401,"type":2983},{"text":3403,"type":2983,"marks":3424},[3425],{"type":3099},{"text":3407,"type":2983},{"text":3409,"type":2983,"marks":3428},[3429],{"type":3099},{"text":3431,"type":2983},"). You can optionally go to the settings of this field, then under ",{"text":3433,"type":2983,"marks":3434},"Appearance",[3435],{"type":3099},{"text":3437,"type":2983},", select ",{"text":3439,"type":2983,"marks":3440},"Slug",[3441],{"type":3099},{"text":3443,"type":2983}," so this field is displayed as a slug of the ",{"text":3397,"type":2983,"marks":3445},[3446],{"type":3137},{"text":3448,"type":2983}," field",{"type":2989,"content":3450},[3451],{"type":2979,"content":3452},[3453,3457,3458,3462,3463,3467],{"text":3454,"type":2983,"marks":3455},"price",[3456],{"type":3137},{"text":3401,"type":2983},{"text":3459,"type":2983,"marks":3460},"Number",[3461],{"type":3099},{"text":3407,"type":2983},{"text":3464,"type":2983,"marks":3465},"Decimal",[3466],{"type":3099},{"text":3413,"type":2983},{"type":2989,"content":3469},[3470],{"type":2979,"content":3471},[3472,3475,3476,3480,3481,3485],{"text":3060,"type":2983,"marks":3473},[3474],{"type":3137},{"text":3401,"type":2983},{"text":3477,"type":2983,"marks":3478},"Media",[3479],{"type":3099},{"text":3407,"type":2983},{"text":3482,"type":2983,"marks":3483},"One file",[3484],{"type":3099},{"text":3413,"type":2983},{"type":2989,"content":3487},[3488],{"type":2979,"content":3489},[3490,3494,3495,3498,3499,3503],{"text":3491,"type":2983,"marks":3492},"inventory",[3493],{"type":3137},{"text":3401,"type":2983},{"text":3459,"type":2983,"marks":3496},[3497],{"type":3099},{"text":3407,"type":2983},{"text":3500,"type":2983,"marks":3501},"Integer",[3502],{"type":3099},{"text":3413,"type":2983},{"type":2989,"content":3505},[3506],{"type":2979,"content":3507},[3508,3512,3513,3517],{"text":3509,"type":2983,"marks":3510},"description",[3511],{"type":3137},{"text":3401,"type":2983},{"text":3514,"type":2983,"marks":3515},"Rich text",[3516],{"type":3099},{"text":3448,"type":2983},{"type":2989,"content":3519},[3520],{"type":2979,"content":3521},[3522,3526,3527,3531],{"text":3523,"type":2983,"marks":3524},"featured",[3525],{"type":3137},{"text":3401,"type":2983},{"text":3528,"type":2983,"marks":3529},"Boolean",[3530],{"type":3099},{"text":3448,"type":2983},{"type":2979,"content":3533},[3534],{"type":3060,"attrs":3535},{"alt":2824,"src":3536,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreen-Shot-2021-06-02-at-5.27.50-PM-1024x576.png",{"type":2979,"content":3538},[3539,3541,3545],{"text":3540,"type":2983},"Click “save” in the upper right. Next, head to the ",{"text":3542,"type":2983,"marks":3543},"Content",[3544],{"type":3099},{"text":3546,"type":2983}," tab, add a few products and publish.",{"type":3051,"attrs":3548,"content":3549},{"level":3053},[3550],{"text":3551,"type":2983},"Fetch product data",{"type":2979,"content":3553},[3554,3556,3560,3562,3566,3568,3572,3574,3578],{"text":3555,"type":2983},"Before we get into the code, we first need to get the API keys so our Next.js app can communicate with Contentful. Go ",{"text":3557,"type":2983,"marks":3558},"Settings",[3559],{"type":3099},{"text":3561,"type":2983}," > ",{"text":3563,"type":2983,"marks":3564},"API keys",[3565],{"type":3099},{"text":3567,"type":2983}," from the current Contentful space. From the ",{"text":3569,"type":2983,"marks":3570},"Content delivery \u002F preview tokens",[3571],{"type":3099},{"text":3573,"type":2983}," tab, click the ",{"text":3575,"type":2983,"marks":3576},"Add API key",[3577],{"type":3099},{"text":3579,"type":2983}," button to generate the access tokens. Give it a name and description that makes sense for what you’re building.",{"type":2979,"content":3581},[3582,3584,3588,3590,3594,3595,3599],{"text":3583,"type":2983},"Back in the code editor, create a new file called ",{"text":3585,"type":2983,"marks":3586},".env.local",[3587],{"type":3137},{"text":3589,"type":2983}," in the root directory for storing all the environment variables, and paste the ",{"text":3591,"type":2983,"marks":3592},"Space ID",[3593],{"type":3099},{"text":3145,"type":2983},{"text":3596,"type":2983,"marks":3597},"Content Delivery API – access token",[3598],{"type":3099},{"text":3600,"type":2983}," values in it:",{"type":3174,"attrs":3602,"content":3603},{"params":2658},[3604],{"text":3605,"type":2983},"\u002F\u002F .env.local\n\nCONTENTFUL_SPACE_ID=\nCONTENTFUL_ACCESS_TOKEN=",{"type":2979,"content":3607},[3608,3610,3614],{"text":3609,"type":2983},"We’ll use ",{"text":3611,"type":2983,"marks":3612},"[axios](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Faxios)",[3613],{"type":3137},{"text":3615,"type":2983}," (an easy-to-use library to make HTTP requests) lfor data fetching, so open the terminal and install:",{"type":3174,"attrs":3617,"content":3618},{"params":2658},[3619],{"text":3620,"type":2983},"npm install axios",{"type":2979,"content":3622},[3623,3625,3629,3631,3635,3637,3643],{"text":3624,"type":2983},"Then, create a new folder ",{"text":3626,"type":2983,"marks":3627},"lib",[3628],{"type":3137},{"text":3630,"type":2983}," for some helper functions. Inside the folder, create a ",{"text":3632,"type":2983,"marks":3633},"api.js",[3634],{"type":3137},{"text":3636,"type":2983}," file, where we’ll write the functions to fetch data via the ",{"text":3638,"type":2983,"marks":3639},"Contentful GraphQL Content API",[3640],{"type":2997,"attrs":3641},{"href":3642,"title":2824},"https:\u002F\u002Fwww.contentful.com\u002Fdevelopers\u002Fdocs\u002Freferences\u002Fgraphql\u002F",{"text":3644,"type":2983},". Review the following code to get an idea of what it’s doing.",{"type":3174,"attrs":3646,"content":3647},{"params":2658},[3648],{"text":3649,"type":2983},"\u002F\u002F lib\u002Fapi.js\n\nimport axios from \"axios\";\n\n\u002F\u002F product fields to fetch\nconst PRODUCT_GRAPHQL_FIELDS = `\nname\nslug\nprice\nimage {\n  url\n}\ninventory\ndescription {\n  json\n}\n`;\n\n\u002F\u002F connect Contentful\nasync function fetchGraphQL(query) {\n  try {\n    const res = await axios.post(\n      `https:\u002F\u002Fgraphql.contentful.com\u002Fcontent\u002Fv1\u002Fspaces\u002F${process.env.CONTENTFUL_SPACE_ID}`,\n      { query },\n      {\n        headers: {\n          \"Content-Type\": \"application\u002Fjson\",\n          Authorization: `Bearer ${process.env.CONTENTFUL_ACCESS_TOKEN}`,\n        },\n      }\n    );\n    return res.data;\n  } catch (error) {\n    console.error(\"Failed to fetch Contentful\");\n  }\n}\n\n\u002F\u002F helper functions for extracting product entries from response\nfunction extractProduct(fetchResponse) {\n  return fetchResponse?.data?.productCollection?.items?.[0];\n}\n\nfunction extractProductEntries(fetchResponse) {\n  return fetchResponse?.data?.productCollection?.items;\n}\n\n\u002F\u002F get products whose featured field is set to true\nexport async function getFeaturedProducts() {\n  const entries = await fetchGraphQL(\n    `query {\n      productCollection(where: { featured: true }) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return extractProductEntries(entries);\n}\n\n\u002F\u002F get all products\nexport async function getAllProducts() {\n  const entries = await fetchGraphQL(\n    `query {\n      productCollection(where: { slug_exists: true }) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return extractProductEntries(entries);\n}\n\n\u002F\u002F get a specific product by its slug\nexport async function getProductBySlug(slug) {\n  const entry = await fetchGraphQL(\n    `query {\n      productCollection(where: { slug: \"${slug}\" }, limit: 1) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return {\n    product: extractProduct(entry),\n  };\n}",{"type":3051,"attrs":3651,"content":3652},{"level":3120},[3653],{"text":3654,"type":2983},"Create pages and components",{"type":3051,"attrs":3656,"content":3657},{"level":3053},[3658,3662],{"text":3659,"type":2983,"marks":3660},"\u003CLayout \u002F>",[3661],{"type":3137},{"text":3663,"type":2983}," component",{"type":2979,"content":3665},[3666,3668,3672,3674,3678,3680,3684],{"text":3667,"type":2983},"First, create a ",{"text":3669,"type":2983,"marks":3670},"components",[3671],{"type":3137},{"text":3673,"type":2983}," folder and a ",{"text":3675,"type":2983,"marks":3676},"layout.js",[3677],{"type":3137},{"text":3679,"type":2983}," file in it. We’ll create a ",{"text":3681,"type":2983,"marks":3682},"Layout",[3683],{"type":3137},{"text":3685,"type":2983}," component that wraps the entire app. Note that the class names are Tailwind classes.",{"type":3174,"attrs":3687,"content":3688},{"params":2658},[3689],{"text":3690,"type":2983},"\u002F\u002F components\u002Flayout.js\n\nimport Link from \"next\u002Flink\";\n\nexport default function Layout({ children }) {\n  return (\n    \u003C>\n      \u003Cnav className=\"flex items-center h-16 bg-gray-600 text-gray-100 tracking-widest\">\n        \u003Ch1 className=\"flex-grow ml-5 text-2xl font-semibold\">Foxy Store\u003C\u002Fh1>\n\n        \u003CLink href=\"\u002F\">\n          \u003Ca className=\"mr-5 text-xl font-medium hover:underline\">Home\u003C\u002Fa>\n        \u003C\u002FLink>\n\n        \u003CLink href=\"\u002Fproducts\">\n          \u003Ca className=\"mr-5 text-xl font-medium hover:underline\">Products\u003C\u002Fa>\n        \u003C\u002FLink>\n\n        \u003Ca className=\"mr-5 text-xl font-medium hover:underline cursor-pointer\">\n          Cart\n        \u003C\u002Fa>\n      \u003C\u002Fnav>\n\n      \u003Cmain>{children}\u003C\u002Fmain>\n    \u003C\u002F>\n  );\n}",{"type":2979,"content":3692},[3693,3695,3699,3701,3705,3707,3711],{"text":3694,"type":2983},"💡 In Next.js, we use the ",{"text":3696,"type":2983,"marks":3697},"Link",[3698],{"type":3137},{"text":3700,"type":2983}," component from ",{"text":3702,"type":2983,"marks":3703},"next\u002Flink",[3704],{"type":3137},{"text":3706,"type":2983}," to wrap the ",{"text":3708,"type":2983,"marks":3709},"\u003Ca>",[3710],{"type":3137},{"text":3712,"type":2983}," tag. This component allows us to do client-side navigation to a different page in the application.",{"type":2979,"content":3714},[3715,3717,3721,3723,3726],{"text":3716,"type":2983},"Then edit the ",{"text":3718,"type":2983,"marks":3719},"_app.js",[3720],{"type":3137},{"text":3722,"type":2983}," file to include the ",{"text":3681,"type":2983,"marks":3724},[3725],{"type":3137},{"text":3727,"type":2983}," component across the application:",{"type":3174,"attrs":3729,"content":3730},{"params":2658},[3731],{"text":3732,"type":2983},"\u002F\u002F pages\u002F_app.js\n\nimport \"tailwindcss\u002Ftailwind.css\";\nimport Layout from \"..\u002Fcomponents\u002Flayout\";\n\nfunction MyApp({ Component, pageProps }) {\n  return (\n    \u003CLayout>\n      \u003CComponent {...pageProps} \u002F>\n    \u003C\u002FLayout>\n  );\n}\n\nexport default MyApp;",{"type":2979,"content":3734},[3735],{"text":3736,"type":2983},"And we’ll see a nav bar on the top of the page.",{"type":2979,"content":3738},[3739],{"type":3060,"attrs":3740},{"alt":2824,"src":3741,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-Screenshot1-1024x580.png",{"type":3051,"attrs":3743,"content":3744},{"level":3053},[3745],{"text":3746,"type":2983},"Home page with featured products",{"type":2979,"content":3748},[3749],{"text":3750,"type":2983},"💡 With the file-system based router in Next.js, we can easily create pages that are associated with a route based on their file name.",{"type":2979,"content":3752},[3753,3755,3759],{"text":3754,"type":2983},"Modify the ",{"text":3756,"type":2983,"marks":3757},"pages\u002Findex.js",[3758],{"type":3137},{"text":3760,"type":2983}," page to display the products that are configured as featured in Contentful:",{"type":3174,"attrs":3762,"content":3763},{"params":2658},[3764],{"text":3765,"type":2983},"\u002F\u002F pages\u002Findex.js\n\nimport Link from \"next\u002Flink\";\nimport Image from \"next\u002Fimage\";\n\nimport { getFeaturedProducts } from \"..\u002Flib\u002Fapi\";\n\nexport default function Home({ featuredProducts }) {\n  return (\n    \u003Cdiv className=\"px-16 py-10 md:px-24 lg:px-28\">\n      \u003Ch2 className=\"text-2xl mb-2\">Featured Products\u003C\u002Fh2>\n\n      \u003Cdiv className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-10\">\n        {featuredProducts.map((product) => (\n          \u003Cdiv\n            key={product.slug}\n            className=\"rounded bg-white border-gray-200 shadow-md hover:shadow-xl flex justify-center flex-col px-2 pt-3 pb-5\"\n          >\n            \u003CImage\n              src={product.image.url}\n              layout=\"intrinsic\"\n              width={550}\n              height={370}\n            \u002F>\n\n            \u003Cdiv className=\"mt-4 flex items-baseline\">\n              \u003Ch1 className=\"ml-1 text-xl flex-1\">{product.name}\u003C\u002Fh1>\n              \u003Ch2 className=\"mr-2 text-lg text-gray-500\">${product.price}\u003C\u002Fh2>\n            \u003C\u002Fdiv>\n\n            \u003Cdiv className=\"mt-4\">\n              \u003Ca className=\"ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer\">\n                Buy Now\n              \u003C\u002Fa>\n              \u003CLink\n                as={`\u002Fproducts\u002F${product.slug}`}\n                href=\"\u002Fproducts\u002F[slug]\"\n                passHref\n              >\n                \u003Ca className=\"ml-3 border border-gray-400 rounded px-4 py-2 text-gray-600 cursor-pointer\">\n                  Details\n                \u003C\u002Fa>\n              \u003C\u002FLink>\n            \u003C\u002Fdiv>\n          \u003C\u002Fdiv>\n        ))}\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  );\n}\n\nexport const getStaticProps = async () => {\n  const featuredProducts = await getFeaturedProducts();\n\n  return {\n    props: { featuredProducts },\n  };\n};",{"type":2979,"content":3767},[3768,3770,3774,3776,3780,3782,3786,3788,3791],{"text":3769,"type":2983},"💡 If we export an ",{"text":3771,"type":2983,"marks":3772},"async",[3773],{"type":3137},{"text":3775,"type":2983}," function called ",{"text":3777,"type":2983,"marks":3778},"getStaticProps",[3779],{"type":3137},{"text":3781,"type":2983}," from a page, Next.js will pre-render this page ",{"text":3783,"type":2983,"marks":3784},"at build time",[3785],{"type":3099},{"text":3787,"type":2983}," using the props returned by ",{"text":3777,"type":2983,"marks":3789},[3790],{"type":3137},{"text":3117,"type":2983},{"type":2979,"content":3793},[3794],{"text":3795,"type":2983},"⚠️ If the above code errors, take a look at the error message and try solving it. Or just continue on…",{"type":2979,"content":3797},[3798,3800,3807,3811],{"text":3799,"type":2983},"In the above code, we use the new ",{"text":3801,"type":2983,"marks":3802},"\u003CImage \u002F>",[3803,3806],{"type":2997,"attrs":3804},{"href":3805,"title":2824},"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fbasic-features\u002Fimage-optimization",{"type":3137},{"text":3663,"type":2983,"marks":3808},[3809],{"type":2997,"attrs":3810},{"href":3805,"title":2824},{"text":3812,"type":2983}," introduced in Next.js 10, which offers automatic image optimization. To properly show images hosted on an external URL, we’ll need to specify the image domains in the next.config.js file:",{"type":3174,"attrs":3814,"content":3815},{"params":2658},[3816],{"text":3817,"type":2983},"\u002F\u002F next.config.js\n\nmodule.exports = {\n  images: {\n    domains: [\"images.ctfassets.net\"],\n  },\n};",{"type":2979,"content":3819},[3820],{"type":3060,"attrs":3821},{"alt":2824,"src":3822,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-34-18-https-foxy-contentful-nextjs-vercel-app-1024x642.png",{"type":3051,"attrs":3824,"content":3825},{"level":3053},[3826],{"text":3827,"type":2983},"All products page",{"type":2979,"content":3829},[3830,3832,3836,3838,3842,3844,3847],{"text":3831,"type":2983},"Let’s also create a page that contains all products, which would be similar to the home page: create a ",{"text":3833,"type":2983,"marks":3834},"products",[3835],{"type":3137},{"text":3837,"type":2983}," directory under ",{"text":3839,"type":2983,"marks":3840},"pages",[3841],{"type":3137},{"text":3843,"type":2983}," , then create an ",{"text":3295,"type":2983,"marks":3845},[3846],{"type":3137},{"text":3848,"type":2983}," file that contains all products:",{"type":3174,"attrs":3850,"content":3851},{"params":2658},[3852],{"text":3853,"type":2983},"\u002F\u002F pages\u002Fproducts\u002Findex.js\n\nimport Link from \"next\u002Flink\";\nimport Image from \"next\u002Fimage\";\n\nimport { getAllProducts } from \"..\u002F..\u002Flib\u002Fapi\";\n\nexport default function AllProducts({ allProducts }) {\n  return (\n    \u003Cdiv className=\"px-16 py-10 md:px-24 lg:px-28\">\n      \u003Ch2 className=\"text-2xl mb-2\">All Products\u003C\u002Fh2>\n\n      \u003Cdiv className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-10\">\n        {allProducts.map((product) => (\n          \u003Cdiv\n            key={product.slug}\n            className=\"rounded bg-white border-gray-200 shadow-md hover:shadow-xl flex justify-center flex-col px-2 pt-3 pb-5\"\n          >\n            \u003CImage\n              src={product.image.url}\n              layout=\"intrinsic\"\n              width={550}\n              height={370}\n            \u002F>\n\n            \u003Cdiv className=\"mt-4 flex items-baseline\">\n              \u003Ch1 className=\"ml-1 text-xl flex-1\">{product.name}\u003C\u002Fh1>\n              \u003Ch2 className=\"mr-2 text-lg text-gray-500\">${product.price}\u003C\u002Fh2>\n            \u003C\u002Fdiv>\n\n            \u003Cdiv className=\"mt-4\">\n              \u003Ca className=\"ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer\">\n                Buy Now\n              \u003C\u002Fa>\n              \u003CLink\n                as={`\u002Fproducts\u002F${product.slug}`}\n                href=\"\u002Fproducts\u002F[slug]\"\n                passHref\n              >\n                \u003Ca className=\"ml-3 border border-gray-400 rounded px-4 py-2 text-gray-600 cursor-pointer\">\n                  Details\n                \u003C\u002Fa>\n              \u003C\u002FLink>\n            \u003C\u002Fdiv>\n          \u003C\u002Fdiv>\n        ))}\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  );\n}\n\nexport const getStaticProps = async () => {\n  const allProducts = await getAllProducts();\n\n  return {\n    props: { allProducts },\n  };\n};",{"type":2979,"content":3855},[3856],{"type":3060,"attrs":3857},{"alt":2824,"src":3858,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-35-14-https-foxy-contentful-nextjs-vercel-app-1024x919.png",{"type":3051,"attrs":3860,"content":3861},{"level":3053},[3862],{"text":3863,"type":2983},"Pages for each product",{"type":2979,"content":3865},[3866,3868,3872],{"text":3867,"type":2983},"Remember we’ve configured the product description field as a rich text field in Contentful? This type of field would be returned as a object in response, so we’ll use ",{"text":3869,"type":2983,"marks":3870},"[@contentful\u002Frich-text-react-renderer](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@contentful\u002Frich-text-react-renderer)",[3871],{"type":3137},{"text":3873,"type":2983}," to parse the text content in the object:",{"type":3174,"attrs":3875,"content":3876},{"params":2658},[3877],{"text":3878,"type":2983},"npm install @contentful\u002Frich-text-react-renderer",{"type":2979,"content":3880},[3881,3883,3887],{"text":3882,"type":2983},"Create dynamic route pages for products in ",{"text":3884,"type":2983,"marks":3885},"pages\u002Fproducts\u002F[slug].js",[3886],{"type":3137},{"text":3888,"type":2983},", with an add-to-cart form inside:",{"type":3174,"attrs":3890,"content":3891},{"params":2658},[3892],{"text":3893,"type":2983},"\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\nimport Image from \"next\u002Fimage\";\nimport { documentToReactComponents } from \"@contentful\u002Frich-text-react-renderer\";\n\nimport { getAllProducts, getProductBySlug } from \"..\u002F..\u002Flib\u002Fapi\";\n\nexport default function Product({ product }) {\n  return (\n    \u003Cdiv className=\"px-16 py-10 md:px-24 lg:px-28\">\n      \u003Cdiv className=\"mt-8 grid lg:grid-cols-2\">\n        \u003Cdiv>\n          \u003CImage\n            src={product.image.url}\n            layout=\"responsive\"\n            width={550}\n            height={350}\n          \u002F>\n        \u003C\u002Fdiv>\n\n        \u003Cdiv className=\"py-5 lg:px-10 lg:py-3\">\n          \u003Ch1 className=\"text-3xl\">{product.name}\u003C\u002Fh1>\n          \u003Ch2 className=\"text-2xl text-gray-600\">${product.price}\u003C\u002Fh2>\n          \u003Cdiv className=\"my-2 mx-1\">\n            {documentToReactComponents(product.description.json)}\n          \u003C\u002Fdiv>\n\n          \u003Cform>\n            \u003Cinput\n              type=\"number\"\n              min=\"1\"\n              step=\"1\"\n              defaultValue=\"1\"\n              name=\"quantity\"\n              placeholder=\"Quantity\"\n              className=\"mt-5 mb-3 border border-gray-400 rounded py-2 px-3 block\"\n            \u002F>\n\n            \u003Cbutton\n              type=\"submit\"\n              className=\"bg-gray-600 rounded py-2 px-6 text-gray-100 cursor-pointer\"\n            >\n              Add to Cart\n            \u003C\u002Fbutton>\n          \u003C\u002Fform>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  );\n}\n\nexport async function getStaticProps({ params }) {\n  const data = await getProductBySlug(params.slug);\n\n  return {\n    props: {\n      product: data?.product ?? null,\n    },\n  };\n}\n\nexport async function getStaticPaths() {\n  const allProducts = await getAllProducts();\n\n  return {\n    paths: allProducts?.map(({ slug }) => `\u002Fproducts\u002F${slug}`) ?? [],\n    fallback: false,\n  };\n}",{"type":2979,"content":3895},[3896,3898,3901],{"text":3897,"type":2983},"💡 If a page has dynamic routes and uses ",{"text":3777,"type":2983,"marks":3899},[3900],{"type":3137},{"text":3902,"type":2983}," it needs to define a list of paths that have to be rendered to HTML at build time.",{"type":2979,"content":3904},[3905,3907,3910,3911,3915,3917,3920],{"text":3906,"type":2983},"If we export an ",{"text":3771,"type":2983,"marks":3908},[3909],{"type":3137},{"text":3775,"type":2983},{"text":3912,"type":2983,"marks":3913},"getStaticPaths",[3914],{"type":3137},{"text":3916,"type":2983}," from a page that uses dynamic routes, Next.js will statically pre-render all the paths specified by ",{"text":3912,"type":2983,"marks":3918},[3919],{"type":3137},{"text":3117,"type":2983},{"type":2979,"content":3922},[3923],{"type":3060,"attrs":3924},{"alt":2824,"src":3925,"title":2824},"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-36-19-https-foxy-contentful-nextjs-vercel-app-1024x573.png",{"type":3051,"attrs":3927,"content":3928},{"level":3120},[3929],{"text":3930,"type":2983},"Integrate Foxy into the Next.js app",{"type":2979,"content":3932},[3933,3935,3941],{"text":3934,"type":2983},"If you haven’t already, ",{"text":3936,"type":2983,"marks":3937},"sign up for a free account at Foxy",[3938],{"type":2997,"attrs":3939},{"href":3940,"title":2824},"https:\u002F\u002Fadmin.foxycart.com\u002Fsignup\u002F",{"text":3117,"type":2983},{"type":2979,"content":3943},[3944,3946,3949,3951,3955],{"text":3945,"type":2983},"Add a new variable for Foxy subdomain in the ",{"text":3585,"type":2983,"marks":3947},[3948],{"type":3137},{"text":3950,"type":2983}," file, with a ",{"text":3952,"type":2983,"marks":3953},"NEXT_PUBLIC_",[3954],{"type":3137},{"text":3956,"type":2983}," prefix so it’s exposed to the browser:",{"type":3174,"attrs":3958,"content":3959},{"params":2658},[3960],{"text":3961,"type":2983},"\u002F\u002F .env.local\n\nNEXT_PUBLIC_FOXY_SUBDOMAIN=",{"type":2979,"content":3963},[3964,3966,3970,3972,3976],{"text":3965,"type":2983},"We’ll need to include Foxy’s script before ",{"text":3967,"type":2983,"marks":3968},"\u003C\u002Fbody>",[3969],{"type":3137},{"text":3971,"type":2983}," tag, which should be added in the ",{"text":3973,"type":2983,"marks":3974},"_document.js",[3975],{"type":3137},{"text":3977,"type":2983}," file in Next.js:",{"type":3174,"attrs":3979,"content":3980},{"params":2658},[3981],{"text":3982,"type":2983},"\u002F\u002F pages\u002F_document.js\n\nimport Document, { Html, Head, Main, NextScript } from \"next\u002Fdocument\";\n\nexport default class MyDocument extends Document {\n  render() {\n    return (\n      \u003CHtml lang=\"en\">\n        \u003CHead \u002F>\n        \u003Cbody>\n          \u003CMain \u002F>\n          \u003CNextScript \u002F>\n\n          {\u002F* FOXYCART *\u002F}\n          \u003Cscript\n            data-cfasync=\"false\"\n            src={`https:\u002F\u002Fcdn.foxycart.com\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}\u002Floader.js`}\n            async\n            defer\n          >\u003C\u002Fscript>\n        \u003C\u002Fbody>\n      \u003C\u002FHtml>\n    );\n  }\n}",{"type":2979,"content":3984},[3985,3987,3993],{"text":3986,"type":2983},"There are two ways to add a product to cart in Foxy – via a link or a form, then modify the URL parameters or form elements as needed. Some examples can be found on the homepage ",{"text":3988,"type":2983,"marks":3989},"here",[3990],{"type":2997,"attrs":3991},{"href":3992,"title":2824},"https:\u002F\u002Ffoxy.io\u002F#start",{"text":3117,"type":2983},{"type":2979,"content":3995},[3996,3998,4001,4003,4006,4007,4011,4012,4015,4016,4019,4021,4025,4027,4032],{"text":3997,"type":2983},"In addition to some core product information like ",{"text":3397,"type":2983,"marks":3999},[4000],{"type":3137},{"text":4002,"type":2983},", ",{"text":3454,"type":2983,"marks":4004},[4005],{"type":3137},{"text":4002,"type":2983},{"text":4008,"type":2983,"marks":4009},"quantity",[4010],{"type":3137},{"text":4002,"type":2983},{"text":3137,"type":2983,"marks":4013},[4014],{"type":3137},{"text":4002,"type":2983},{"text":3060,"type":2983,"marks":4017},[4018],{"type":3137},{"text":4020,"type":2983},", we can also add a ",{"text":4022,"type":2983,"marks":4023},"quantity_max",[4024],{"type":3137},{"text":4026,"type":2983}," parameter that indicates the product’s current inventory to prevent oversell. A complete list of product parameters can be found ",{"text":3988,"type":2983,"marks":4028},[4029],{"type":2997,"attrs":4030},{"href":4031,"title":2824},"https:\u002F\u002Fdocs.foxycart.com\u002Fv\u002F2.0\u002Fproducts#a_complete_list_of_product_parameters",{"text":3117,"type":2983},{"type":3051,"attrs":4034,"content":4035},{"level":3053},[4036],{"text":4037,"type":2983},"Buy Now button",{"type":2979,"content":4039},[4040,4042,4046,4048,4052],{"text":4041,"type":2983},"A Buy Now button often refers to skipping the shopping cart and going to checkout directly. In Foxy, we can do this by attaching a ",{"text":4043,"type":2983,"marks":4044},"&cart=checkout",[4045],{"type":3137},{"text":4047,"type":2983}," parameter to the purchase link. So, modify the ",{"text":4049,"type":2983,"marks":4050},"href",[4051],{"type":3137},{"text":4053,"type":2983}," attribute in the Buy Now buttons on the featured products page and all products page to this:",{"type":3174,"attrs":4055,"content":4056},{"params":2658},[4057],{"text":4058,"type":2983},"\u002F\u002F pages\u002Findex.js && pages\u002Fproducts\u002Findex.js\n\n\u003Ca\n  href={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?name=${encodeURIComponent(product.name)}&price=${product.price}&image=${encodeURIComponent(product.image.url)}&code=${encodeURIComponent(product.slug)}&quantity_max=${product.inventory}&cart=checkout`}  \n  className=\"ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer\"\n>\n  Buy Now\n\u003C\u002Fa>",{"type":2979,"content":4060},[4061,4063,4067],{"text":4062,"type":2983},"💡 Wrapping the URL parameters in ",{"text":4064,"type":2983,"marks":4065},"encodeURIComponent()",[4066],{"type":3137},{"text":4068,"type":2983}," encodes them so that they get passed to Foxy correctly.",{"type":2979,"content":4070},[4071],{"text":4072,"type":2983},"🔐 You may be thinking “Wait a minute, those values can be changed by a website visitor!” Don’t worry. We’ll lock things down a little further down the page.",{"type":3051,"attrs":4074,"content":4075},{"level":3053},[4076],{"text":4077,"type":2983},"Add-to-cart form",{"type":2979,"content":4079},[4080,4082,4086,4087,4091,4093,4097],{"text":4081,"type":2983},"For a purchase form, besides adding the ",{"text":4083,"type":2983,"marks":4084},"action",[4085],{"type":3137},{"text":3145,"type":2983},{"text":4088,"type":2983,"marks":4089},"method",[4090],{"type":3137},{"text":4092,"type":2983}," attributes to the ",{"text":4094,"type":2983,"marks":4095},"form",[4096],{"type":3137},{"text":4098,"type":2983}," element, we also need some elements to pass the product details to the cart, so the add-to-cart form on the product page will look something like this:",{"type":3174,"attrs":4100,"content":4101},{"params":2658},[4102],{"text":4103,"type":2983},"\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\n\u003Cform\n  action={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart`}\n  method=\"POST\"\n>\n  \u003Cinput type=\"hidden\" name=\"name\" value={product.name} \u002F>\n  \u003Cinput type=\"hidden\" name=\"price\" value={product.price} \u002F>\n  \u003Cinput type=\"hidden\" name=\"quantity_max\" value={product.inventory} \u002F>\n  \u003Cinput type=\"hidden\" name=\"image\" value={product.image.url} \u002F>\n  ...\n\u003C\u002Fform>",{"type":3051,"attrs":4105,"content":4106},{"level":3053},[4107],{"text":4108,"type":2983},"Mini-cart",{"type":2979,"content":4110},[4111],{"text":4112,"type":2983},"Let’s also add a quick link in the navbar to open the cart and indicate the product quantity in cart:",{"type":3174,"attrs":4114,"content":4115},{"params":2658},[4116],{"text":4117,"type":2983},"\u002F\u002F components\u002Flayout.js\n\n\u003Ca\n  href={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?cart=view`}\n  className=\"mr-5 text-xl font-medium hover:underline cursor-pointer\"\n>\n  Cart (\u003Cspan data-fc-id=\"minicart-quantity\">0\u003C\u002Fspan>)\n\u003C\u002Fa>",{"type":3051,"attrs":4119,"content":4120},{"level":3120},[4121],{"text":4122,"type":2983},"Add Foxy HMAC cart validation",{"type":2979,"content":4124},[4125,4127,4133,4135,4141],{"text":4126,"type":2983},"You probably know how easy is to modify the HTML on a webpage using the browser’s dev tools, which means there is a possibility that someone can modify the product price on your site and checkout without any issues. This sounds a nightmare to merchants, but the good news is, Foxy provides a ",{"text":4128,"type":2983,"marks":4129},"HMAC cart validation",[4130],{"type":2997,"attrs":4131},{"href":4132,"title":2824},"https:\u002F\u002Fdocs.foxycart.com\u002Fv\u002F2.0\u002Fhmac_validation",{"text":4134,"type":2983}," functionality, and with ",{"text":4136,"type":2983,"marks":4137},"the official Foxy SDK",[4138],{"type":2997,"attrs":4139},{"href":4140,"title":2824},"https:\u002F\u002Fgithub.com\u002FFoxy\u002Ffoxy-sdk",{"text":4142,"type":2983}," released recently, this can be done in just a few more steps.",{"type":2979,"content":4144},[4145,4147,4153,4159,4164],{"text":4146,"type":2983},"💡 Though the Foxy SDK can ",{"text":4148,"type":2983,"marks":4149},"sign entire HTML pages via the ",[4150],{"type":2997,"attrs":4151},{"href":4152,"title":2824},"https:\u002F\u002Fsdk.foxy.dev\u002Fclasses\u002F_backend_index_.signer.html#signhtml",{"text":4154,"type":2983,"marks":4155},"signHtml",[4156,4158],{"type":2997,"attrs":4157},{"href":4152,"title":2824},{"type":3137},{"text":4160,"type":2983,"marks":4161}," method",[4162],{"type":2997,"attrs":4163},{"href":4152,"title":2824},{"text":4165,"type":2983},", that’s not as easy to do in this Vercel + Next.js build, so we’ll take a more targeted approach, below.",{"type":3051,"attrs":4167,"content":4168},{"level":3053},[4169],{"text":4170,"type":2983},"Implement using Foxy SDK",{"type":2979,"content":4172},[4173,4175,4181],{"text":4174,"type":2983},"Head to ",{"text":4176,"type":2983,"marks":4177},"Advanced Settings",[4178],{"type":2997,"attrs":4179},{"href":4180,"title":2824},"https:\u002F\u002Fadmin.foxycart.com\u002Fadmin.php?ThisAction=EditAdvancedFeatures",{"text":4182,"type":2983}," in the Foxy admin and enable cart validation by checking the “would you like to enable cart validation?” option. Then look for the “store secret” field, click the “Show” button, and copy the value in the text box.",{"type":2979,"content":4184},[4185,4187,4190],{"text":4186,"type":2983},"Add a new variable for Foxy store secret in the ",{"text":3585,"type":2983,"marks":4188},[4189],{"type":3137},{"text":4191,"type":2983}," file, and paste the value we just copied from the Foxy admin:",{"type":3174,"attrs":4193,"content":4194},{"params":2658},[4195],{"text":4196,"type":2983},"\u002F\u002F .env.local\n\nFOXY_STORE_SECRET=",{"type":2979,"content":4198},[4199,4201,4205],{"text":4200,"type":2983},"Install Foxy SDK. We’ll use the ",{"text":4202,"type":2983,"marks":4203},"Signer",[4204],{"type":3137},{"text":4206,"type":2983}," object to generate signed links and forms.",{"type":3174,"attrs":4208,"content":4209},{"params":2658},[4210],{"text":4211,"type":2983},"npm i @foxy.io\u002Fsdk",{"type":2979,"content":4213},[4214,4216,4220,4222,4225,4227,4231,4232,4236,4238,4242],{"text":4215,"type":2983},"Create a new file named ",{"text":4217,"type":2983,"marks":4218},"foxy-signer.js",[4219],{"type":3137},{"text":4221,"type":2983}," in the ",{"text":3626,"type":2983,"marks":4223},[4224],{"type":3137},{"text":4226,"type":2983}," folder, which includes two helper functions (",{"text":4228,"type":2983,"marks":4229},"getFoxyLink",[4230],{"type":3137},{"text":3145,"type":2983},{"text":4233,"type":2983,"marks":4234},"getFoxyForm",[4235],{"type":3137},{"text":4237,"type":2983},") that return a Foxy purchase link or form, and have it signed only if the ",{"text":4239,"type":2983,"marks":4240},"FOXY_STORE_SECRET",[4241],{"type":3137},{"text":4243,"type":2983}," environment variable is set:",{"type":3174,"attrs":4245,"content":4246},{"params":2658},[4247],{"text":4248,"type":2983},"\u002F\u002F lib\u002Ffoxy-signer.js\n\nimport * as FoxySDK from \"@foxy.io\u002Fsdk\";\n\nconst signer = new FoxySDK.Backend.Signer(process.env.FOXY_STORE_SECRET);\n\nexport function getFoxyLink(product) {\n  const link = `https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?name=${encodeURIComponent(product.name)}&price=${product.price}&image=${encodeURIComponent(product.image.url)}&code=${encodeURIComponent(product.slug)}&quantity_max=${product.inventory}&cart=checkout`;\n\n  return process.env.FOXY_STORE_SECRET ? signer.signUrl(link) : link;\n}\n\nexport function getFoxyForm(product) {\n  const formHtml = `\n    \u003Cform action=\"\u003Chttps:\u002F\u002F$>{process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart\" method=\"POST\">\n      \u003Cinput type=\"hidden\" name=\"name\" value=\"${product.name}\" \u002F>\n      \u003Cinput type=\"hidden\" name=\"price\" value=\"${product.price}\" \u002F>\n      \u003Cinput type=\"hidden\" name=\"quantity_max\" value=\"${product.inventory}\" \u002F>\n      \u003Cinput type=\"hidden\" name=\"image\" value=\"${product.image.url}\" \u002F>\n      \u003Cinput type=\"hidden\" name=\"code\" value=\"${product.slug}\" \u002F>\n\n      \u003Cinput\n        type=\"number\"\n        min=\"1\"\n        step=\"1\"\n        value=\"\"\n        name=\"quantity\"\n        placeholder=\"Quantity\"\n        class=\"mt-5 mb-3 border border-gray-400 rounded py-2 px-3 block\"\n      \u002F>\n\n      \u003Cbutton\n        type=\"submit\"\n        class=\"bg-gray-600 rounded py-2 px-6 text-gray-100 cursor-pointer\"\n      >\n        Add to Cart\n      \u003C\u002Fbutton>\n    \u003C\u002Fform>\n  `;\n\n  return process.env.FOXY_STORE_SECRET ? signer.signHtml(formHtml) : formHtml;\n}",{"type":2979,"content":4250},[4251,4253,4256],{"text":4252,"type":2983},"Since the HTML in this file includes Tailwind CSS, we’ll need to add this folder to the ",{"text":3254,"type":2983,"marks":4254},[4255],{"type":3137},{"text":4257,"type":2983}," option in the Tailwind config file:",{"type":3174,"attrs":4259,"content":4260},{"params":2658},[4261],{"text":4262,"type":2983},"\u002F\u002F tailwind.config.js\n\nmodule.exports = {\n  purge: [\".\u002Fpages\u002F**\u002F*.js\", \".\u002Fcomponents\u002F**\u002F*.js\", \".\u002Flib\u002F**\u002F*.js\"],\n  ...\n};",{"type":2979,"content":4264},[4265],{"text":4266,"type":2983},"Then, we can replace all Foxy purchase links and forms in the pages with the functions:",{"type":3174,"attrs":4268,"content":4269},{"params":2658},[4270],{"text":4271,"type":2983},"\u002F\u002F pages\u002Findex.js\n\n...\nimport { getFoxyLink } from \"..\u002Flib\u002Ffoxy-signer\";\n\nexport default function Home({ featuredProducts }) {\n  return (\n    ...\n    \u003Ca\n      href={product.foxyBuyLink}\n      className=\"ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer\"\n    >\n      Buy Now\n    \u003C\u002Fa>\n    ...\n  );\n}\n\nexport const getStaticProps = async () => {\n  const featuredProducts = await getFeaturedProducts();\n\n  \u002F\u002F Add a foxyBuyLink property for the generated link\n  return {\n    props: {\n      featuredProducts: featuredProducts.map((product) => {\n        return {\n          ...product,\n          foxyBuyLink: getFoxyLink(product),\n        };\n      }),\n    },\n  };\n};\n\n\n\u002F\u002F pages\u002Fproducts\u002Findex.js\n\n...\nimport { getFoxyLink } from \"..\u002F..\u002Flib\u002Ffoxy-signer\";\n\nexport default function AllProducts({ allProducts }) {\n  return (\n    ...\n    \u003Ca\n      href={product.foxyBuyLink}\n      className=\"ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer\"\n    >\n      Buy Now\n    \u003C\u002Fa>\n    ...\n  );\n}\n\nexport const getStaticProps = async () => {\n  const allProducts = await getAllProducts();\n\n  return {\n    props: {\n      allProducts: allProducts.map((product) => {\n        return {\n          ...product,\n          foxyBuyLink: getFoxyLink(product),\n        };\n      }),\n    },\n  };\n};\n\n\n\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\n...\nimport { getFoxyForm } from \"..\u002F..\u002Flib\u002Ffoxy-signer\";\n\nexport default function Product({ product, foxyForm }) {\n  return (\n    ...\n    \u002F\u002F replace the whole \u003Cform \u002F> with this \u003Cdiv \u002F>\n    \u003Cdiv dangerouslySetInnerHTML={{ __html: foxyForm }}>\u003C\u002Fdiv>\n    ...\n  );\n}\n\nexport async function getStaticProps({ params }) {\n  const data = await getProductBySlug(params.slug);\n\n  \u002F\u002F Add a prop for the form HTML\n  return {\n    props: {\n      product: data?.product ?? null,\n      foxyForm: getFoxyForm(data?.product),\n    },\n  };\n}\n\n...",{"type":3051,"attrs":4273,"content":4274},{"level":3120},[4275],{"text":4276,"type":2983},"We did it! 🎉",{"type":2979,"content":4278},[4279],{"text":4280,"type":2983},"Congratulations! You’ve successfully built your own ecommerce website in JAMstack!",{"type":2979,"content":4282},[4283,4285,4291,4292,4298,4300,4306],{"text":4284,"type":2983},"To bring it further, you can deploy it to your preferred static site hosting platform like ",{"text":4286,"type":2983,"marks":4287},"Vercel",[4288],{"type":2997,"attrs":4289},{"href":4290,"title":2824},"https:\u002F\u002Fvercel.com\u002F",{"text":4002,"type":2983},{"text":4293,"type":2983,"marks":4294},"Netlify",[4295],{"type":2997,"attrs":4296},{"href":4297,"title":2824},"https:\u002F\u002Fwww.netlify.com\u002F",{"text":4299,"type":2983}," or ",{"text":4301,"type":2983,"marks":4302},"Cloudflare Pages",[4303],{"type":2997,"attrs":4304},{"href":4305,"title":2824},"https:\u002F\u002Fpages.cloudflare.com\u002F",{"text":4307,"type":2983},". Comment the deployed link down below to show what you’ve built (or email us if you’re being shy)!",{"type":2976,"content":4309},[4310],{"type":2979,"content":4311},[4312],{"text":4313,"type":2983},"In this step-by-step guide, we show you how to build an ecommerce website from scratch using Next.js, Contentful, and Foxy.",{"id":4315,"alt":2658,"name":2658,"focus":2658,"title":2658,"source":2658,"filename":4316,"copyright":2658,"fieldtype":2660,"meta_data":4317,"is_external_url":2700},57772,"https:\u002F\u002Fa-us.storyblok.com\u002Ff\u002F1001040\u002Fd19be49ea4\u002Fjamstack.jpg",{},[4319],{"name":2847,"created_at":4320,"published_at":4321,"updated_at":4322,"id":4323,"uuid":1801,"content":4324,"slug":4328,"full_slug":2846,"sort_by_date":2824,"position":4329,"tag_list":4330,"is_startpage":2700,"parent_id":4331,"meta_data":2824,"group_id":4332,"first_published_at":4333,"release_id":2824,"lang":2830,"path":2824,"alternates":4334,"default_full_slug":2824,"translated_slugs":2824,"_stopResolving":2790},"2023-03-24T17:10:22.759Z","2023-03-24T17:27:15.000Z","2023-03-24T17:17:35.775Z",64357,{"_uid":4325,"name":2847,"component":4326,"description":4327},"7642c681-a96a-4697-be4b-f4148ad1e059","blog_category","Helpful ecommerce related tips, tricks, and tutorials.","how-to",40,[],3266,"7daee788-0898-4317-b28a-dffb69b65e2e","2023-03-24T17:27:15.733Z",[],"build-a-jamstack-ecommerce-website-with-next-js-contentful-and-foxy","blog\u002Fposts\u002Fbuild-a-jamstack-ecommerce-website-with-next-js-contentful-and-foxy",190,[],3267,"fb57b75f-2450-45df-bece-4001225d2f02","2021-11-03T13:03:12.000Z",[],{"html":4344,"sections":4345,"segments":4346},"\u003Cp>In this step-by-step guide, we’re going to build a ecommerce website from scratch using:\u003C\u002Fp>\u003Cul tight=\"false\">\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Fnextjs.org\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Next.js\u003C\u002Fa> – a React framework that offers features like image optimization, hybrid static &amp; server rendering, TypeScript support, smart bundling, route pre-fetching and more.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Fwww.contentful.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Contentful\u003C\u002Fa> – a headless CMS (content management system).\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Ffoxy.io\u002F\" class=\" fw-bold\">Foxy\u003C\u002Fa> – a headless ecommerce solution providing a highly customizable and powerful shopping cart and checkout experience.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftailwindcss.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Tailwind CSS\u003C\u002Fa> – a utility-first CSS framework.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Fgraphql.org\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">GraphQL\u003C\u002Fa> – a query language for APIs.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch3 level=\"3\">Take a sneak peek of what we’re building\u003C\u002Fh3>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app1-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app2-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>Live demo: \u003Ca href=\"https:\u002F\u002Ffoxy-contentful-nextjs.vercel.app\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">https:\u002F\u002Ffoxy-contentful-nextjs.vercel.app\u002F\u003C\u002Fa>\u003Cbr>Source code: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFoxy\u002Ffoxy-contentful-nextjs-example-site\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">https:\u002F\u002Fgithub.com\u002FFoxy\u002Ffoxy-contentful-nextjs-example-site\u003C\u002Fa>\u003C\u002Fp>\u003Cp>⚠️ \u003Cstrong>Note\u003C\u002Fstrong>: This guide assumes you have basic knowledge of JavaScript and React. If you’re new to React, feel free to check out the \u003Ca href=\"https:\u002F\u002Freactjs.org\u002Ftutorial\u002Ftutorial.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">official React tutorial\u003C\u002Fa> first. It’ll also be helpful to go through the \u003Ca href=\"https:\u002F\u002Fnextjs.org\u002Flearn\u002Fbasics\u002Fcreate-nextjs-app\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">basics of Next.js\u003C\u002Fa>.\u003C\u002Fp>\u003Ch2 level=\"2\">Initialize project\u003C\u002Fh2>\u003Ch3 level=\"3\">Requirements\u003C\u002Fh3>\u003Cp>Next.js requires Node.js 10.13 or later and Tailwind CSS requires Node.js 12.13.0 or higher. You can run \u003Ccode class=\"badge bg-soft-danger text-danger\">node -v\u003C\u002Fcode> in the terminal to check the version on your system. \u003Ccode class=\"badge bg-soft-danger text-danger\">npm\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">npx\u003C\u002Fcode> are also required to install dependencies and run commands, which should come out of the box when you install Node.js.\u003C\u002Fp>\u003Ch3 level=\"3\">Create a Next.js app\u003C\u002Fh3>\u003Cp>In the terminal, \u003Ccode class=\"badge bg-soft-danger text-danger\">cd\u003C\u002Fcode> to a directory you want to start this project, and run the following command to create a new Next.js app called \u003Ccode class=\"badge bg-soft-danger text-danger\">foxy-contentful-nextjs\u003C\u002Fcode> (or whatever you like):\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npx create-next-app foxy-contentful-nextjs\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>After the installation is complete, \u003Ccode class=\"badge bg-soft-danger text-danger\">cd foxy-contentful-nextjs\u003C\u002Fcode> and run \u003Ccode class=\"badge bg-soft-danger text-danger\">npm run dev\u003C\u002Fcode> . The development server will start on port 3000. Open \u003Ca href=\"http:\u002F\u002Flocalhost:3000\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">http:\u002F\u002Flocalhost:3000\u002F\u003C\u002Fa> in your browser, you’ll then see a “Welcome to Next.js!” page.\u003C\u002Fp>\u003Ch3 level=\"3\">Set up Tailwind CSS\u003C\u002Fh3>\u003Cp>Following \u003Ca href=\"https:\u002F\u002Ftailwindcss.com\u002Fdocs\u002Fguides\u002Fnextjs\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Tailwind’s Next.js setup guide\u003C\u002Fa>, we can run the command below to install Tailwind and its peer-dependencies:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npm install -D tailwindcss@latest postcss@latest autoprefixer@latest\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, generate \u003Ccode class=\"badge bg-soft-danger text-danger\">tailwind.config.js\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">postcss.config.js\u003C\u002Fcode> configuration files using this command:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npx tailwindcss init -p\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Open \u003Ccode class=\"badge bg-soft-danger text-danger\">tailwind.config.js\u003C\u002Fcode> in the text editor, and configure the \u003Ccode class=\"badge bg-soft-danger text-danger\">purge\u003C\u002Fcode> option so that unused styles would be removed in production:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F tailwind.config.js\n\nmodule.exports = {\n  purge: [&quot;.\u002Fpages\u002F**\u002F*.{js,ts,jsx,tsx}&quot;, &quot;.\u002Fcomponents\u002F**\u002F*.{js,ts,jsx,tsx}&quot;],\n  darkMode: false, \u002F\u002F or &#039;media&#039; or &#039;class&#039;\n  theme: {\n    extend: {},\n  },\n  variants: {\n    extend: {},\n  },\n  plugins: [],\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>After importing Tailwind in \u003Ccode class=\"badge bg-soft-danger text-danger\">pages\u002F_app.js\u003C\u002Fcode>, we can delete the CSS files Next.js creates by default like \u003Ccode class=\"badge bg-soft-danger text-danger\">globals.css\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">Home.module.css\u003C\u002Fcode>, and any references to them.\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002F_app.js\n\nimport &quot;tailwindcss\u002Ftailwind.css&quot;;\n\nfunction MyApp({ Component, pageProps }) {\n  return &lt;Component {...pageProps} \u002F&gt;;\n}\n\nexport default MyApp;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now, let’s make some changes in the \u003Ccode class=\"badge bg-soft-danger text-danger\">index.js\u003C\u002Fcode> page:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Findex.js\n\nexport default function Home() {\n  return (\n    &lt;div className=&quot;px-16 py-10 md:px-24 lg:px-28&quot;&gt;\n      &lt;h1 className=&quot;text-2xl&quot;&gt;Welcome to foxy-contentful-nextjs!&lt;\u002Fh1&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>If the dev server was shut down in a previous step, run \u003Ccode class=\"badge bg-soft-danger text-danger\">npm run dev\u003C\u002Fcode> again and we’ll see Tailwind is applied to the index page.\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-Screenshot-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch2 level=\"2\">Add products in Contentful and fetch product data\u003C\u002Fh2>\u003Ch3 level=\"3\">Set up Contentful\u003C\u002Fh3>\u003Cp>Sign up or log in at \u003Ca href=\"https:\u002F\u002Fwww.contentful.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Contentful\u003C\u002Fa> and create a new empty space from the \u003Ca href=\"https:\u002F\u002Fapp.contentful.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">dashboard\u003C\u002Fa>. From the newly created space, go to the \u003Cstrong>Content model\u003C\u002Fstrong> tab and add a new content type: give it the \u003Cstrong>Name\u003C\u002Fstrong> \u003Ccode class=\"badge bg-soft-danger text-danger\">Product\u003C\u002Fcode>, and the \u003Cstrong>Api Identifier\u003C\u002Fstrong> will be auto-generated as \u003Ccode class=\"badge bg-soft-danger text-danger\">product\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreen-Shot-2021-06-02-at-5.23.05-PM-1-1024x762.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>Then, add the following fields to the \u003Ccode class=\"badge bg-soft-danger text-danger\">Product\u003C\u002Fcode> model and configure all fields as required:\u003C\u002Fp>\u003Cul tight=\"false\">\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">name\u003C\u002Fcode> – \u003Cstrong>Text\u003C\u002Fstrong> field (type \u003Cstrong>short text\u003C\u002Fstrong>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">slug\u003C\u002Fcode> – \u003Cstrong>Text\u003C\u002Fstrong> field (type \u003Cstrong>short text\u003C\u002Fstrong>). You can optionally go to the settings of this field, then under \u003Cstrong>Appearance\u003C\u002Fstrong>, select \u003Cstrong>Slug\u003C\u002Fstrong> so this field is displayed as a slug of the \u003Ccode class=\"badge bg-soft-danger text-danger\">name\u003C\u002Fcode> field\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">price\u003C\u002Fcode> – \u003Cstrong>Number\u003C\u002Fstrong> field (type \u003Cstrong>Decimal\u003C\u002Fstrong>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">image\u003C\u002Fcode> – \u003Cstrong>Media\u003C\u002Fstrong> field (type \u003Cstrong>One file\u003C\u002Fstrong>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">inventory\u003C\u002Fcode> – \u003Cstrong>Number\u003C\u002Fstrong> field (type \u003Cstrong>Integer\u003C\u002Fstrong>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">description\u003C\u002Fcode> – \u003Cstrong>Rich text\u003C\u002Fstrong> field\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">featured\u003C\u002Fcode> – \u003Cstrong>Boolean\u003C\u002Fstrong> field\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreen-Shot-2021-06-02-at-5.27.50-PM-1024x576.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>Click “save” in the upper right. Next, head to the \u003Cstrong>Content\u003C\u002Fstrong> tab, add a few products and publish.\u003C\u002Fp>\u003Ch3 level=\"3\">Fetch product data\u003C\u002Fh3>\u003Cp>Before we get into the code, we first need to get the API keys so our Next.js app can communicate with Contentful. Go \u003Cstrong>Settings\u003C\u002Fstrong> &gt; \u003Cstrong>API keys\u003C\u002Fstrong> from the current Contentful space. From the \u003Cstrong>Content delivery \u002F preview tokens\u003C\u002Fstrong> tab, click the \u003Cstrong>Add API key\u003C\u002Fstrong> button to generate the access tokens. Give it a name and description that makes sense for what you’re building.\u003C\u002Fp>\u003Cp>Back in the code editor, create a new file called \u003Ccode class=\"badge bg-soft-danger text-danger\">.env.local\u003C\u002Fcode> in the root directory for storing all the environment variables, and paste the \u003Cstrong>Space ID\u003C\u002Fstrong> and \u003Cstrong>Content Delivery API – access token\u003C\u002Fstrong> values in it:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F .env.local\n\nCONTENTFUL_SPACE_ID=\nCONTENTFUL_ACCESS_TOKEN=\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>We’ll use \u003Ccode class=\"badge bg-soft-danger text-danger\">[axios](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Faxios)\u003C\u002Fcode> (an easy-to-use library to make HTTP requests) lfor data fetching, so open the terminal and install:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npm install axios\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, create a new folder \u003Ccode class=\"badge bg-soft-danger text-danger\">lib\u003C\u002Fcode> for some helper functions. Inside the folder, create a \u003Ccode class=\"badge bg-soft-danger text-danger\">api.js\u003C\u002Fcode> file, where we’ll write the functions to fetch data via the \u003Ca href=\"https:\u002F\u002Fwww.contentful.com\u002Fdevelopers\u002Fdocs\u002Freferences\u002Fgraphql\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Contentful GraphQL Content API\u003C\u002Fa>. Review the following code to get an idea of what it’s doing.\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F lib\u002Fapi.js\n\nimport axios from &quot;axios&quot;;\n\n\u002F\u002F product fields to fetch\nconst PRODUCT_GRAPHQL_FIELDS = `\nname\nslug\nprice\nimage {\n  url\n}\ninventory\ndescription {\n  json\n}\n`;\n\n\u002F\u002F connect Contentful\nasync function fetchGraphQL(query) {\n  try {\n    const res = await axios.post(\n      `https:\u002F\u002Fgraphql.contentful.com\u002Fcontent\u002Fv1\u002Fspaces\u002F${process.env.CONTENTFUL_SPACE_ID}`,\n      { query },\n      {\n        headers: {\n          &quot;Content-Type&quot;: &quot;application\u002Fjson&quot;,\n          Authorization: `Bearer ${process.env.CONTENTFUL_ACCESS_TOKEN}`,\n        },\n      }\n    );\n    return res.data;\n  } catch (error) {\n    console.error(&quot;Failed to fetch Contentful&quot;);\n  }\n}\n\n\u002F\u002F helper functions for extracting product entries from response\nfunction extractProduct(fetchResponse) {\n  return fetchResponse?.data?.productCollection?.items?.[0];\n}\n\nfunction extractProductEntries(fetchResponse) {\n  return fetchResponse?.data?.productCollection?.items;\n}\n\n\u002F\u002F get products whose featured field is set to true\nexport async function getFeaturedProducts() {\n  const entries = await fetchGraphQL(\n    `query {\n      productCollection(where: { featured: true }) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return extractProductEntries(entries);\n}\n\n\u002F\u002F get all products\nexport async function getAllProducts() {\n  const entries = await fetchGraphQL(\n    `query {\n      productCollection(where: { slug_exists: true }) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return extractProductEntries(entries);\n}\n\n\u002F\u002F get a specific product by its slug\nexport async function getProductBySlug(slug) {\n  const entry = await fetchGraphQL(\n    `query {\n      productCollection(where: { slug: &quot;${slug}&quot; }, limit: 1) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return {\n    product: extractProduct(entry),\n  };\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 level=\"2\">Create pages and components\u003C\u002Fh2>\u003Ch3 level=\"3\">\u003Ccode class=\"badge bg-soft-danger text-danger\">&lt;Layout \u002F&gt;\u003C\u002Fcode> component\u003C\u002Fh3>\u003Cp>First, create a \u003Ccode class=\"badge bg-soft-danger text-danger\">components\u003C\u002Fcode> folder and a \u003Ccode class=\"badge bg-soft-danger text-danger\">layout.js\u003C\u002Fcode> file in it. We’ll create a \u003Ccode class=\"badge bg-soft-danger text-danger\">Layout\u003C\u002Fcode> component that wraps the entire app. Note that the class names are Tailwind classes.\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F components\u002Flayout.js\n\nimport Link from &quot;next\u002Flink&quot;;\n\nexport default function Layout({ children }) {\n  return (\n    &lt;&gt;\n      &lt;nav className=&quot;flex items-center h-16 bg-gray-600 text-gray-100 tracking-widest&quot;&gt;\n        &lt;h1 className=&quot;flex-grow ml-5 text-2xl font-semibold&quot;&gt;Foxy Store&lt;\u002Fh1&gt;\n\n        &lt;Link href=&quot;\u002F&quot;&gt;\n          &lt;a className=&quot;mr-5 text-xl font-medium hover:underline&quot;&gt;Home&lt;\u002Fa&gt;\n        &lt;\u002FLink&gt;\n\n        &lt;Link href=&quot;\u002Fproducts&quot;&gt;\n          &lt;a className=&quot;mr-5 text-xl font-medium hover:underline&quot;&gt;Products&lt;\u002Fa&gt;\n        &lt;\u002FLink&gt;\n\n        &lt;a className=&quot;mr-5 text-xl font-medium hover:underline cursor-pointer&quot;&gt;\n          Cart\n        &lt;\u002Fa&gt;\n      &lt;\u002Fnav&gt;\n\n      &lt;main&gt;{children}&lt;\u002Fmain&gt;\n    &lt;\u002F&gt;\n  );\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>💡 In Next.js, we use the \u003Ccode class=\"badge bg-soft-danger text-danger\">Link\u003C\u002Fcode> component from \u003Ccode class=\"badge bg-soft-danger text-danger\">next\u002Flink\u003C\u002Fcode> to wrap the \u003Ccode class=\"badge bg-soft-danger text-danger\">&lt;a&gt;\u003C\u002Fcode> tag. This component allows us to do client-side navigation to a different page in the application.\u003C\u002Fp>\u003Cp>Then edit the \u003Ccode class=\"badge bg-soft-danger text-danger\">_app.js\u003C\u002Fcode> file to include the \u003Ccode class=\"badge bg-soft-danger text-danger\">Layout\u003C\u002Fcode> component across the application:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002F_app.js\n\nimport &quot;tailwindcss\u002Ftailwind.css&quot;;\nimport Layout from &quot;..\u002Fcomponents\u002Flayout&quot;;\n\nfunction MyApp({ Component, pageProps }) {\n  return (\n    &lt;Layout&gt;\n      &lt;Component {...pageProps} \u002F&gt;\n    &lt;\u002FLayout&gt;\n  );\n}\n\nexport default MyApp;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>And we’ll see a nav bar on the top of the page.\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-Screenshot1-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch3 level=\"3\">Home page with featured products\u003C\u002Fh3>\u003Cp>💡 With the file-system based router in Next.js, we can easily create pages that are associated with a route based on their file name.\u003C\u002Fp>\u003Cp>Modify the \u003Ccode class=\"badge bg-soft-danger text-danger\">pages\u002Findex.js\u003C\u002Fcode> page to display the products that are configured as featured in Contentful:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Findex.js\n\nimport Link from &quot;next\u002Flink&quot;;\nimport Image from &quot;next\u002Fimage&quot;;\n\nimport { getFeaturedProducts } from &quot;..\u002Flib\u002Fapi&quot;;\n\nexport default function Home({ featuredProducts }) {\n  return (\n    &lt;div className=&quot;px-16 py-10 md:px-24 lg:px-28&quot;&gt;\n      &lt;h2 className=&quot;text-2xl mb-2&quot;&gt;Featured Products&lt;\u002Fh2&gt;\n\n      &lt;div className=&quot;grid md:grid-cols-2 lg:grid-cols-3 gap-10&quot;&gt;\n        {featuredProducts.map((product) =&gt; (\n          &lt;div\n            key={product.slug}\n            className=&quot;rounded bg-white border-gray-200 shadow-md hover:shadow-xl flex justify-center flex-col px-2 pt-3 pb-5&quot;\n          &gt;\n            &lt;Image\n              src={product.image.url}\n              layout=&quot;intrinsic&quot;\n              width={550}\n              height={370}\n            \u002F&gt;\n\n            &lt;div className=&quot;mt-4 flex items-baseline&quot;&gt;\n              &lt;h1 className=&quot;ml-1 text-xl flex-1&quot;&gt;{product.name}&lt;\u002Fh1&gt;\n              &lt;h2 className=&quot;mr-2 text-lg text-gray-500&quot;&gt;${product.price}&lt;\u002Fh2&gt;\n            &lt;\u002Fdiv&gt;\n\n            &lt;div className=&quot;mt-4&quot;&gt;\n              &lt;a className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;&gt;\n                Buy Now\n              &lt;\u002Fa&gt;\n              &lt;Link\n                as={`\u002Fproducts\u002F${product.slug}`}\n                href=&quot;\u002Fproducts\u002F[slug]&quot;\n                passHref\n              &gt;\n                &lt;a className=&quot;ml-3 border border-gray-400 rounded px-4 py-2 text-gray-600 cursor-pointer&quot;&gt;\n                  Details\n                &lt;\u002Fa&gt;\n              &lt;\u002FLink&gt;\n            &lt;\u002Fdiv&gt;\n          &lt;\u002Fdiv&gt;\n        ))}\n      &lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\n\nexport const getStaticProps = async () =&gt; {\n  const featuredProducts = await getFeaturedProducts();\n\n  return {\n    props: { featuredProducts },\n  };\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>💡 If we export an \u003Ccode class=\"badge bg-soft-danger text-danger\">async\u003C\u002Fcode> function called \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticProps\u003C\u002Fcode> from a page, Next.js will pre-render this page \u003Cstrong>at build time\u003C\u002Fstrong> using the props returned by \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticProps\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>⚠️ If the above code errors, take a look at the error message and try solving it. Or just continue on…\u003C\u002Fp>\u003Cp>In the above code, we use the new \u003Ccode class=\"badge bg-soft-danger text-danger\">\u003Ca href=\"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fbasic-features\u002Fimage-optimization\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">&lt;Image \u002F&gt;\u003C\u002Fa>\u003C\u002Fcode>\u003Ca href=\"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fbasic-features\u002Fimage-optimization\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\"> component\u003C\u002Fa> introduced in Next.js 10, which offers automatic image optimization. To properly show images hosted on an external URL, we’ll need to specify the image domains in the next.config.js file:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F next.config.js\n\nmodule.exports = {\n  images: {\n    domains: [&quot;images.ctfassets.net&quot;],\n  },\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-34-18-https-foxy-contentful-nextjs-vercel-app-1024x642.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch3 level=\"3\">All products page\u003C\u002Fh3>\u003Cp>Let’s also create a page that contains all products, which would be similar to the home page: create a \u003Ccode class=\"badge bg-soft-danger text-danger\">products\u003C\u002Fcode> directory under \u003Ccode class=\"badge bg-soft-danger text-danger\">pages\u003C\u002Fcode> , then create an \u003Ccode class=\"badge bg-soft-danger text-danger\">index.js\u003C\u002Fcode> file that contains all products:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Fproducts\u002Findex.js\n\nimport Link from &quot;next\u002Flink&quot;;\nimport Image from &quot;next\u002Fimage&quot;;\n\nimport { getAllProducts } from &quot;..\u002F..\u002Flib\u002Fapi&quot;;\n\nexport default function AllProducts({ allProducts }) {\n  return (\n    &lt;div className=&quot;px-16 py-10 md:px-24 lg:px-28&quot;&gt;\n      &lt;h2 className=&quot;text-2xl mb-2&quot;&gt;All Products&lt;\u002Fh2&gt;\n\n      &lt;div className=&quot;grid md:grid-cols-2 lg:grid-cols-3 gap-10&quot;&gt;\n        {allProducts.map((product) =&gt; (\n          &lt;div\n            key={product.slug}\n            className=&quot;rounded bg-white border-gray-200 shadow-md hover:shadow-xl flex justify-center flex-col px-2 pt-3 pb-5&quot;\n          &gt;\n            &lt;Image\n              src={product.image.url}\n              layout=&quot;intrinsic&quot;\n              width={550}\n              height={370}\n            \u002F&gt;\n\n            &lt;div className=&quot;mt-4 flex items-baseline&quot;&gt;\n              &lt;h1 className=&quot;ml-1 text-xl flex-1&quot;&gt;{product.name}&lt;\u002Fh1&gt;\n              &lt;h2 className=&quot;mr-2 text-lg text-gray-500&quot;&gt;${product.price}&lt;\u002Fh2&gt;\n            &lt;\u002Fdiv&gt;\n\n            &lt;div className=&quot;mt-4&quot;&gt;\n              &lt;a className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;&gt;\n                Buy Now\n              &lt;\u002Fa&gt;\n              &lt;Link\n                as={`\u002Fproducts\u002F${product.slug}`}\n                href=&quot;\u002Fproducts\u002F[slug]&quot;\n                passHref\n              &gt;\n                &lt;a className=&quot;ml-3 border border-gray-400 rounded px-4 py-2 text-gray-600 cursor-pointer&quot;&gt;\n                  Details\n                &lt;\u002Fa&gt;\n              &lt;\u002FLink&gt;\n            &lt;\u002Fdiv&gt;\n          &lt;\u002Fdiv&gt;\n        ))}\n      &lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\n\nexport const getStaticProps = async () =&gt; {\n  const allProducts = await getAllProducts();\n\n  return {\n    props: { allProducts },\n  };\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-35-14-https-foxy-contentful-nextjs-vercel-app-1024x919.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch3 level=\"3\">Pages for each product\u003C\u002Fh3>\u003Cp>Remember we’ve configured the product description field as a rich text field in Contentful? This type of field would be returned as a object in response, so we’ll use \u003Ccode class=\"badge bg-soft-danger text-danger\">[@contentful\u002Frich-text-react-renderer](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@contentful\u002Frich-text-react-renderer)\u003C\u002Fcode> to parse the text content in the object:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npm install @contentful\u002Frich-text-react-renderer\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Create dynamic route pages for products in \u003Ccode class=\"badge bg-soft-danger text-danger\">pages\u002Fproducts\u002F[slug].js\u003C\u002Fcode>, with an add-to-cart form inside:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\nimport Image from &quot;next\u002Fimage&quot;;\nimport { documentToReactComponents } from &quot;@contentful\u002Frich-text-react-renderer&quot;;\n\nimport { getAllProducts, getProductBySlug } from &quot;..\u002F..\u002Flib\u002Fapi&quot;;\n\nexport default function Product({ product }) {\n  return (\n    &lt;div className=&quot;px-16 py-10 md:px-24 lg:px-28&quot;&gt;\n      &lt;div className=&quot;mt-8 grid lg:grid-cols-2&quot;&gt;\n        &lt;div&gt;\n          &lt;Image\n            src={product.image.url}\n            layout=&quot;responsive&quot;\n            width={550}\n            height={350}\n          \u002F&gt;\n        &lt;\u002Fdiv&gt;\n\n        &lt;div className=&quot;py-5 lg:px-10 lg:py-3&quot;&gt;\n          &lt;h1 className=&quot;text-3xl&quot;&gt;{product.name}&lt;\u002Fh1&gt;\n          &lt;h2 className=&quot;text-2xl text-gray-600&quot;&gt;${product.price}&lt;\u002Fh2&gt;\n          &lt;div className=&quot;my-2 mx-1&quot;&gt;\n            {documentToReactComponents(product.description.json)}\n          &lt;\u002Fdiv&gt;\n\n          &lt;form&gt;\n            &lt;input\n              type=&quot;number&quot;\n              min=&quot;1&quot;\n              step=&quot;1&quot;\n              defaultValue=&quot;1&quot;\n              name=&quot;quantity&quot;\n              placeholder=&quot;Quantity&quot;\n              className=&quot;mt-5 mb-3 border border-gray-400 rounded py-2 px-3 block&quot;\n            \u002F&gt;\n\n            &lt;button\n              type=&quot;submit&quot;\n              className=&quot;bg-gray-600 rounded py-2 px-6 text-gray-100 cursor-pointer&quot;\n            &gt;\n              Add to Cart\n            &lt;\u002Fbutton&gt;\n          &lt;\u002Fform&gt;\n        &lt;\u002Fdiv&gt;\n      &lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\n\nexport async function getStaticProps({ params }) {\n  const data = await getProductBySlug(params.slug);\n\n  return {\n    props: {\n      product: data?.product ?? null,\n    },\n  };\n}\n\nexport async function getStaticPaths() {\n  const allProducts = await getAllProducts();\n\n  return {\n    paths: allProducts?.map(({ slug }) =&gt; `\u002Fproducts\u002F${slug}`) ?? [],\n    fallback: false,\n  };\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>💡 If a page has dynamic routes and uses \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticProps\u003C\u002Fcode> it needs to define a list of paths that have to be rendered to HTML at build time.\u003C\u002Fp>\u003Cp>If we export an \u003Ccode class=\"badge bg-soft-danger text-danger\">async\u003C\u002Fcode> function called \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticPaths\u003C\u002Fcode> from a page that uses dynamic routes, Next.js will statically pre-render all the paths specified by \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticPaths\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-36-19-https-foxy-contentful-nextjs-vercel-app-1024x573.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch2 level=\"2\">Integrate Foxy into the Next.js app\u003C\u002Fh2>\u003Cp>If you haven’t already, \u003Ca href=\"https:\u002F\u002Fadmin.foxycart.com\u002Fsignup\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">sign up for a free account at Foxy\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Add a new variable for Foxy subdomain in the \u003Ccode class=\"badge bg-soft-danger text-danger\">.env.local\u003C\u002Fcode> file, with a \u003Ccode class=\"badge bg-soft-danger text-danger\">NEXT_PUBLIC_\u003C\u002Fcode> prefix so it’s exposed to the browser:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F .env.local\n\nNEXT_PUBLIC_FOXY_SUBDOMAIN=\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>We’ll need to include Foxy’s script before \u003Ccode class=\"badge bg-soft-danger text-danger\">&lt;\u002Fbody&gt;\u003C\u002Fcode> tag, which should be added in the \u003Ccode class=\"badge bg-soft-danger text-danger\">_document.js\u003C\u002Fcode> file in Next.js:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002F_document.js\n\nimport Document, { Html, Head, Main, NextScript } from &quot;next\u002Fdocument&quot;;\n\nexport default class MyDocument extends Document {\n  render() {\n    return (\n      &lt;Html lang=&quot;en&quot;&gt;\n        &lt;Head \u002F&gt;\n        &lt;body&gt;\n          &lt;Main \u002F&gt;\n          &lt;NextScript \u002F&gt;\n\n          {\u002F* FOXYCART *\u002F}\n          &lt;script\n            data-cfasync=&quot;false&quot;\n            src={`https:\u002F\u002Fcdn.foxycart.com\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}\u002Floader.js`}\n            async\n            defer\n          &gt;&lt;\u002Fscript&gt;\n        &lt;\u002Fbody&gt;\n      &lt;\u002FHtml&gt;\n    );\n  }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>There are two ways to add a product to cart in Foxy – via a link or a form, then modify the URL parameters or form elements as needed. Some examples can be found on the homepage \u003Ca href=\"https:\u002F\u002Ffoxy.io\u002F#start\" class=\" fw-bold\">here\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>In addition to some core product information like \u003Ccode class=\"badge bg-soft-danger text-danger\">name\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">price\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">quantity\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">code\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">image\u003C\u002Fcode>, we can also add a \u003Ccode class=\"badge bg-soft-danger text-danger\">quantity_max\u003C\u002Fcode> parameter that indicates the product’s current inventory to prevent oversell. A complete list of product parameters can be found \u003Ca href=\"https:\u002F\u002Fdocs.foxycart.com\u002Fv\u002F2.0\u002Fproducts#a_complete_list_of_product_parameters\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">here\u003C\u002Fa>.\u003C\u002Fp>\u003Ch3 level=\"3\">Buy Now button\u003C\u002Fh3>\u003Cp>A Buy Now button often refers to skipping the shopping cart and going to checkout directly. In Foxy, we can do this by attaching a \u003Ccode class=\"badge bg-soft-danger text-danger\">&amp;cart=checkout\u003C\u002Fcode> parameter to the purchase link. So, modify the \u003Ccode class=\"badge bg-soft-danger text-danger\">href\u003C\u002Fcode> attribute in the Buy Now buttons on the featured products page and all products page to this:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Findex.js &amp;&amp; pages\u002Fproducts\u002Findex.js\n\n&lt;a\n  href={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?name=${encodeURIComponent(product.name)}&amp;price=${product.price}&amp;image=${encodeURIComponent(product.image.url)}&amp;code=${encodeURIComponent(product.slug)}&amp;quantity_max=${product.inventory}&amp;cart=checkout`}  \n  className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;\n&gt;\n  Buy Now\n&lt;\u002Fa&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>💡 Wrapping the URL parameters in \u003Ccode class=\"badge bg-soft-danger text-danger\">encodeURIComponent()\u003C\u002Fcode> encodes them so that they get passed to Foxy correctly.\u003C\u002Fp>\u003Cp>🔐 You may be thinking “Wait a minute, those values can be changed by a website visitor!” Don’t worry. We’ll lock things down a little further down the page.\u003C\u002Fp>\u003Ch3 level=\"3\">Add-to-cart form\u003C\u002Fh3>\u003Cp>For a purchase form, besides adding the \u003Ccode class=\"badge bg-soft-danger text-danger\">action\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">method\u003C\u002Fcode> attributes to the \u003Ccode class=\"badge bg-soft-danger text-danger\">form\u003C\u002Fcode> element, we also need some elements to pass the product details to the cart, so the add-to-cart form on the product page will look something like this:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\n&lt;form\n  action={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart`}\n  method=&quot;POST&quot;\n&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;name&quot; value={product.name} \u002F&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;price&quot; value={product.price} \u002F&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;quantity_max&quot; value={product.inventory} \u002F&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;image&quot; value={product.image.url} \u002F&gt;\n  ...\n&lt;\u002Fform&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 level=\"3\">Mini-cart\u003C\u002Fh3>\u003Cp>Let’s also add a quick link in the navbar to open the cart and indicate the product quantity in cart:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F components\u002Flayout.js\n\n&lt;a\n  href={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?cart=view`}\n  className=&quot;mr-5 text-xl font-medium hover:underline cursor-pointer&quot;\n&gt;\n  Cart (&lt;span data-fc-id=&quot;minicart-quantity&quot;&gt;0&lt;\u002Fspan&gt;)\n&lt;\u002Fa&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 level=\"2\">Add Foxy HMAC cart validation\u003C\u002Fh2>\u003Cp>You probably know how easy is to modify the HTML on a webpage using the browser’s dev tools, which means there is a possibility that someone can modify the product price on your site and checkout without any issues. This sounds a nightmare to merchants, but the good news is, Foxy provides a \u003Ca href=\"https:\u002F\u002Fdocs.foxycart.com\u002Fv\u002F2.0\u002Fhmac_validation\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">HMAC cart validation\u003C\u002Fa> functionality, and with \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFoxy\u002Ffoxy-sdk\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">the official Foxy SDK\u003C\u002Fa> released recently, this can be done in just a few more steps.\u003C\u002Fp>\u003Cp>💡 Though the Foxy SDK can \u003Ca href=\"https:\u002F\u002Fsdk.foxy.dev\u002Fclasses\u002F_backend_index_.signer.html#signhtml\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">sign entire HTML pages via the \u003C\u002Fa>\u003Ccode class=\"badge bg-soft-danger text-danger\">\u003Ca href=\"https:\u002F\u002Fsdk.foxy.dev\u002Fclasses\u002F_backend_index_.signer.html#signhtml\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">signHtml\u003C\u002Fa>\u003C\u002Fcode>\u003Ca href=\"https:\u002F\u002Fsdk.foxy.dev\u002Fclasses\u002F_backend_index_.signer.html#signhtml\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\"> method\u003C\u002Fa>, that’s not as easy to do in this Vercel + Next.js build, so we’ll take a more targeted approach, below.\u003C\u002Fp>\u003Ch3 level=\"3\">Implement using Foxy SDK\u003C\u002Fh3>\u003Cp>Head to \u003Ca href=\"https:\u002F\u002Fadmin.foxycart.com\u002Fadmin.php?ThisAction=EditAdvancedFeatures\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Advanced Settings\u003C\u002Fa> in the Foxy admin and enable cart validation by checking the “would you like to enable cart validation?” option. Then look for the “store secret” field, click the “Show” button, and copy the value in the text box.\u003C\u002Fp>\u003Cp>Add a new variable for Foxy store secret in the \u003Ccode class=\"badge bg-soft-danger text-danger\">.env.local\u003C\u002Fcode> file, and paste the value we just copied from the Foxy admin:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F .env.local\n\nFOXY_STORE_SECRET=\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Install Foxy SDK. We’ll use the \u003Ccode class=\"badge bg-soft-danger text-danger\">Signer\u003C\u002Fcode> object to generate signed links and forms.\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npm i @foxy.io\u002Fsdk\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Create a new file named \u003Ccode class=\"badge bg-soft-danger text-danger\">foxy-signer.js\u003C\u002Fcode> in the \u003Ccode class=\"badge bg-soft-danger text-danger\">lib\u003C\u002Fcode> folder, which includes two helper functions (\u003Ccode class=\"badge bg-soft-danger text-danger\">getFoxyLink\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">getFoxyForm\u003C\u002Fcode>) that return a Foxy purchase link or form, and have it signed only if the \u003Ccode class=\"badge bg-soft-danger text-danger\">FOXY_STORE_SECRET\u003C\u002Fcode> environment variable is set:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F lib\u002Ffoxy-signer.js\n\nimport * as FoxySDK from &quot;@foxy.io\u002Fsdk&quot;;\n\nconst signer = new FoxySDK.Backend.Signer(process.env.FOXY_STORE_SECRET);\n\nexport function getFoxyLink(product) {\n  const link = `https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?name=${encodeURIComponent(product.name)}&amp;price=${product.price}&amp;image=${encodeURIComponent(product.image.url)}&amp;code=${encodeURIComponent(product.slug)}&amp;quantity_max=${product.inventory}&amp;cart=checkout`;\n\n  return process.env.FOXY_STORE_SECRET ? signer.signUrl(link) : link;\n}\n\nexport function getFoxyForm(product) {\n  const formHtml = `\n    &lt;form action=&quot;&lt;https:\u002F\u002F$&gt;{process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart&quot; method=&quot;POST&quot;&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;name&quot; value=&quot;${product.name}&quot; \u002F&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;price&quot; value=&quot;${product.price}&quot; \u002F&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;quantity_max&quot; value=&quot;${product.inventory}&quot; \u002F&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;image&quot; value=&quot;${product.image.url}&quot; \u002F&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;code&quot; value=&quot;${product.slug}&quot; \u002F&gt;\n\n      &lt;input\n        type=&quot;number&quot;\n        min=&quot;1&quot;\n        step=&quot;1&quot;\n        value=&quot;&quot;\n        name=&quot;quantity&quot;\n        placeholder=&quot;Quantity&quot;\n        class=&quot;mt-5 mb-3 border border-gray-400 rounded py-2 px-3 block&quot;\n      \u002F&gt;\n\n      &lt;button\n        type=&quot;submit&quot;\n        class=&quot;bg-gray-600 rounded py-2 px-6 text-gray-100 cursor-pointer&quot;\n      &gt;\n        Add to Cart\n      &lt;\u002Fbutton&gt;\n    &lt;\u002Fform&gt;\n  `;\n\n  return process.env.FOXY_STORE_SECRET ? signer.signHtml(formHtml) : formHtml;\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Since the HTML in this file includes Tailwind CSS, we’ll need to add this folder to the \u003Ccode class=\"badge bg-soft-danger text-danger\">purge\u003C\u002Fcode> option in the Tailwind config file:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F tailwind.config.js\n\nmodule.exports = {\n  purge: [&quot;.\u002Fpages\u002F**\u002F*.js&quot;, &quot;.\u002Fcomponents\u002F**\u002F*.js&quot;, &quot;.\u002Flib\u002F**\u002F*.js&quot;],\n  ...\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, we can replace all Foxy purchase links and forms in the pages with the functions:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Findex.js\n\n...\nimport { getFoxyLink } from &quot;..\u002Flib\u002Ffoxy-signer&quot;;\n\nexport default function Home({ featuredProducts }) {\n  return (\n    ...\n    &lt;a\n      href={product.foxyBuyLink}\n      className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;\n    &gt;\n      Buy Now\n    &lt;\u002Fa&gt;\n    ...\n  );\n}\n\nexport const getStaticProps = async () =&gt; {\n  const featuredProducts = await getFeaturedProducts();\n\n  \u002F\u002F Add a foxyBuyLink property for the generated link\n  return {\n    props: {\n      featuredProducts: featuredProducts.map((product) =&gt; {\n        return {\n          ...product,\n          foxyBuyLink: getFoxyLink(product),\n        };\n      }),\n    },\n  };\n};\n\n\n\u002F\u002F pages\u002Fproducts\u002Findex.js\n\n...\nimport { getFoxyLink } from &quot;..\u002F..\u002Flib\u002Ffoxy-signer&quot;;\n\nexport default function AllProducts({ allProducts }) {\n  return (\n    ...\n    &lt;a\n      href={product.foxyBuyLink}\n      className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;\n    &gt;\n      Buy Now\n    &lt;\u002Fa&gt;\n    ...\n  );\n}\n\nexport const getStaticProps = async () =&gt; {\n  const allProducts = await getAllProducts();\n\n  return {\n    props: {\n      allProducts: allProducts.map((product) =&gt; {\n        return {\n          ...product,\n          foxyBuyLink: getFoxyLink(product),\n        };\n      }),\n    },\n  };\n};\n\n\n\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\n...\nimport { getFoxyForm } from &quot;..\u002F..\u002Flib\u002Ffoxy-signer&quot;;\n\nexport default function Product({ product, foxyForm }) {\n  return (\n    ...\n    \u002F\u002F replace the whole &lt;form \u002F&gt; with this &lt;div \u002F&gt;\n    &lt;div dangerouslySetInnerHTML={{ __html: foxyForm }}&gt;&lt;\u002Fdiv&gt;\n    ...\n  );\n}\n\nexport async function getStaticProps({ params }) {\n  const data = await getProductBySlug(params.slug);\n\n  \u002F\u002F Add a prop for the form HTML\n  return {\n    props: {\n      product: data?.product ?? null,\n      foxyForm: getFoxyForm(data?.product),\n    },\n  };\n}\n\n...\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 level=\"2\">We did it! 🎉\u003C\u002Fh2>\u003Cp>Congratulations! You’ve successfully built your own ecommerce website in JAMstack!\u003C\u002Fp>\u003Cp>To bring it further, you can deploy it to your preferred static site hosting platform like \u003Ca href=\"https:\u002F\u002Fvercel.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Vercel\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fwww.netlify.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Netlify\u003C\u002Fa> or \u003Ca href=\"https:\u002F\u002Fpages.cloudflare.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\" fw-bold\">Cloudflare Pages\u003C\u002Fa>. Comment the deployed link down below to show what you’ve built (or email us if you’re being shy)!\u003C\u002Fp>",[],[4347],{"type":4348,"content":4349},"html","\u003Cp>In this step-by-step guide, we’re going to build a ecommerce website from scratch using:\u003C\u002Fp>\u003Cul tight=\"false\">\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Fnextjs.org\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Next.js\u003C\u002Fa> – a React framework that offers features like image optimization, hybrid static &amp; server rendering, TypeScript support, smart bundling, route pre-fetching and more.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Fwww.contentful.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Contentful\u003C\u002Fa> – a headless CMS (content management system).\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Ffoxy.io\u002F\" class=\"\">Foxy\u003C\u002Fa> – a headless ecommerce solution providing a highly customizable and powerful shopping cart and checkout experience.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftailwindcss.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Tailwind CSS\u003C\u002Fa> – a utility-first CSS framework.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ca href=\"https:\u002F\u002Fgraphql.org\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">GraphQL\u003C\u002Fa> – a query language for APIs.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch3 level=\"3\">Take a sneak peek of what we’re building\u003C\u002Fh3>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app1-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-https-foxy-contentful-nextjs-vercel-app2-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>Live demo: \u003Ca href=\"https:\u002F\u002Ffoxy-contentful-nextjs.vercel.app\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https:\u002F\u002Ffoxy-contentful-nextjs.vercel.app\u002F\u003C\u002Fa>\u003Cbr>Source code: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFoxy\u002Ffoxy-contentful-nextjs-example-site\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https:\u002F\u002Fgithub.com\u002FFoxy\u002Ffoxy-contentful-nextjs-example-site\u003C\u002Fa>\u003C\u002Fp>\u003Cp>⚠️ \u003Cstrong>Note\u003C\u002Fstrong>: This guide assumes you have basic knowledge of JavaScript and React. If you’re new to React, feel free to check out the \u003Ca href=\"https:\u002F\u002Freactjs.org\u002Ftutorial\u002Ftutorial.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">official React tutorial\u003C\u002Fa> first. It’ll also be helpful to go through the \u003Ca href=\"https:\u002F\u002Fnextjs.org\u002Flearn\u002Fbasics\u002Fcreate-nextjs-app\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">basics of Next.js\u003C\u002Fa>.\u003C\u002Fp>\u003Ch2 level=\"2\">Initialize project\u003C\u002Fh2>\u003Ch3 level=\"3\">Requirements\u003C\u002Fh3>\u003Cp>Next.js requires Node.js 10.13 or later and Tailwind CSS requires Node.js 12.13.0 or higher. You can run \u003Ccode class=\"badge bg-soft-danger text-danger\">node -v\u003C\u002Fcode> in the terminal to check the version on your system. \u003Ccode class=\"badge bg-soft-danger text-danger\">npm\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">npx\u003C\u002Fcode> are also required to install dependencies and run commands, which should come out of the box when you install Node.js.\u003C\u002Fp>\u003Ch3 level=\"3\">Create a Next.js app\u003C\u002Fh3>\u003Cp>In the terminal, \u003Ccode class=\"badge bg-soft-danger text-danger\">cd\u003C\u002Fcode> to a directory you want to start this project, and run the following command to create a new Next.js app called \u003Ccode class=\"badge bg-soft-danger text-danger\">foxy-contentful-nextjs\u003C\u002Fcode> (or whatever you like):\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npx create-next-app foxy-contentful-nextjs\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>After the installation is complete, \u003Ccode class=\"badge bg-soft-danger text-danger\">cd foxy-contentful-nextjs\u003C\u002Fcode> and run \u003Ccode class=\"badge bg-soft-danger text-danger\">npm run dev\u003C\u002Fcode> . The development server will start on port 3000. Open \u003Ca href=\"http:\u002F\u002Flocalhost:3000\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">http:\u002F\u002Flocalhost:3000\u002F\u003C\u002Fa> in your browser, you’ll then see a “Welcome to Next.js!” page.\u003C\u002Fp>\u003Ch3 level=\"3\">Set up Tailwind CSS\u003C\u002Fh3>\u003Cp>Following \u003Ca href=\"https:\u002F\u002Ftailwindcss.com\u002Fdocs\u002Fguides\u002Fnextjs\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Tailwind’s Next.js setup guide\u003C\u002Fa>, we can run the command below to install Tailwind and its peer-dependencies:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npm install -D tailwindcss@latest postcss@latest autoprefixer@latest\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, generate \u003Ccode class=\"badge bg-soft-danger text-danger\">tailwind.config.js\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">postcss.config.js\u003C\u002Fcode> configuration files using this command:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npx tailwindcss init -p\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Open \u003Ccode class=\"badge bg-soft-danger text-danger\">tailwind.config.js\u003C\u002Fcode> in the text editor, and configure the \u003Ccode class=\"badge bg-soft-danger text-danger\">purge\u003C\u002Fcode> option so that unused styles would be removed in production:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F tailwind.config.js\n\nmodule.exports = {\n  purge: [&quot;.\u002Fpages\u002F**\u002F*.{js,ts,jsx,tsx}&quot;, &quot;.\u002Fcomponents\u002F**\u002F*.{js,ts,jsx,tsx}&quot;],\n  darkMode: false, \u002F\u002F or &#039;media&#039; or &#039;class&#039;\n  theme: {\n    extend: {},\n  },\n  variants: {\n    extend: {},\n  },\n  plugins: [],\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>After importing Tailwind in \u003Ccode class=\"badge bg-soft-danger text-danger\">pages\u002F_app.js\u003C\u002Fcode>, we can delete the CSS files Next.js creates by default like \u003Ccode class=\"badge bg-soft-danger text-danger\">globals.css\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">Home.module.css\u003C\u002Fcode>, and any references to them.\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002F_app.js\n\nimport &quot;tailwindcss\u002Ftailwind.css&quot;;\n\nfunction MyApp({ Component, pageProps }) {\n  return &lt;Component {...pageProps} \u002F&gt;;\n}\n\nexport default MyApp;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now, let’s make some changes in the \u003Ccode class=\"badge bg-soft-danger text-danger\">index.js\u003C\u002Fcode> page:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Findex.js\n\nexport default function Home() {\n  return (\n    &lt;div className=&quot;px-16 py-10 md:px-24 lg:px-28&quot;&gt;\n      &lt;h1 className=&quot;text-2xl&quot;&gt;Welcome to foxy-contentful-nextjs!&lt;\u002Fh1&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>If the dev server was shut down in a previous step, run \u003Ccode class=\"badge bg-soft-danger text-danger\">npm run dev\u003C\u002Fcode> again and we’ll see Tailwind is applied to the index page.\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-Screenshot-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch2 level=\"2\">Add products in Contentful and fetch product data\u003C\u002Fh2>\u003Ch3 level=\"3\">Set up Contentful\u003C\u002Fh3>\u003Cp>Sign up or log in at \u003Ca href=\"https:\u002F\u002Fwww.contentful.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Contentful\u003C\u002Fa> and create a new empty space from the \u003Ca href=\"https:\u002F\u002Fapp.contentful.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">dashboard\u003C\u002Fa>. From the newly created space, go to the \u003Cstrong>Content model\u003C\u002Fstrong> tab and add a new content type: give it the \u003Cstrong>Name\u003C\u002Fstrong> \u003Ccode class=\"badge bg-soft-danger text-danger\">Product\u003C\u002Fcode>, and the \u003Cstrong>Api Identifier\u003C\u002Fstrong> will be auto-generated as \u003Ccode class=\"badge bg-soft-danger text-danger\">product\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreen-Shot-2021-06-02-at-5.23.05-PM-1-1024x762.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>Then, add the following fields to the \u003Ccode class=\"badge bg-soft-danger text-danger\">Product\u003C\u002Fcode> model and configure all fields as required:\u003C\u002Fp>\u003Cul tight=\"false\">\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">name\u003C\u002Fcode> – \u003Cstrong>Text\u003C\u002Fstrong> field (type \u003Cstrong>short text\u003C\u002Fstrong>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">slug\u003C\u002Fcode> – \u003Cstrong>Text\u003C\u002Fstrong> field (type \u003Cstrong>short text\u003C\u002Fstrong>). You can optionally go to the settings of this field, then under \u003Cstrong>Appearance\u003C\u002Fstrong>, select \u003Cstrong>Slug\u003C\u002Fstrong> so this field is displayed as a slug of the \u003Ccode class=\"badge bg-soft-danger text-danger\">name\u003C\u002Fcode> field\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">price\u003C\u002Fcode> – \u003Cstrong>Number\u003C\u002Fstrong> field (type \u003Cstrong>Decimal\u003C\u002Fstrong>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">image\u003C\u002Fcode> – \u003Cstrong>Media\u003C\u002Fstrong> field (type \u003Cstrong>One file\u003C\u002Fstrong>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">inventory\u003C\u002Fcode> – \u003Cstrong>Number\u003C\u002Fstrong> field (type \u003Cstrong>Integer\u003C\u002Fstrong>)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">description\u003C\u002Fcode> – \u003Cstrong>Rich text\u003C\u002Fstrong> field\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode class=\"badge bg-soft-danger text-danger\">featured\u003C\u002Fcode> – \u003Cstrong>Boolean\u003C\u002Fstrong> field\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreen-Shot-2021-06-02-at-5.27.50-PM-1024x576.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Cp>Click “save” in the upper right. Next, head to the \u003Cstrong>Content\u003C\u002Fstrong> tab, add a few products and publish.\u003C\u002Fp>\u003Ch3 level=\"3\">Fetch product data\u003C\u002Fh3>\u003Cp>Before we get into the code, we first need to get the API keys so our Next.js app can communicate with Contentful. Go \u003Cstrong>Settings\u003C\u002Fstrong> &gt; \u003Cstrong>API keys\u003C\u002Fstrong> from the current Contentful space. From the \u003Cstrong>Content delivery \u002F preview tokens\u003C\u002Fstrong> tab, click the \u003Cstrong>Add API key\u003C\u002Fstrong> button to generate the access tokens. Give it a name and description that makes sense for what you’re building.\u003C\u002Fp>\u003Cp>Back in the code editor, create a new file called \u003Ccode class=\"badge bg-soft-danger text-danger\">.env.local\u003C\u002Fcode> in the root directory for storing all the environment variables, and paste the \u003Cstrong>Space ID\u003C\u002Fstrong> and \u003Cstrong>Content Delivery API – access token\u003C\u002Fstrong> values in it:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F .env.local\n\nCONTENTFUL_SPACE_ID=\nCONTENTFUL_ACCESS_TOKEN=\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>We’ll use \u003Ccode class=\"badge bg-soft-danger text-danger\">[axios](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Faxios)\u003C\u002Fcode> (an easy-to-use library to make HTTP requests) lfor data fetching, so open the terminal and install:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npm install axios\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, create a new folder \u003Ccode class=\"badge bg-soft-danger text-danger\">lib\u003C\u002Fcode> for some helper functions. Inside the folder, create a \u003Ccode class=\"badge bg-soft-danger text-danger\">api.js\u003C\u002Fcode> file, where we’ll write the functions to fetch data via the \u003Ca href=\"https:\u002F\u002Fwww.contentful.com\u002Fdevelopers\u002Fdocs\u002Freferences\u002Fgraphql\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Contentful GraphQL Content API\u003C\u002Fa>. Review the following code to get an idea of what it’s doing.\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F lib\u002Fapi.js\n\nimport axios from &quot;axios&quot;;\n\n\u002F\u002F product fields to fetch\nconst PRODUCT_GRAPHQL_FIELDS = `\nname\nslug\nprice\nimage {\n  url\n}\ninventory\ndescription {\n  json\n}\n`;\n\n\u002F\u002F connect Contentful\nasync function fetchGraphQL(query) {\n  try {\n    const res = await axios.post(\n      `https:\u002F\u002Fgraphql.contentful.com\u002Fcontent\u002Fv1\u002Fspaces\u002F${process.env.CONTENTFUL_SPACE_ID}`,\n      { query },\n      {\n        headers: {\n          &quot;Content-Type&quot;: &quot;application\u002Fjson&quot;,\n          Authorization: `Bearer ${process.env.CONTENTFUL_ACCESS_TOKEN}`,\n        },\n      }\n    );\n    return res.data;\n  } catch (error) {\n    console.error(&quot;Failed to fetch Contentful&quot;);\n  }\n}\n\n\u002F\u002F helper functions for extracting product entries from response\nfunction extractProduct(fetchResponse) {\n  return fetchResponse?.data?.productCollection?.items?.[0];\n}\n\nfunction extractProductEntries(fetchResponse) {\n  return fetchResponse?.data?.productCollection?.items;\n}\n\n\u002F\u002F get products whose featured field is set to true\nexport async function getFeaturedProducts() {\n  const entries = await fetchGraphQL(\n    `query {\n      productCollection(where: { featured: true }) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return extractProductEntries(entries);\n}\n\n\u002F\u002F get all products\nexport async function getAllProducts() {\n  const entries = await fetchGraphQL(\n    `query {\n      productCollection(where: { slug_exists: true }) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return extractProductEntries(entries);\n}\n\n\u002F\u002F get a specific product by its slug\nexport async function getProductBySlug(slug) {\n  const entry = await fetchGraphQL(\n    `query {\n      productCollection(where: { slug: &quot;${slug}&quot; }, limit: 1) {\n        items {\n          ${PRODUCT_GRAPHQL_FIELDS}\n        }\n      }\n    }`\n  );\n\n  return {\n    product: extractProduct(entry),\n  };\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 level=\"2\">Create pages and components\u003C\u002Fh2>\u003Ch3 level=\"3\">\u003Ccode class=\"badge bg-soft-danger text-danger\">&lt;Layout \u002F&gt;\u003C\u002Fcode> component\u003C\u002Fh3>\u003Cp>First, create a \u003Ccode class=\"badge bg-soft-danger text-danger\">components\u003C\u002Fcode> folder and a \u003Ccode class=\"badge bg-soft-danger text-danger\">layout.js\u003C\u002Fcode> file in it. We’ll create a \u003Ccode class=\"badge bg-soft-danger text-danger\">Layout\u003C\u002Fcode> component that wraps the entire app. Note that the class names are Tailwind classes.\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F components\u002Flayout.js\n\nimport Link from &quot;next\u002Flink&quot;;\n\nexport default function Layout({ children }) {\n  return (\n    &lt;&gt;\n      &lt;nav className=&quot;flex items-center h-16 bg-gray-600 text-gray-100 tracking-widest&quot;&gt;\n        &lt;h1 className=&quot;flex-grow ml-5 text-2xl font-semibold&quot;&gt;Foxy Store&lt;\u002Fh1&gt;\n\n        &lt;Link href=&quot;\u002F&quot;&gt;\n          &lt;a className=&quot;mr-5 text-xl font-medium hover:underline&quot;&gt;Home&lt;\u002Fa&gt;\n        &lt;\u002FLink&gt;\n\n        &lt;Link href=&quot;\u002Fproducts&quot;&gt;\n          &lt;a className=&quot;mr-5 text-xl font-medium hover:underline&quot;&gt;Products&lt;\u002Fa&gt;\n        &lt;\u002FLink&gt;\n\n        &lt;a className=&quot;mr-5 text-xl font-medium hover:underline cursor-pointer&quot;&gt;\n          Cart\n        &lt;\u002Fa&gt;\n      &lt;\u002Fnav&gt;\n\n      &lt;main&gt;{children}&lt;\u002Fmain&gt;\n    &lt;\u002F&gt;\n  );\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>💡 In Next.js, we use the \u003Ccode class=\"badge bg-soft-danger text-danger\">Link\u003C\u002Fcode> component from \u003Ccode class=\"badge bg-soft-danger text-danger\">next\u002Flink\u003C\u002Fcode> to wrap the \u003Ccode class=\"badge bg-soft-danger text-danger\">&lt;a&gt;\u003C\u002Fcode> tag. This component allows us to do client-side navigation to a different page in the application.\u003C\u002Fp>\u003Cp>Then edit the \u003Ccode class=\"badge bg-soft-danger text-danger\">_app.js\u003C\u002Fcode> file to include the \u003Ccode class=\"badge bg-soft-danger text-danger\">Layout\u003C\u002Fcode> component across the application:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002F_app.js\n\nimport &quot;tailwindcss\u002Ftailwind.css&quot;;\nimport Layout from &quot;..\u002Fcomponents\u002Flayout&quot;;\n\nfunction MyApp({ Component, pageProps }) {\n  return (\n    &lt;Layout&gt;\n      &lt;Component {...pageProps} \u002F&gt;\n    &lt;\u002FLayout&gt;\n  );\n}\n\nexport default MyApp;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>And we’ll see a nav bar on the top of the page.\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot_2021-06-02-Screenshot1-1024x580.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch3 level=\"3\">Home page with featured products\u003C\u002Fh3>\u003Cp>💡 With the file-system based router in Next.js, we can easily create pages that are associated with a route based on their file name.\u003C\u002Fp>\u003Cp>Modify the \u003Ccode class=\"badge bg-soft-danger text-danger\">pages\u002Findex.js\u003C\u002Fcode> page to display the products that are configured as featured in Contentful:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Findex.js\n\nimport Link from &quot;next\u002Flink&quot;;\nimport Image from &quot;next\u002Fimage&quot;;\n\nimport { getFeaturedProducts } from &quot;..\u002Flib\u002Fapi&quot;;\n\nexport default function Home({ featuredProducts }) {\n  return (\n    &lt;div className=&quot;px-16 py-10 md:px-24 lg:px-28&quot;&gt;\n      &lt;h2 className=&quot;text-2xl mb-2&quot;&gt;Featured Products&lt;\u002Fh2&gt;\n\n      &lt;div className=&quot;grid md:grid-cols-2 lg:grid-cols-3 gap-10&quot;&gt;\n        {featuredProducts.map((product) =&gt; (\n          &lt;div\n            key={product.slug}\n            className=&quot;rounded bg-white border-gray-200 shadow-md hover:shadow-xl flex justify-center flex-col px-2 pt-3 pb-5&quot;\n          &gt;\n            &lt;Image\n              src={product.image.url}\n              layout=&quot;intrinsic&quot;\n              width={550}\n              height={370}\n            \u002F&gt;\n\n            &lt;div className=&quot;mt-4 flex items-baseline&quot;&gt;\n              &lt;h1 className=&quot;ml-1 text-xl flex-1&quot;&gt;{product.name}&lt;\u002Fh1&gt;\n              &lt;h2 className=&quot;mr-2 text-lg text-gray-500&quot;&gt;${product.price}&lt;\u002Fh2&gt;\n            &lt;\u002Fdiv&gt;\n\n            &lt;div className=&quot;mt-4&quot;&gt;\n              &lt;a className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;&gt;\n                Buy Now\n              &lt;\u002Fa&gt;\n              &lt;Link\n                as={`\u002Fproducts\u002F${product.slug}`}\n                href=&quot;\u002Fproducts\u002F[slug]&quot;\n                passHref\n              &gt;\n                &lt;a className=&quot;ml-3 border border-gray-400 rounded px-4 py-2 text-gray-600 cursor-pointer&quot;&gt;\n                  Details\n                &lt;\u002Fa&gt;\n              &lt;\u002FLink&gt;\n            &lt;\u002Fdiv&gt;\n          &lt;\u002Fdiv&gt;\n        ))}\n      &lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\n\nexport const getStaticProps = async () =&gt; {\n  const featuredProducts = await getFeaturedProducts();\n\n  return {\n    props: { featuredProducts },\n  };\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>💡 If we export an \u003Ccode class=\"badge bg-soft-danger text-danger\">async\u003C\u002Fcode> function called \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticProps\u003C\u002Fcode> from a page, Next.js will pre-render this page \u003Cstrong>at build time\u003C\u002Fstrong> using the props returned by \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticProps\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>⚠️ If the above code errors, take a look at the error message and try solving it. Or just continue on…\u003C\u002Fp>\u003Cp>In the above code, we use the new \u003Ccode class=\"badge bg-soft-danger text-danger\">\u003Ca href=\"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fbasic-features\u002Fimage-optimization\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">&lt;Image \u002F&gt;\u003C\u002Fa>\u003C\u002Fcode>\u003Ca href=\"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fbasic-features\u002Fimage-optimization\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"> component\u003C\u002Fa> introduced in Next.js 10, which offers automatic image optimization. To properly show images hosted on an external URL, we’ll need to specify the image domains in the next.config.js file:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F next.config.js\n\nmodule.exports = {\n  images: {\n    domains: [&quot;images.ctfassets.net&quot;],\n  },\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-34-18-https-foxy-contentful-nextjs-vercel-app-1024x642.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch3 level=\"3\">All products page\u003C\u002Fh3>\u003Cp>Let’s also create a page that contains all products, which would be similar to the home page: create a \u003Ccode class=\"badge bg-soft-danger text-danger\">products\u003C\u002Fcode> directory under \u003Ccode class=\"badge bg-soft-danger text-danger\">pages\u003C\u002Fcode> , then create an \u003Ccode class=\"badge bg-soft-danger text-danger\">index.js\u003C\u002Fcode> file that contains all products:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Fproducts\u002Findex.js\n\nimport Link from &quot;next\u002Flink&quot;;\nimport Image from &quot;next\u002Fimage&quot;;\n\nimport { getAllProducts } from &quot;..\u002F..\u002Flib\u002Fapi&quot;;\n\nexport default function AllProducts({ allProducts }) {\n  return (\n    &lt;div className=&quot;px-16 py-10 md:px-24 lg:px-28&quot;&gt;\n      &lt;h2 className=&quot;text-2xl mb-2&quot;&gt;All Products&lt;\u002Fh2&gt;\n\n      &lt;div className=&quot;grid md:grid-cols-2 lg:grid-cols-3 gap-10&quot;&gt;\n        {allProducts.map((product) =&gt; (\n          &lt;div\n            key={product.slug}\n            className=&quot;rounded bg-white border-gray-200 shadow-md hover:shadow-xl flex justify-center flex-col px-2 pt-3 pb-5&quot;\n          &gt;\n            &lt;Image\n              src={product.image.url}\n              layout=&quot;intrinsic&quot;\n              width={550}\n              height={370}\n            \u002F&gt;\n\n            &lt;div className=&quot;mt-4 flex items-baseline&quot;&gt;\n              &lt;h1 className=&quot;ml-1 text-xl flex-1&quot;&gt;{product.name}&lt;\u002Fh1&gt;\n              &lt;h2 className=&quot;mr-2 text-lg text-gray-500&quot;&gt;${product.price}&lt;\u002Fh2&gt;\n            &lt;\u002Fdiv&gt;\n\n            &lt;div className=&quot;mt-4&quot;&gt;\n              &lt;a className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;&gt;\n                Buy Now\n              &lt;\u002Fa&gt;\n              &lt;Link\n                as={`\u002Fproducts\u002F${product.slug}`}\n                href=&quot;\u002Fproducts\u002F[slug]&quot;\n                passHref\n              &gt;\n                &lt;a className=&quot;ml-3 border border-gray-400 rounded px-4 py-2 text-gray-600 cursor-pointer&quot;&gt;\n                  Details\n                &lt;\u002Fa&gt;\n              &lt;\u002FLink&gt;\n            &lt;\u002Fdiv&gt;\n          &lt;\u002Fdiv&gt;\n        ))}\n      &lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\n\nexport const getStaticProps = async () =&gt; {\n  const allProducts = await getAllProducts();\n\n  return {\n    props: { allProducts },\n  };\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-35-14-https-foxy-contentful-nextjs-vercel-app-1024x919.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch3 level=\"3\">Pages for each product\u003C\u002Fh3>\u003Cp>Remember we’ve configured the product description field as a rich text field in Contentful? This type of field would be returned as a object in response, so we’ll use \u003Ccode class=\"badge bg-soft-danger text-danger\">[@contentful\u002Frich-text-react-renderer](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@contentful\u002Frich-text-react-renderer)\u003C\u002Fcode> to parse the text content in the object:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npm install @contentful\u002Frich-text-react-renderer\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Create dynamic route pages for products in \u003Ccode class=\"badge bg-soft-danger text-danger\">pages\u002Fproducts\u002F[slug].js\u003C\u002Fcode>, with an add-to-cart form inside:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\nimport Image from &quot;next\u002Fimage&quot;;\nimport { documentToReactComponents } from &quot;@contentful\u002Frich-text-react-renderer&quot;;\n\nimport { getAllProducts, getProductBySlug } from &quot;..\u002F..\u002Flib\u002Fapi&quot;;\n\nexport default function Product({ product }) {\n  return (\n    &lt;div className=&quot;px-16 py-10 md:px-24 lg:px-28&quot;&gt;\n      &lt;div className=&quot;mt-8 grid lg:grid-cols-2&quot;&gt;\n        &lt;div&gt;\n          &lt;Image\n            src={product.image.url}\n            layout=&quot;responsive&quot;\n            width={550}\n            height={350}\n          \u002F&gt;\n        &lt;\u002Fdiv&gt;\n\n        &lt;div className=&quot;py-5 lg:px-10 lg:py-3&quot;&gt;\n          &lt;h1 className=&quot;text-3xl&quot;&gt;{product.name}&lt;\u002Fh1&gt;\n          &lt;h2 className=&quot;text-2xl text-gray-600&quot;&gt;${product.price}&lt;\u002Fh2&gt;\n          &lt;div className=&quot;my-2 mx-1&quot;&gt;\n            {documentToReactComponents(product.description.json)}\n          &lt;\u002Fdiv&gt;\n\n          &lt;form&gt;\n            &lt;input\n              type=&quot;number&quot;\n              min=&quot;1&quot;\n              step=&quot;1&quot;\n              defaultValue=&quot;1&quot;\n              name=&quot;quantity&quot;\n              placeholder=&quot;Quantity&quot;\n              className=&quot;mt-5 mb-3 border border-gray-400 rounded py-2 px-3 block&quot;\n            \u002F&gt;\n\n            &lt;button\n              type=&quot;submit&quot;\n              className=&quot;bg-gray-600 rounded py-2 px-6 text-gray-100 cursor-pointer&quot;\n            &gt;\n              Add to Cart\n            &lt;\u002Fbutton&gt;\n          &lt;\u002Fform&gt;\n        &lt;\u002Fdiv&gt;\n      &lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\n\nexport async function getStaticProps({ params }) {\n  const data = await getProductBySlug(params.slug);\n\n  return {\n    props: {\n      product: data?.product ?? null,\n    },\n  };\n}\n\nexport async function getStaticPaths() {\n  const allProducts = await getAllProducts();\n\n  return {\n    paths: allProducts?.map(({ slug }) =&gt; `\u002Fproducts\u002F${slug}`) ?? [],\n    fallback: false,\n  };\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>💡 If a page has dynamic routes and uses \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticProps\u003C\u002Fcode> it needs to define a list of paths that have to be rendered to HTML at build time.\u003C\u002Fp>\u003Cp>If we export an \u003Ccode class=\"badge bg-soft-danger text-danger\">async\u003C\u002Fcode> function called \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticPaths\u003C\u002Fcode> from a page that uses dynamic routes, Next.js will statically pre-render all the paths specified by \u003Ccode class=\"badge bg-soft-danger text-danger\">getStaticPaths\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fwww.foxy.io\u002Fblog\u002Fwp-content\u002Fuploads\u002FScreenshot-2021-06-14-at-23-36-19-https-foxy-contentful-nextjs-vercel-app-1024x573.png\" class=\"img-fluid my-3 rounded-2\">\u003C\u002Fp>\u003Ch2 level=\"2\">Integrate Foxy into the Next.js app\u003C\u002Fh2>\u003Cp>If you haven’t already, \u003Ca href=\"https:\u002F\u002Fadmin.foxycart.com\u002Fsignup\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">sign up for a free account at Foxy\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Add a new variable for Foxy subdomain in the \u003Ccode class=\"badge bg-soft-danger text-danger\">.env.local\u003C\u002Fcode> file, with a \u003Ccode class=\"badge bg-soft-danger text-danger\">NEXT_PUBLIC_\u003C\u002Fcode> prefix so it’s exposed to the browser:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F .env.local\n\nNEXT_PUBLIC_FOXY_SUBDOMAIN=\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>We’ll need to include Foxy’s script before \u003Ccode class=\"badge bg-soft-danger text-danger\">&lt;\u002Fbody&gt;\u003C\u002Fcode> tag, which should be added in the \u003Ccode class=\"badge bg-soft-danger text-danger\">_document.js\u003C\u002Fcode> file in Next.js:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002F_document.js\n\nimport Document, { Html, Head, Main, NextScript } from &quot;next\u002Fdocument&quot;;\n\nexport default class MyDocument extends Document {\n  render() {\n    return (\n      &lt;Html lang=&quot;en&quot;&gt;\n        &lt;Head \u002F&gt;\n        &lt;body&gt;\n          &lt;Main \u002F&gt;\n          &lt;NextScript \u002F&gt;\n\n          {\u002F* FOXYCART *\u002F}\n          &lt;script\n            data-cfasync=&quot;false&quot;\n            src={`https:\u002F\u002Fcdn.foxycart.com\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}\u002Floader.js`}\n            async\n            defer\n          &gt;&lt;\u002Fscript&gt;\n        &lt;\u002Fbody&gt;\n      &lt;\u002FHtml&gt;\n    );\n  }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>There are two ways to add a product to cart in Foxy – via a link or a form, then modify the URL parameters or form elements as needed. Some examples can be found on the homepage \u003Ca href=\"https:\u002F\u002Ffoxy.io\u002F#start\" class=\"\">here\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>In addition to some core product information like \u003Ccode class=\"badge bg-soft-danger text-danger\">name\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">price\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">quantity\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">code\u003C\u002Fcode>, \u003Ccode class=\"badge bg-soft-danger text-danger\">image\u003C\u002Fcode>, we can also add a \u003Ccode class=\"badge bg-soft-danger text-danger\">quantity_max\u003C\u002Fcode> parameter that indicates the product’s current inventory to prevent oversell. A complete list of product parameters can be found \u003Ca href=\"https:\u002F\u002Fdocs.foxycart.com\u002Fv\u002F2.0\u002Fproducts#a_complete_list_of_product_parameters\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here\u003C\u002Fa>.\u003C\u002Fp>\u003Ch3 level=\"3\">Buy Now button\u003C\u002Fh3>\u003Cp>A Buy Now button often refers to skipping the shopping cart and going to checkout directly. In Foxy, we can do this by attaching a \u003Ccode class=\"badge bg-soft-danger text-danger\">&amp;cart=checkout\u003C\u002Fcode> parameter to the purchase link. So, modify the \u003Ccode class=\"badge bg-soft-danger text-danger\">href\u003C\u002Fcode> attribute in the Buy Now buttons on the featured products page and all products page to this:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Findex.js &amp;&amp; pages\u002Fproducts\u002Findex.js\n\n&lt;a\n  href={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?name=${encodeURIComponent(product.name)}&amp;price=${product.price}&amp;image=${encodeURIComponent(product.image.url)}&amp;code=${encodeURIComponent(product.slug)}&amp;quantity_max=${product.inventory}&amp;cart=checkout`}  \n  className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;\n&gt;\n  Buy Now\n&lt;\u002Fa&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>💡 Wrapping the URL parameters in \u003Ccode class=\"badge bg-soft-danger text-danger\">encodeURIComponent()\u003C\u002Fcode> encodes them so that they get passed to Foxy correctly.\u003C\u002Fp>\u003Cp>🔐 You may be thinking “Wait a minute, those values can be changed by a website visitor!” Don’t worry. We’ll lock things down a little further down the page.\u003C\u002Fp>\u003Ch3 level=\"3\">Add-to-cart form\u003C\u002Fh3>\u003Cp>For a purchase form, besides adding the \u003Ccode class=\"badge bg-soft-danger text-danger\">action\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">method\u003C\u002Fcode> attributes to the \u003Ccode class=\"badge bg-soft-danger text-danger\">form\u003C\u002Fcode> element, we also need some elements to pass the product details to the cart, so the add-to-cart form on the product page will look something like this:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\n&lt;form\n  action={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart`}\n  method=&quot;POST&quot;\n&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;name&quot; value={product.name} \u002F&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;price&quot; value={product.price} \u002F&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;quantity_max&quot; value={product.inventory} \u002F&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;image&quot; value={product.image.url} \u002F&gt;\n  ...\n&lt;\u002Fform&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 level=\"3\">Mini-cart\u003C\u002Fh3>\u003Cp>Let’s also add a quick link in the navbar to open the cart and indicate the product quantity in cart:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F components\u002Flayout.js\n\n&lt;a\n  href={`https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?cart=view`}\n  className=&quot;mr-5 text-xl font-medium hover:underline cursor-pointer&quot;\n&gt;\n  Cart (&lt;span data-fc-id=&quot;minicart-quantity&quot;&gt;0&lt;\u002Fspan&gt;)\n&lt;\u002Fa&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 level=\"2\">Add Foxy HMAC cart validation\u003C\u002Fh2>\u003Cp>You probably know how easy is to modify the HTML on a webpage using the browser’s dev tools, which means there is a possibility that someone can modify the product price on your site and checkout without any issues. This sounds a nightmare to merchants, but the good news is, Foxy provides a \u003Ca href=\"https:\u002F\u002Fdocs.foxycart.com\u002Fv\u002F2.0\u002Fhmac_validation\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">HMAC cart validation\u003C\u002Fa> functionality, and with \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFoxy\u002Ffoxy-sdk\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">the official Foxy SDK\u003C\u002Fa> released recently, this can be done in just a few more steps.\u003C\u002Fp>\u003Cp>💡 Though the Foxy SDK can \u003Ca href=\"https:\u002F\u002Fsdk.foxy.dev\u002Fclasses\u002F_backend_index_.signer.html#signhtml\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">sign entire HTML pages via the \u003C\u002Fa>\u003Ccode class=\"badge bg-soft-danger text-danger\">\u003Ca href=\"https:\u002F\u002Fsdk.foxy.dev\u002Fclasses\u002F_backend_index_.signer.html#signhtml\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">signHtml\u003C\u002Fa>\u003C\u002Fcode>\u003Ca href=\"https:\u002F\u002Fsdk.foxy.dev\u002Fclasses\u002F_backend_index_.signer.html#signhtml\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"> method\u003C\u002Fa>, that’s not as easy to do in this Vercel + Next.js build, so we’ll take a more targeted approach, below.\u003C\u002Fp>\u003Ch3 level=\"3\">Implement using Foxy SDK\u003C\u002Fh3>\u003Cp>Head to \u003Ca href=\"https:\u002F\u002Fadmin.foxycart.com\u002Fadmin.php?ThisAction=EditAdvancedFeatures\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Advanced Settings\u003C\u002Fa> in the Foxy admin and enable cart validation by checking the “would you like to enable cart validation?” option. Then look for the “store secret” field, click the “Show” button, and copy the value in the text box.\u003C\u002Fp>\u003Cp>Add a new variable for Foxy store secret in the \u003Ccode class=\"badge bg-soft-danger text-danger\">.env.local\u003C\u002Fcode> file, and paste the value we just copied from the Foxy admin:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F .env.local\n\nFOXY_STORE_SECRET=\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Install Foxy SDK. We’ll use the \u003Ccode class=\"badge bg-soft-danger text-danger\">Signer\u003C\u002Fcode> object to generate signed links and forms.\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>npm i @foxy.io\u002Fsdk\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Create a new file named \u003Ccode class=\"badge bg-soft-danger text-danger\">foxy-signer.js\u003C\u002Fcode> in the \u003Ccode class=\"badge bg-soft-danger text-danger\">lib\u003C\u002Fcode> folder, which includes two helper functions (\u003Ccode class=\"badge bg-soft-danger text-danger\">getFoxyLink\u003C\u002Fcode> and \u003Ccode class=\"badge bg-soft-danger text-danger\">getFoxyForm\u003C\u002Fcode>) that return a Foxy purchase link or form, and have it signed only if the \u003Ccode class=\"badge bg-soft-danger text-danger\">FOXY_STORE_SECRET\u003C\u002Fcode> environment variable is set:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F lib\u002Ffoxy-signer.js\n\nimport * as FoxySDK from &quot;@foxy.io\u002Fsdk&quot;;\n\nconst signer = new FoxySDK.Backend.Signer(process.env.FOXY_STORE_SECRET);\n\nexport function getFoxyLink(product) {\n  const link = `https:\u002F\u002F${process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart?name=${encodeURIComponent(product.name)}&amp;price=${product.price}&amp;image=${encodeURIComponent(product.image.url)}&amp;code=${encodeURIComponent(product.slug)}&amp;quantity_max=${product.inventory}&amp;cart=checkout`;\n\n  return process.env.FOXY_STORE_SECRET ? signer.signUrl(link) : link;\n}\n\nexport function getFoxyForm(product) {\n  const formHtml = `\n    &lt;form action=&quot;&lt;https:\u002F\u002F$&gt;{process.env.NEXT_PUBLIC_FOXY_SUBDOMAIN}.foxycart.com\u002Fcart&quot; method=&quot;POST&quot;&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;name&quot; value=&quot;${product.name}&quot; \u002F&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;price&quot; value=&quot;${product.price}&quot; \u002F&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;quantity_max&quot; value=&quot;${product.inventory}&quot; \u002F&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;image&quot; value=&quot;${product.image.url}&quot; \u002F&gt;\n      &lt;input type=&quot;hidden&quot; name=&quot;code&quot; value=&quot;${product.slug}&quot; \u002F&gt;\n\n      &lt;input\n        type=&quot;number&quot;\n        min=&quot;1&quot;\n        step=&quot;1&quot;\n        value=&quot;&quot;\n        name=&quot;quantity&quot;\n        placeholder=&quot;Quantity&quot;\n        class=&quot;mt-5 mb-3 border border-gray-400 rounded py-2 px-3 block&quot;\n      \u002F&gt;\n\n      &lt;button\n        type=&quot;submit&quot;\n        class=&quot;bg-gray-600 rounded py-2 px-6 text-gray-100 cursor-pointer&quot;\n      &gt;\n        Add to Cart\n      &lt;\u002Fbutton&gt;\n    &lt;\u002Fform&gt;\n  `;\n\n  return process.env.FOXY_STORE_SECRET ? signer.signHtml(formHtml) : formHtml;\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Since the HTML in this file includes Tailwind CSS, we’ll need to add this folder to the \u003Ccode class=\"badge bg-soft-danger text-danger\">purge\u003C\u002Fcode> option in the Tailwind config file:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F tailwind.config.js\n\nmodule.exports = {\n  purge: [&quot;.\u002Fpages\u002F**\u002F*.js&quot;, &quot;.\u002Fcomponents\u002F**\u002F*.js&quot;, &quot;.\u002Flib\u002F**\u002F*.js&quot;],\n  ...\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, we can replace all Foxy purchase links and forms in the pages with the functions:\u003C\u002Fp>\u003Cpre params=\"\">\u003Ccode>\u002F\u002F pages\u002Findex.js\n\n...\nimport { getFoxyLink } from &quot;..\u002Flib\u002Ffoxy-signer&quot;;\n\nexport default function Home({ featuredProducts }) {\n  return (\n    ...\n    &lt;a\n      href={product.foxyBuyLink}\n      className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;\n    &gt;\n      Buy Now\n    &lt;\u002Fa&gt;\n    ...\n  );\n}\n\nexport const getStaticProps = async () =&gt; {\n  const featuredProducts = await getFeaturedProducts();\n\n  \u002F\u002F Add a foxyBuyLink property for the generated link\n  return {\n    props: {\n      featuredProducts: featuredProducts.map((product) =&gt; {\n        return {\n          ...product,\n          foxyBuyLink: getFoxyLink(product),\n        };\n      }),\n    },\n  };\n};\n\n\n\u002F\u002F pages\u002Fproducts\u002Findex.js\n\n...\nimport { getFoxyLink } from &quot;..\u002F..\u002Flib\u002Ffoxy-signer&quot;;\n\nexport default function AllProducts({ allProducts }) {\n  return (\n    ...\n    &lt;a\n      href={product.foxyBuyLink}\n      className=&quot;ml-1 bg-gray-600 rounded px-4 py-2 text-gray-100 cursor-pointer&quot;\n    &gt;\n      Buy Now\n    &lt;\u002Fa&gt;\n    ...\n  );\n}\n\nexport const getStaticProps = async () =&gt; {\n  const allProducts = await getAllProducts();\n\n  return {\n    props: {\n      allProducts: allProducts.map((product) =&gt; {\n        return {\n          ...product,\n          foxyBuyLink: getFoxyLink(product),\n        };\n      }),\n    },\n  };\n};\n\n\n\u002F\u002F pages\u002Fproducts\u002F[slug].js\n\n...\nimport { getFoxyForm } from &quot;..\u002F..\u002Flib\u002Ffoxy-signer&quot;;\n\nexport default function Product({ product, foxyForm }) {\n  return (\n    ...\n    \u002F\u002F replace the whole &lt;form \u002F&gt; with this &lt;div \u002F&gt;\n    &lt;div dangerouslySetInnerHTML={{ __html: foxyForm }}&gt;&lt;\u002Fdiv&gt;\n    ...\n  );\n}\n\nexport async function getStaticProps({ params }) {\n  const data = await getProductBySlug(params.slug);\n\n  \u002F\u002F Add a prop for the form HTML\n  return {\n    props: {\n      product: data?.product ?? null,\n      foxyForm: getFoxyForm(data?.product),\n    },\n  };\n}\n\n...\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 level=\"2\">We did it! 🎉\u003C\u002Fh2>\u003Cp>Congratulations! You’ve successfully built your own ecommerce website in JAMstack!\u003C\u002Fp>\u003Cp>To bring it further, you can deploy it to your preferred static site hosting platform like \u003Ca href=\"https:\u002F\u002Fvercel.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Vercel\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fwww.netlify.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Netlify\u003C\u002Fa> or \u003Ca href=\"https:\u002F\u002Fpages.cloudflare.com\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Cloudflare Pages\u003C\u002Fa>. Comment the deployed link down below to show what you’ve built (or email us if you’re being shy)!\u003C\u002Fp>",{},1775752610589]