{"id":3306,"date":"2026-01-14T20:43:37","date_gmt":"2026-01-14T20:43:37","guid":{"rendered":"https:\/\/test.innovacore.group\/?post_type=portfolio&#038;p=3306"},"modified":"2026-01-15T11:48:56","modified_gmt":"2026-01-15T11:48:56","slug":"discount-events","status":"publish","type":"portfolio","link":"https:\/\/test.innovacore.group\/pl\/portfolio\/discount-events\/","title":{"rendered":"discount.events &#8211; Reclaim Your Purchasing Power"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">discount.events is a hybrid platform dedicated to maximizing consumer value through three strategic axes: Social Live Selling, a massive marketplace, and exclusive physical events. Offering daily discounts on over 200,000 items, from everyday goods to travel\u2014plus private clearance sales, it blends digital convenience with community engagement. It serves as a comprehensive ecosystem designed to protect household budgets against inflation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Social live shopping, daily deals, and exclusive events to boost buying power.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"discount.events","summary":"Reclaim Your <span class=\"ic-nycd\">Purchasing Power<\/span","mission":"<p>To restore purchasing power to consumers. Believing that every euro counts, discount.events leverages scale and technology to negotiate exclusive rates across retail, travel, and experiences, ensuring users maintain their lifestyle without compromising on quality or budget.<\/p>\n","impact":"<p>discount.events is disrupting the retail sector by fusing the viral engagement of Social Live Selling with the volume of mass distribution. It acts as a dual-sided solution: a critical inventory clearinghouse for major brands and an essential anti-inflation shield for millions of households.<\/p>\n","company_logo":"https:\/\/test.innovacore.group\/wp-content\/uploads\/d-events-logo-innov-innovacore-optimized.jpg","website_url":"https:\/\/discount.events\/","linkedin_url":"https:\/\/www.linkedin.com\/company\/104703917\/","location":"Miami, FL, USA","founded_year":"2025","key_numbers":{"item-0":{"metric_label":"M+ Audience Reach (FR)","metric_value":"20"},"item-1":{"metric_label":"K+ Events Organized","metric_value":"18"},"item-2":{"metric_label":"Sales Channels","metric_value":"3"}},"hiring_status":"hiring","sector":"marketplace","company_type":"enterprise","audience":["b2b_a_b2c"],"geo_scope":["global"],"business_model":["marketplace","services","subscription"],"funding_stage":"pre_seed","partnership_type":"creation","logo_animation":"<div id=\"discount-particle-root\">\r\n    <canvas id=\"discountCanvas\"><\/canvas>\r\n<\/div>\r\n\r\n<style>\r\n    #discount-particle-root {\r\n        width: 100%;\r\n        height: 300px; \/* Hauteur fixe respect\u00e9e *\/\r\n        display: flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n        background: transparent;\r\n        overflow: hidden;\r\n        cursor: crosshair;\r\n    }\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n    const canvas = document.getElementById('discountCanvas');\r\n    const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n    const root = document.getElementById('discount-particle-root');\r\n    \r\n    let width, height;\r\n    let particles = [];\r\n    let mouse = { x: -1000, y: -1000 };\r\n    const particleColor = '#f5f5f5'; \/\/ Gris clair Innovacore\r\n    let time = 0;\r\n\r\n    function init() {\r\n        width = root.offsetWidth;\r\n        height = 300;\r\n        \r\n        const dpr = window.devicePixelRatio || 1;\r\n        canvas.width = width * dpr;\r\n        canvas.height = height * dpr;\r\n        canvas.style.width = width + 'px';\r\n        canvas.style.height = height + 'px';\r\n        ctx.scale(dpr, dpr);\r\n\r\n        createLogoParticles();\r\n    }\r\n\r\n    function createLogoParticles() {\r\n        particles = [];\r\n        const cx = width \/ 2;\r\n        const cy = height \/ 2;\r\n        const isMobile = width < 600;\r\n\r\n        \/\/ --- 1. CONFIGURATION ---\r\n        \/\/ On dessine en blanc pour le scan\r\n        ctx.fillStyle = 'white';\r\n        ctx.strokeStyle = 'white';\r\n\r\n        \/\/ Dimensions relatives\r\n        const fontSizeMain = isMobile ? 40 : 70;\r\n        const fontSizeSub = isMobile ? 20 : 35; \/\/ Pour \"events\"\r\n        \r\n        \/\/ Polices\r\n        const fontMain = `bold ${fontSizeMain}px \"Poppins\", Arial, sans-serif`;\r\n        const fontSub = `normal ${fontSizeSub}px \"Poppins\", Arial, sans-serif`;\r\n\r\n        \/\/ Calcul des largeurs pour le centrage\r\n        ctx.font = fontMain;\r\n        const wDiscount = ctx.measureText('discount').width;\r\n        \r\n        ctx.font = fontSub;\r\n        const wEvents = ctx.measureText('events').width;\r\n        \r\n        \/\/ Ticket dimensions\r\n        const ticketPaddingX = fontSizeSub * 1.5;\r\n        const ticketHeight = fontSizeSub * 1.8;\r\n        const ticketWidth = wEvents + ticketPaddingX; \r\n        \r\n        \/\/ Largeur totale approximative (discount + d\u00e9calage visuel)\r\n        \/\/ Le ticket est align\u00e9 \u00e0 droite du mot discount g\u00e9n\u00e9ralement, ou centr\u00e9 sous la fin\r\n        \/\/ On va faire une compo \u00e9quilibr\u00e9e : discount centr\u00e9, ticket d\u00e9cal\u00e9 droite\r\n        const totalWidth = Math.max(wDiscount, ticketWidth + (wDiscount * 0.3));\r\n        \r\n        const startX = cx - (totalWidth \/ 2);\r\n        const startY = cy - (fontSizeMain * 0.2); \/\/ Remonter un peu\r\n\r\n        \/\/ --- 2. DESSIN DE \"discount\" ---\r\n        ctx.textAlign = 'left';\r\n        ctx.textBaseline = 'alphabetic';\r\n        ctx.font = fontMain;\r\n        ctx.fillText('discount', startX, startY);\r\n\r\n        \/\/ --- 3. DESSIN DU TICKET ---\r\n        const ticketX = startX + (wDiscount - ticketWidth * 0.8); \/\/ D\u00e9cal\u00e9 vers la droite\r\n        const ticketY = startY + (fontSizeMain * 0.2); \/\/ Un peu en dessous\r\n        \r\n        \/\/ A. Le Rectangle plein\r\n        ctx.fillRect(ticketX, ticketY, ticketWidth, ticketHeight);\r\n\r\n        \/\/ B. Les d\u00e9coupes (Espace n\u00e9gatif)\r\n        ctx.globalCompositeOperation = 'destination-out'; \/\/ Mode Gomme\r\n\r\n        \/\/ 1. Les trous du ticket (encoches sur les c\u00f4t\u00e9s)\r\n        const punchRadius = ticketHeight * 0.15;\r\n        const punchY = ticketY + (ticketHeight \/ 2);\r\n        \r\n        ctx.beginPath();\r\n        ctx.arc(ticketX, punchY, punchRadius, 0, Math.PI * 2); \/\/ Gauche\r\n        ctx.fill();\r\n        \r\n        ctx.beginPath();\r\n        ctx.arc(ticketX + ticketWidth, punchY, punchRadius, 0, Math.PI * 2); \/\/ Droite\r\n        ctx.fill();\r\n\r\n        \/\/ 2. Le texte \"events\" en d\u00e9fonce (vide) \u00e0 l'int\u00e9rieur\r\n        ctx.font = fontSub;\r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n        ctx.fillText('events', ticketX + (ticketWidth \/ 2), ticketY + (ticketHeight \/ 2));\r\n\r\n        \/\/ Retour normal\r\n        ctx.globalCompositeOperation = 'source-over';\r\n\r\n        \/\/ --- 4. SCAN DES PIXELS ---\r\n        const density = 4;\r\n        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\r\n        const dataWidth = canvas.width; \r\n\r\n        for (let y = 0; y < canvas.height; y += density) {\r\n            for (let x = 0; x < canvas.width; x += density) {\r\n                if (imageData[(y * dataWidth + x) * 4 + 3] > 128) {\r\n                    const dpr = window.devicePixelRatio || 1;\r\n                    particles.push({\r\n                        x: x \/ dpr,\r\n                        y: y \/ dpr,\r\n                        originX: x \/ dpr,\r\n                        originY: y \/ dpr,\r\n                        vx: 0, \r\n                        vy: 0,\r\n                        size: Math.random() * 1.5 + 0.5,\r\n                        force: Math.random() \r\n                    });\r\n                }\r\n            }\r\n        }\r\n        \r\n        \/\/ Nettoyage\r\n        ctx.clearRect(0, 0, width, height);\r\n    }\r\n\r\n    function draw() {\r\n        ctx.clearRect(0, 0, width, height);\r\n        time += 0.05;\r\n\r\n        ctx.fillStyle = particleColor;\r\n        \r\n        particles.forEach(p => {\r\n            \/\/ 1. Respiration\r\n            const waveX = Math.sin(time * 0.5 + p.y * 0.05) * 2;\r\n            const waveY = Math.cos(time * 0.3 + p.x * 0.05) * 2;\r\n            \r\n            \/\/ 2. Interaction\r\n            const dx = mouse.x - p.x;\r\n            const dy = mouse.y - p.y;\r\n            const dist = Math.sqrt(dx*dx + dy*dy);\r\n            const radius = 80;\r\n            \r\n            let repelX = 0;\r\n            let repelY = 0;\r\n\r\n            if (dist < radius) {\r\n                const force = (radius - dist) \/ radius;\r\n                const angle = Math.atan2(dy, dx);\r\n                repelX = -Math.cos(angle) * force * 20;\r\n                repelY = -Math.sin(angle) * force * 20;\r\n            }\r\n\r\n            \/\/ 3. Physique\r\n            const targetX = p.originX + waveX;\r\n            const targetY = p.originY + waveY;\r\n\r\n            const ax = (targetX - p.x) * 0.08;\r\n            const ay = (targetY - p.y) * 0.08;\r\n\r\n            p.vx += ax;\r\n            p.vy += ay;\r\n            p.vx += repelX * 0.5;\r\n            p.vy += repelY * 0.5;\r\n            p.vx *= 0.85; \r\n\r\n            p.x += p.vx;\r\n            p.y += p.vy;\r\n\r\n            ctx.beginPath();\r\n            ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\r\n            ctx.fill();\r\n        });\r\n\r\n        requestAnimationFrame(draw);\r\n    }\r\n\r\n    const updateMouse = (e) => {\r\n        const r = canvas.getBoundingClientRect();\r\n        const cx = e.touches ? e.touches[0].clientX : e.clientX;\r\n        const cy = e.touches ? e.touches[0].clientY : e.clientY;\r\n        mouse.x = cx - r.left;\r\n        mouse.y = cy - r.top;\r\n    };\r\n\r\n    window.addEventListener('resize', init);\r\n    canvas.addEventListener('mousemove', updateMouse);\r\n    canvas.addEventListener('touchmove', updateMouse, {passive: true});\r\n    canvas.addEventListener('mouseleave', () => { mouse.x = -1000; mouse.y = -1000; });\r\n    canvas.addEventListener('touchend', () => { mouse.x = -1000; mouse.y = -1000; });\r\n\r\n    setTimeout(init, 50);\r\n    draw();\r\n})();\r\n<\/script>"},"pt":[],"pipeline":[34],"class_list":["post-3306","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry","pipeline-innov"],"_links":{"self":[{"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/portfolio\/3306","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":1,"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/portfolio\/3306\/revisions"}],"predecessor-version":[{"id":3307,"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/portfolio\/3306\/revisions\/3307"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/media?parent=3306"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/pt?post=3306"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/test.innovacore.group\/pl\/wp-json\/wp\/v2\/pipeline?post=3306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}