[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"globalSettings":3,"blog-application-scanner-retail-en":142},{"data":4,"meta":141},{"id":5,"documentId":6,"siteName":7,"siteDescription":8,"footerText":9,"contactEmail":10,"contactPhone":11,"address":12,"createdAt":13,"updatedAt":14,"publishedAt":15,"locale":16,"titleSuffix":17,"schemaType":17,"serviceTypes":17,"areaServed":17,"addressLocality":17,"addressRegion":17,"addressCountry":17,"logo":17,"favicon":18,"themeColors":60,"defaultSEO":69,"navigation":74,"footerLinks":105,"socialLinks":115,"navbarLogo":116,"footerLogo":130},2,"vyprwwsdp7fncupq3rn8eolg","NeoTide","NeoTide - Software development studio\nBuild, launch and scale your applications","Neotide - A software development studio based in Reunion Island.\nWe design, launch and grow web and mobile applications built to scale.","contact@neotide.fr","+262 (0)6 93 40 30 74","Saint-Denis, Reunion Island","2026-07-25T12:04:30.579Z","2026-07-25T12:13:14.036Z","2026-07-25T12:13:13.640Z","en",null,{"id":19,"documentId":20,"name":21,"alternativeText":17,"caption":17,"width":22,"height":22,"formats":17,"hash":23,"ext":24,"mime":25,"size":26,"url":27,"previewUrl":17,"provider":28,"provider_metadata":17,"createdAt":29,"updatedAt":30,"publishedAt":29,"related":31},11,"xgzsed4ioj7lx1mq1j7j3ck1","favicon.svg",16,"favicon_7033e351a7",".svg","image\u002Fsvg+xml",0.51,"\u002Fuploads\u002Ffavicon_7033e351a7.svg","local","2026-04-09T16:19:17.495Z","2026-04-09T16:19:27.298Z",[32,40,42,47,49,59],{"__type":33,"id":34,"metaTitle":35,"metaDescription":36,"keywords":37,"canonicalURL":38,"metaRobots":39,"structuredData":17},"shared.seo",664,"Développement Web à La Réunion | Neotide","Studio de développement web basé à Saint-Denis, La Réunion (974) - Applications sur mesure pour startups et PME.","Studio web réunion","https:\u002F\u002Fneotide.fr\u002Fdeveloppement-web-reunion","index, follow",{"__type":33,"id":41,"metaTitle":35,"metaDescription":36,"keywords":37,"canonicalURL":38,"metaRobots":39,"structuredData":17},716,{"__type":33,"id":43,"metaTitle":44,"metaDescription":45,"keywords":46,"canonicalURL":17,"metaRobots":39,"structuredData":17},733,"Web Development in Reunion Island | Neotide","Web development studio based in Saint-Denis, Reunion Island (974) - Custom applications for startups and SMEs.","web studio reunion island",{"__type":33,"id":48,"metaTitle":44,"metaDescription":45,"keywords":46,"canonicalURL":17,"metaRobots":39,"structuredData":17},734,{"__type":50,"id":51,"documentId":6,"siteName":7,"siteDescription":52,"footerText":53,"contactEmail":10,"contactPhone":11,"address":54,"createdAt":55,"updatedAt":56,"publishedAt":57,"locale":58,"titleSuffix":17,"schemaType":17,"serviceTypes":17,"areaServed":17,"addressLocality":17,"addressRegion":17,"addressCountry":17},"api::global-setting.global-setting",1,"NeoTide - Studio de développement informatique\nCréer, lancer et faire évoluer vos applications","Neotide - Studio de développement informatique basé à La Réunion.\nNous concevons, lançons et faisons évoluer des applications web et mobiles prêtes à grandir.","Saint-Denis, La Réunion","2026-03-08T15:18:14.915Z","2026-07-25T12:10:29.658Z","2026-07-25T12:10:29.262Z","fr",{"__type":50,"id":5,"documentId":6,"siteName":7,"siteDescription":8,"footerText":9,"contactEmail":10,"contactPhone":11,"address":12,"createdAt":13,"updatedAt":14,"publishedAt":15,"locale":16,"titleSuffix":17,"schemaType":17,"serviceTypes":17,"areaServed":17,"addressLocality":17,"addressRegion":17,"addressCountry":17},{"id":5,"primary":61,"primaryLight":62,"primaryDark":63,"secondary":64,"secondaryLight":65,"secondaryDark":66,"accent":17,"background":67,"surface":68},"#0284c7","#38bdf8","#0369a1","#57534e","#a8a29e","#292524","#ffffff","#fafaf9",{"id":70,"metaTitle":71,"metaDescription":72,"keywords":73,"canonicalURL":17,"metaRobots":17,"structuredData":17,"metaImage":17},749,"Neotide - Software development studio | Reunion Island","NeoTide - A software development studio based in Reunion Island\nBuild, launch and scale your applications","software development reunion island",[75,93,97,101],{"id":76,"label":77,"url":78,"openInNewTab":79,"description":17,"icon":17,"featured":79,"flyoutColumns":51,"children":80},6,"Services","services",false,[81,85,89],{"id":82,"label":83,"url":84,"openInNewTab":79,"description":17,"icon":17},7,"MVP","\u002Fen\u002Fmvp-startup",{"id":86,"label":87,"url":88,"openInNewTab":79,"description":17,"icon":17},8,"Web development","\u002Fen\u002Fdeveloppement-web-reunion",{"id":90,"label":91,"url":92,"openInNewTab":79,"description":17,"icon":17},9,"Mobile application","\u002Fen\u002Fdeveloppement-application-mobile",{"id":82,"label":94,"url":95,"openInNewTab":79,"description":17,"icon":17,"featured":79,"flyoutColumns":51,"children":96},"Our work","projects",[],{"id":86,"label":98,"url":99,"openInNewTab":79,"description":17,"icon":17,"featured":79,"flyoutColumns":51,"children":100},"About","about",[],{"id":90,"label":102,"url":103,"openInNewTab":79,"description":17,"icon":17,"featured":79,"flyoutColumns":51,"children":104},"Blog","blog",[],[106,110,112],{"id":107,"label":108,"url":109,"openInNewTab":79},5,"Studio","\u002Fstudio\u002F",{"id":76,"label":77,"url":111,"openInNewTab":79},"\u002Fservices\u002F",{"id":82,"label":113,"url":114,"openInNewTab":79},"Legal","\u002Flegal\u002F",[],{"id":117,"documentId":118,"name":119,"alternativeText":17,"caption":17,"width":120,"height":121,"formats":17,"hash":122,"ext":24,"mime":25,"size":123,"url":124,"previewUrl":17,"provider":28,"provider_metadata":17,"createdAt":125,"updatedAt":125,"publishedAt":126,"related":127},13,"mm27ffe4cc0ozw2y3liow9gb","logo-tagline-light.svg",290,82,"logo_tagline_light_9557a89dab",1.45,"\u002Fuploads\u002Flogo_tagline_light_9557a89dab.svg","2026-04-13T19:42:16.450Z","2026-04-13T19:42:16.451Z",[128,129],{"__type":50,"id":51,"documentId":6,"siteName":7,"siteDescription":52,"footerText":53,"contactEmail":10,"contactPhone":11,"address":54,"createdAt":55,"updatedAt":56,"publishedAt":57,"locale":58,"titleSuffix":17,"schemaType":17,"serviceTypes":17,"areaServed":17,"addressLocality":17,"addressRegion":17,"addressCountry":17},{"__type":50,"id":5,"documentId":6,"siteName":7,"siteDescription":8,"footerText":9,"contactEmail":10,"contactPhone":11,"address":12,"createdAt":13,"updatedAt":14,"publishedAt":15,"locale":16,"titleSuffix":17,"schemaType":17,"serviceTypes":17,"areaServed":17,"addressLocality":17,"addressRegion":17,"addressCountry":17},{"id":82,"documentId":131,"name":132,"alternativeText":17,"caption":17,"width":120,"height":121,"formats":17,"hash":133,"ext":24,"mime":25,"size":134,"url":135,"previewUrl":17,"provider":28,"provider_metadata":17,"createdAt":136,"updatedAt":137,"publishedAt":136,"related":138},"bcoat5gkgnnov38maedkmz9s","logo-tagline-dark.svg","logo_tagline_dark_2a08b4a7a6",2.31,"\u002Fuploads\u002Flogo_tagline_dark_2a08b4a7a6.svg","2026-04-09T16:17:55.290Z","2026-04-28T06:36:59.328Z",[139,140],{"__type":50,"id":51,"documentId":6,"siteName":7,"siteDescription":52,"footerText":53,"contactEmail":10,"contactPhone":11,"address":54,"createdAt":55,"updatedAt":56,"publishedAt":57,"locale":58,"titleSuffix":17,"schemaType":17,"serviceTypes":17,"areaServed":17,"addressLocality":17,"addressRegion":17,"addressCountry":17},{"__type":50,"id":5,"documentId":6,"siteName":7,"siteDescription":8,"footerText":9,"contactEmail":10,"contactPhone":11,"address":12,"createdAt":13,"updatedAt":14,"publishedAt":15,"locale":16,"titleSuffix":17,"schemaType":17,"serviceTypes":17,"areaServed":17,"addressLocality":17,"addressRegion":17,"addressCountry":17},{},{"id":143,"documentId":144,"title":145,"slug":146,"excerpt":147,"content":148,"publishDate":149,"createdAt":150,"updatedAt":151,"publishedAt":152,"locale":16,"featuredImage":17,"author":17,"categories":153,"seo":154},30,"bj92tctvv35rgorvmv95fn94","Scanner app: one product, N configurations","application-scanner-retail","How we built a mobile scanning application for Inopos whose behaviour is set without redeploying, scan types, validation rules, prefix handling.","## The trap of the \"simple\" scanner\n\nA scanning application looks trivial: read a barcode, show a product. Then the real cases arrive.\n\nOne store scans standard EAN-13 codes. Another uses prefixed internal codes. A third weighs its items and works with barcodes carrying a variable weight. A fourth wants to reject any code missing from its catalogue; a fifth wants the record created on the fly instead.\n\nThe usual answer is to duplicate the application per client. By the third version, every fix has to be applied three times, and one of the three will be forgotten.\n\n---\n\n## The choice: configure, don't fork\n\nFor **Inopos** we took the problem the other way round: a single application, whose behaviour is described by a configuration.\n\nWhat can be set without touching the code:\n\n- **Accepted scan types**: EAN-13, EAN-8, Code 128, QR, or a subset per outlet.\n- **Validation rules**: unknown code accepted, rejected, or held for review.\n- **Prefix handling**: recognise an internal code, extract the useful part, ignore the rest.\n- **The post-scan flow**: quantity, price, visual check, or immediate confirmation.\n\nThe result: deploying to a new client means writing a configuration, not opening a branch.\n\n---\n\n## What that changes in production\n\n**One binary to maintain.** A bug fix immediately benefits every outlet. No version matrix to track.\n\n**Tests become useful.** Because variants are data rather than code, you can test rule combinations without multiplying integration scenarios.\n\n**Client rollout takes minutes.** Installation no longer needs a developer: the settings are editable by the team that knows the store.\n\n---\n\n## The technical decisions that matter\n\n**Treat the configuration as a contract.** It's validated on load against an explicit schema. An incorrect configuration fails immediately with a clear message, not three screens later, in the middle of a stock count.\n\n**Plan for offline from the start.** A store has dead zones. Scans are stored locally then synced; the user shouldn't have to understand any of that.\n\n**Don't make configurable what doesn't vary.** Every option added is one more combination to test. We only open a setting once a second client genuinely needs it.\n\n**Optimise the gesture, not the screen.** On the shop floor the user scans one-handed. The number of taps after a scan matters more than the look of the interface.\n\n---\n\n## Is it worth it for you?\n\nThis model makes sense if you expect to deploy the same application across several slightly different contexts: several brands, several sites, several trades.\n\nConversely, for a single stable use case, configuration adds complexity with no payoff. A fixed application is then simpler to write and maintain.\n\nYou can see the result on the [scanner app](\u002Fen\u002Fscanner) page. Have a similar project? [Write to us](\u002Fen\u002Fcontact).\n","2026-07-25T08:30:00.000Z","2026-07-25T11:55:26.807Z","2026-07-26T08:45:41.410Z","2026-07-26T08:45:41.491Z",[],{"id":155,"metaTitle":156,"metaDescription":157,"keywords":158,"canonicalURL":17,"metaRobots":39,"structuredData":17,"metaImage":17},780,"Configurable scanner app: one product, N clients","How we designed a configurable mobile scanning application: scan types, validation rules, prefixes, offline mode.","scanner app, barcode, retail, configurable mobile application"]