{"id":8635,"date":"2026-01-14T20:49:24","date_gmt":"2026-01-14T19:49:24","guid":{"rendered":"https:\/\/innovacore.group\/?post_type=portfolio&p=8635"},"modified":"2026-03-17T15:34:21","modified_gmt":"2026-03-17T13:34:21","slug":"shopisan","status":"publish","type":"portfolio","link":"https:\/\/innovacore.group\/es\/portfolio\/shopisan\/","title":{"rendered":"Shopisan &#8211; Revitalizando el comercio local"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Shopisan is the first private \u00ablocal attention operator\u00bb dedicated to revitalizing city center commerce. By combining physical event management with a digital platform (Live &amp; Replay), they transform passive retail spaces into dynamic, traffic-generating hubs. Their B2B model aligns the interests of merchants, cities, and private partners to create \u00abShopisan Weeks\u00bb\u2014industrialized promotional events that boost footfall and sales while digitizing local inventory.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El est\u00e1ndar europeo para la activaci\u00f3n minorista local, que fusiona eventos f\u00edsicos con compras en vivo.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"Shopisan","summary":"<span class=\"ic-nycd\">Revitalizando<\/span> Comercio minorista local","mission":"<p>Convertir la crisis del comercio local en un activo sostenible. Shopisan busca ser el brazo operativo que les falta a las autoridades p\u00fablicas, proporcionando una soluci\u00f3n llave en mano que devuelva la convivencia, la visibilidad digital y el dinamismo comercial a los centros de las ciudades, beneficiando a los comerciantes independientes y a las comunidades locales por igual.<\/p>\n","impact":"<p>Shopisan aborda la \"crisis silenciosa\" de las vacantes comerciales maximizando los bienes inmuebles comerciales existentes en lugar de construir nuevas estructuras (sobriedad de suelo). Al profesionalizar la promoci\u00f3n del comercio local, relocalizan el consumo, apoyan segmentos sostenibles (segunda mano, artesanos locales) y reconstruyen los lazos sociales en las zonas urbanas.<\/p>\n","company_logo":"https:\/\/innovacore.group\/wp-content\/uploads\/shopisan-logo-innov-innovacore-optimized.jpg","website_url":"","linkedin_url":"","location":"Par\u00eds, Francia","founded_year":"2026","key_numbers":{"item-0":{"metric_label":"Objetivo de puntos de venta K+","metric_value":"270"},"item-1":{"metric_label":"% Modelo B2B y B2C","metric_value":"100"},"item-2":{"metric_label":"% EBITDA objetivo","metric_value":"20"}},"hiring_status":"contratando","sector":"mercado en l\u00ednea","company_type":"startup","audience":["b2b_a_b2c"],"geo_scope":["nacional"],"business_model":["mercado en l\u00ednea","servicios"],"funding_stage":"en progreso","partnership_type":"creaci\u00f3n","logo_animation":"<div id=\"shopisan-particle-root\">rn    <canvas id=\"shopisanCanvas\"><\/canvas>rn<\/div>rnrn<style>rn    #shopisan-particle-root {rn        width: 100%;rn        height: 300px;rn        display: flex;rn        justify-content: center;rn        align-items: center;rn        background: transparent;rn        overflow: hidden;rn        cursor: crosshair;rn    }rn<\/style>rnrn<script>rn(function() {rn    const canvas = document.getElementById('shopisanCanvas');rn    const ctx = canvas.getContext('2d', { willReadFrequently: true });rn    const root = document.getElementById('shopisan-particle-root');rn    rn    let width, height;rn    let particles = [];rn    let mouse = { x: -1000, y: -1000 };rn    const particleColor = '#f5f5f5';rn    let time = 0;rnrn    function init() {rn        width = root.offsetWidth;rn        height = 300;rn        rn        const dpr = window.devicePixelRatio || 1;rn        canvas.width = width * dpr;rn        canvas.height = height * dpr;rn        canvas.style.width = width + 'px';rn        canvas.style.height = height + 'px';rn        ctx.scale(dpr, dpr);rnrn        createLogoParticles();rn    }rnrn    function createLogoParticles() {rn        particles = [];rn        const cx = width \/ 2;rn        const cy = height \/ 2;rn        const isMobile = width < 600;rnrn        \/\/ --- 1. CONFIGURATION ---rn        ctx.fillStyle = 'white';rn        ctx.strokeStyle = 'white';rn        rn        const iconSize = isMobile ? 60 : 90;rn        const fontSize = isMobile ? 35 : 60;rn        const separatorH = isMobile ? 50 : 80;rn        const gap = isMobile ? 20 : 35;rnrn        ctx.font = `bold ${fontSize}px Arial, Helvetica, sans-serif`;rn        const textMetrics = ctx.measureText('SHOPISAN');rn        const textWidth = textMetrics.width;rnrn        const totalWidth = iconSize + gap + 2 + gap + textWidth;rn        const startX = cx - (totalWidth \/ 2);rnrn        \/\/ --- 2. DESSIN DU GABARIT (Invisible) ---rn        const ix = startX + (iconSize \/ 2);rn        const iy = cy - (iconSize * 0.1);rn        const radius = iconSize * 0.35;rn        rn        ctx.lineWidth = iconSize * 0.08;rn        ctx.lineCap = 'round';rn        ctx.lineJoin = 'round';rnrn        \/\/ Srn        ctx.font = `bold ${iconSize * 0.5}px Arial, sans-serif`;rn        ctx.textAlign = 'center';rn        ctx.textBaseline = 'middle';rn        ctx.fillText('S', ix, iy);rnrn        \/\/ Arcsrn        ctx.beginPath();rn        ctx.arc(ix, iy, radius * 0.8, Math.PI, 0); rn        ctx.stroke();rn        ctx.beginPath();rn        ctx.arc(ix, iy, radius * 1.3, Math.PI, 0); rn        ctx.stroke();rnrn        \/\/ Pointern        ctx.beginPath();rn        ctx.moveTo(ix - radius * 0.8, iy + 5);rn        ctx.lineTo(ix, iy + iconSize * 0.5);rn        ctx.lineTo(ix + radius * 0.8, iy + 5);rn        ctx.stroke();rn        ctx.beginPath();rn        ctx.moveTo(ix - radius * 1.3, iy + 5);rn        ctx.lineTo(ix, iy + iconSize * 0.8);rn        ctx.lineTo(ix + radius * 1.3, iy + 5);rn        ctx.stroke();rnrn        \/\/ Barrern        const lineX = startX + iconSize + gap;rn        ctx.lineWidth = 2;rn        ctx.beginPath();rn        ctx.moveTo(lineX, cy - separatorH \/ 2);rn        ctx.lineTo(lineX, cy + separatorH \/ 2);rn        ctx.stroke();rnrn        \/\/ Textern        const textX = lineX + gap;rn        ctx.textAlign = 'left';rn        ctx.fillStyle = 'white';rn        ctx.font = `bold ${fontSize}px Arial, Helvetica, sans-serif`;rn        ctx.fillText('SHOPISAN', textX, cy);rnrn        \/\/ --- 3. SCAN ---rn        const density = 4;rn        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;rn        const dataWidth = canvas.width; rnrn        for (let y = 0; y < canvas.height; y += density) {rn            for (let x = 0; x < canvas.width; x += density) {rn                if (imageData[(y * dataWidth + x) * 4 + 3] > 128) {rn                    const dpr = window.devicePixelRatio || 1;rn                    particles.push({rn                        x: x \/ dpr,rn                        y: y \/ dpr,rn                        originX: x \/ dpr,rn                        originY: y \/ dpr,rn                        vx: 0, rn                        vy: 0,rn                        size: Math.random() * 1.5 + 0.5,rn                        force: Math.random() rn                    });rn                }rn            }rn        }rn        ctx.clearRect(0, 0, width, height);rn    }rnrn    function draw() {rn        ctx.clearRect(0, 0, width, height);rn        rn        \/\/ MODIF 1 : Animation de vague beaucoup plus lentern        time += 0.02; \/\/ Antes c'\u00e9tait 0.05rnrn        ctx.fillStyle = particleColor;rn        rn        particles.forEach(p => {rn            \/\/ Vague doucern            const waveX = Math.sin(time * 0.5 + p.y * 0.05) * 2;rn            const waveY = Math.cos(time * 0.3 + p.x * 0.05) * 2;rnrn            const dx = mouse.x - p.x;rn            const dy = mouse.y - p.y;rn            const dist = Math.sqrt(dx*dx + dy*dy);rn            const radius = 80;rnrn            let repelX = 0;rn            let repelY = 0;rnrn            if (dist < radius) {rn                const force = (radius - dist) \/ radius;rn                const angle = Math.atan2(dy, dx);rn                rn                \/\/ MODIF 2 : R\u00e9pulsion beaucoup plus douce (8 au lieu de 20)rn                repelX = -Math.cos(angle) * force * 8;rn                repelY = -Math.sin(angle) * force * 8;rn            }rnrn            const targetX = p.originX + waveX;rn            const targetY = p.originY + waveY;rnrn            \/\/ MODIF 3 : Retour \u00e0 la position tr\u00e8s souple (0.03 au lieu de 0.08)rn            const ax = (targetX - p.x) * 0.03;rn            const ay = (targetY - p.y) * 0.03;rnrn            p.vx += ax;rn            p.vy += ay;rn            p.vx += repelX * 0.3; \/\/ On applique aussi moins de force sourisrn            p.vy += repelY * 0.3;rn            rn            \/\/ MODIF 4 : Friction plus \u00e9lev\u00e9e pour que \u00e7a \"glisse\" (0.90 au lieu de 0.85)rn            p.vx *= 0.90; rn            p.vy *= 0.90;rnrn            p.x += p.vx;rn            p.y += p.vy;rnrn            ctx.beginPath();rn            ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);rn            ctx.fill();rn        });rnrn        requestAnimationFrame(draw);rn    }rnrn    const updateMouse = (e) => {rn        const r = canvas.getBoundingClientRect();rn        const cx = e.touches ? e.touches[0].clientX : e.clientX;rn        const cy = e.touches ? e.touches[0].clientY : e.clientY;rn        mouse.x = cx - r.left;rn        mouse.y = cy - r.top;rn    };rnrn    window.addEventListener('resize', init);rn    canvas.addEventListener('mousemove', updateMouse);rn    canvas.addEventListener('touchmove', updateMouse, {passive: true});rn    canvas.addEventListener('mouseleave', () => { mouse.x = -1000; mouse.y = -1000; });rn    canvas.addEventListener('touchend', () => { mouse.x = -1000; mouse.y = -1000; });rnrn    setTimeout(init, 50);rn    draw();rn})();rn<\/script>"},"pt":[],"pipeline":[],"class_list":["post-8635","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/portfolio\/8635","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":1,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/portfolio\/8635\/revisions"}],"predecessor-version":[{"id":8636,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/portfolio\/8635\/revisions\/8636"}],"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=8635"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/pt?post=8635"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/innovacore.group\/es\/wp-json\/wp\/v2\/pipeline?post=8635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}