{"id":3291,"date":"2026-01-14T19:06:28","date_gmt":"2026-01-14T19:06:28","guid":{"rendered":"https:\/\/test.innovacore.group\/?post_type=portfolio&#038;p=3291"},"modified":"2026-01-15T12:08:58","modified_gmt":"2026-01-15T12:08:58","slug":"wallpost","status":"publish","type":"portfolio","link":"https:\/\/test.innovacore.group\/de\/portfolio\/wallpost\/","title":{"rendered":"Wallpost CRM &#8211; Streamline Ops &amp; Boost Sales"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Wallpost CRM is a comprehensive business management solution designed to bridge the gap between complex operations and customer engagement. Going beyond standard CRM features, it integrates sales automation, detailed analytics, and customer support into a single, intuitive interface. Wallpost empowers businesses to efficiently manage the entire customer lifecycle\u2014from lead to service delivery\u2014while providing a seamless user experience that eliminates data silos and operational inefficiencies.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>All-in-one CRM and ERP platform to automate sales and streamline operations.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"Wallpost CRM","summary":"Streamline Ops & <span class=\"ic-nycd\">Boost Sales<\/span>","mission":"<p>To provide \"one version of the truth\" for every business. Wallpost\u2019s mission is to empower decision-makers with real-time data and automated tools, enabling them to build lasting customer relationships and manage their workforce and finances from a single, centralized dashboard.<\/p>\n","impact":"<p>Wallpost is democratizing enterprise-grade efficiency for growing businesses. By combining CRM with broader operational tools (like HR and Finance), it transforms scattered data into actionable insights, significantly reducing administrative overhead and allowing teams to focus entirely on growth and customer satisfaction.<\/p>\n","company_logo":"https:\/\/test.innovacore.group\/wp-content\/uploads\/wallpost-logo-innov-innovacore-optimized.jpg","website_url":"https:\/\/wallpostsoftware.com\/","linkedin_url":"https:\/\/www.linkedin.com\/company\/wallpost-software\/https:\/\/www.linkedin.com\/company\/wallpost-software\/","location":"Irvine, California, USA","founded_year":"2021","key_numbers":{"item-0":{"metric_label":"K+ Active Users","metric_value":"10"},"item-1":{"metric_label":"+ Global Markets","metric_value":"30"},"item-2":{"metric_label":"+ Strategic Partners","metric_value":"70"}},"hiring_status":"stealth","sector":"ecommerce","company_type":"sme","audience":["b2b"],"geo_scope":["global"],"business_model":["saas"],"funding_stage":"undisclosed","partnership_type":"creation","logo_animation":"<div id=\"wallpost-particle-root\">\r\n    <canvas id=\"wallpostCanvas\"><\/canvas>\r\n<\/div>\r\n\r\n<style>\r\n    #wallpost-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('wallpostCanvas');\r\n    const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n    const root = document.getElementById('wallpost-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        \/\/ Dimensions\r\n        const iconRadius = isMobile ? 35 : 50; \r\n        const fontSizeMain = isMobile ? 35 : 50;\r\n        const fontSizeSub = isMobile ? 12 : 16;\r\n        const gap = 25; \/\/ Espace entre ic\u00f4ne et texte\r\n\r\n        \/\/ On dessine en blanc pour le scan\r\n        ctx.fillStyle = 'white';\r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n\r\n        \/\/ Position verticale globale pour centrer le bloc (Icone + Texte + Baseline)\r\n        \/\/ Hauteur approx: (IconRadius*2) + gap + fontSizeMain + fontSizeSub\r\n        const totalHeight = (iconRadius * 2) + gap + fontSizeMain + fontSizeSub;\r\n        const startY = cy - (totalHeight \/ 2) + iconRadius; \/\/ Centre de l'ic\u00f4ne\r\n\r\n        \/\/ --- 2. DESSIN DE L'IC\u00d4NE (Cercle avec W n\u00e9gatif) ---\r\n        const iconY = startY;\r\n        \r\n        \/\/ A. Le Cercle plein\r\n        ctx.beginPath();\r\n        ctx.arc(cx, iconY, iconRadius, 0, Math.PI * 2);\r\n        ctx.fill();\r\n\r\n        \/\/ B. Le \"W\" (Espace n\u00e9gatif)\r\n        ctx.globalCompositeOperation = 'destination-out'; \/\/ Mode \"Gomme\"\r\n        ctx.lineWidth = iconRadius * 0.25; \/\/ \u00c9paisseur des traits du W\r\n        ctx.lineCap = 'round';\r\n\r\n        \/\/ On dessine 3 lignes pour faire le W stylis\u00e9\r\n        \/\/ Ligne 1 (gauche)\r\n        ctx.beginPath();\r\n        ctx.moveTo(cx - iconRadius * 0.4, iconY - iconRadius * 0.3);\r\n        ctx.lineTo(cx - iconRadius * 0.2, iconY + iconRadius * 0.4);\r\n        ctx.stroke();\r\n\r\n        \/\/ Ligne 2 (milieu)\r\n        ctx.beginPath();\r\n        ctx.moveTo(cx, iconY - iconRadius * 0.3);\r\n        ctx.lineTo(cx + iconRadius * 0.2, iconY + iconRadius * 0.4);\r\n        ctx.stroke();\r\n\r\n        \/\/ Ligne 3 (droite - plus courte pour le point ?)\r\n        ctx.beginPath();\r\n        ctx.moveTo(cx + iconRadius * 0.4, iconY - iconRadius * 0.3);\r\n        ctx.lineTo(cx + iconRadius * 0.6, iconY + iconRadius * 0.1); \/\/ Plus court\r\n        ctx.stroke();\r\n\r\n        \/\/ Le petit point de notif\/pin (si pr\u00e9sent dans le W)\r\n        \/\/ On gomme un petit rond\r\n        \/\/ ctx.beginPath();\r\n        \/\/ ctx.arc(cx + iconRadius * 0.5, iconY - iconRadius * 0.4, iconRadius * 0.1, 0, Math.PI*2);\r\n        \/\/ ctx.fill();\r\n\r\n        \/\/ Retour au mode normal\r\n        ctx.globalCompositeOperation = 'source-over';\r\n\r\n\r\n        \/\/ --- 3. DESSIN DU TEXTE ---\r\n        const textY = iconY + iconRadius + gap;\r\n\r\n        \/\/ \"WallPost\"\r\n        ctx.font = `bold ${fontSizeMain}px Arial, Helvetica, sans-serif`;\r\n        ctx.fillText('WallPost', cx, textY);\r\n\r\n        \/\/ Baseline \"Work Smart, Work Fast\"\r\n        const subY = textY + fontSizeMain * 0.8;\r\n        ctx.font = `normal ${fontSizeSub}px Arial, Helvetica, sans-serif`;\r\n        \/\/ On espace un peu les lettres pour la lisibilit\u00e9 de la baseline\r\n        \/\/ Note: letter-spacing ne marche pas bien en canvas standard, on fait simple\r\n        ctx.fillText('Work Smart, Work Fast', cx, subY);\r\n\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-3291","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry","pipeline-innov"],"_links":{"self":[{"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/portfolio\/3291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":1,"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/portfolio\/3291\/revisions"}],"predecessor-version":[{"id":3292,"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/portfolio\/3291\/revisions\/3292"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/media?parent=3291"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/pt?post=3291"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/test.innovacore.group\/de\/wp-json\/wp\/v2\/pipeline?post=3291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}