{"id":8611,"date":"2026-01-14T20:43:37","date_gmt":"2026-01-14T19:43:37","guid":{"rendered":"https:\/\/innovacore.group\/?post_type=portfolio&#038;p=8611"},"modified":"2026-03-17T15:35:19","modified_gmt":"2026-03-17T14:35:19","slug":"eventos-descuento","status":"publish","type":"portfolio","link":"https:\/\/innovacore.group\/es\/portfolio\/eventos-descuento\/","title":{"rendered":"discount.events &#8211; Recupera tu poder de compra"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">discount.events es una plataforma h\u00edbrida dedicada a maximizar el valor para el consumidor a trav\u00e9s de tres ejes estrat\u00e9gicos: Venta Social en Vivo, un mercado masivo y eventos f\u00edsicos exclusivos. Ofrece descuentos diarios en m\u00e1s de 200,000 art\u00edculos, desde bienes cotidianos hasta viajes, adem\u00e1s de ventas privadas de liquidaci\u00f3n, combina la conveniencia digital con la participaci\u00f3n de la comunidad. Sirve como un ecosistema integral dise\u00f1ado para proteger los presupuestos de los hogares contra la inflaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Compras sociales en vivo, ofertas diarias y eventos exclusivos para aumentar tu poder de compra.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"discount.events","summary":"Recupera tu <span class=\"ic-nycd\">Poder de compra<\/span","mission":"<p>Restaurar el poder de compra a los consumidores. Creyendo que cada euro cuenta, discount.events aprovecha la escala y la tecnolog\u00eda para negociar tarifas exclusivas en el comercio minorista, viajes y experiencias, asegurando que los usuarios mantengan su estilo de vida sin comprometer la calidad o el presupuesto.<\/p>\n","impact":"<p>discount.events est\u00e1 revolucionando el sector minorista al fusionar el compromiso viral de la Venta Social en Vivo con el volumen de la distribuci\u00f3n masiva. Act\u00faa como una soluci\u00f3n de doble cara: un cruce de inventario cr\u00edtico para grandes marcas y un escudo antiinflacionario esencial para millones de hogares.<\/p>\n","company_logo":"https:\/\/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, EE. UU.","founded_year":"2025","key_numbers":{"item-0":{"metric_label":"Alcance de Audiencia M+ (FR)","metric_value":"20"},"item-1":{"metric_label":"K+ Eventos Organizados","metric_value":"18"},"item-2":{"metric_label":"Canales de Venta","metric_value":"3"}},"hiring_status":"contratando","sector":"mercado","company_type":"empresa","audience":["b2b_a_b2c"],"geo_scope":["mundial"],"business_model":["mercado","servicios","suscripci\u00f3n"],"funding_stage":"pre-semilla","partnership_type":"creaci\u00f3n","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":[],"class_list":["post-8611","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/portfolio\/8611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":2,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/portfolio\/8611\/revisions"}],"predecessor-version":[{"id":8673,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/portfolio\/8611\/revisions\/8673"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/media?parent=8611"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/pt?post=8611"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/pipeline?post=8611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}