Veeti Pentikäinen - AI Engineering Portfolio

Veeti Pentikäinen

AI Developer & Technical Founder

Self-taught AI developer with 3+ years building production applications that generate real revenue. I specialize in taking AI solutions from concept to deployment—integrating APIs, building automation systems, and making AI actually work in real business contexts. Currently based in Kuopio, Finland.

Technical Skills

AI & Machine Learning

  • OpenAI API (GPT-4, GPT-3.5)
  • Claude API (Sonnet, Opus)
  • Prompt Engineering & RAG
  • VAPI (Voice AI)
  • LangChain basics

Programming

  • Python (API integration, data)
  • JavaScript/TypeScript
  • SQL (data queries)
  • Git version control
  • REST API development

Cloud & Infrastructure

  • AWS (EC2, S3, Lambda basics)
  • Webhook systems
  • API orchestration
  • n8n automation platform
  • Docker (basic)

Integrations

  • Twilio (SMS, Voice)
  • Shopify API
  • WooCommerce API
  • Meta/Google APIs
  • Payment processors

Production AI Projects

ProfitSprint AI

Source-Based Profit Tracking System (Built for DriveTron client, evolved into commercial product)

The Problem: While managing marketing for DriveTron (e-scooter company), we couldn't track real profitability. Meta Ads showed one number, Google Analytics another, WooCommerce a third. ROAS looked good, but actual profit was unknown because cookie tracking is broken (iOS ATT, consent banners).

The Solution: Built a source-based profit tracking system that bypasses cookie problems entirely. Instead of trying to attribute individual conversions (impossible with broken tracking), it aggregates daily data from all sources and calculates true profit: Revenue - Ad Spend - COGS - Fees.

My Role: Solo developer - designed the architecture, built n8n automation workflows (100+ nodes), integrated APIs (WooCommerce, Shopify, Meta Ads), implemented real-time data sync, and deployed to production. The system improved DriveTron's POAS from 1.2x to 1.8x (+50%), generating €72k additional annual profit.

Technical Stack

  • n8n automation (100+ node workflows)
  • Shopify & WooCommerce APIs
  • Meta Ads API (source data)
  • PostgreSQL (Supabase)
  • Node.js + Express (REST API)
  • React + TailwindCSS frontend
  • Recharts (data visualization)
  • Edge Functions (secure credentials)
+50%
POAS Improvement
€72k
Annual Profit Added
100%
Source Data Accuracy

Technical Deep Dive: Source-Based Profit Architecture

The core challenge was bypassing broken cookie tracking entirely. Instead of trying to attribute individual conversions (impossible with iOS ATT and consent banners), I built an aggregated source-based system:

// n8n Workflow Structure (100+ nodes, 3 main paths)

PATH 1: Daily Data Collection
├── Trigger: Daily at 3:00 AM
├── Fetch WooCommerce Orders (last 30 days)
│   └── API: /wp-json/wc/v3/orders
│   └── Filter: created_at >= today - 30 days
├── Fetch Meta Ads Spend (last 30 days)  
│   └── API: /insights?fields=spend,impressions,clicks
│   └── Group by date_start
├── Currency Conversion
│   └── Convert all to user's preferred_currency
└── Aggregate by Day
    └── For each day:
        Revenue = sum(order.total)
        Ad_Spend = sum(meta.spend)

PATH 2: Profit Calculation
├── Get User Settings (COGS%, fees, shipping)
├── Calculate Daily Profit:
│   Gross_Revenue = daily_revenue
│   COGS = daily_revenue * user.cogs_percentage
│   Payment_Fees = daily_revenue * 0.02
│   Shipping = count(orders) * user.avg_shipping
│   Ad_Spend = daily_ad_spend
│   
│   Net_Profit = Gross_Revenue - COGS - Payment_Fees - Shipping - Ad_Spend
│   POAS = Net_Profit / Ad_Spend
└── Store in PostgreSQL

PATH 3: 7-Day Rolling Average
├── Query last 7 days from database
├── Calculate rolling average:
│   rolling_profit = sum(last_7_days.profit) / 7
│   rolling_poas = sum(last_7_days.profit) / sum(last_7_days.ad_spend)
└── Update dashboard display

// Example: Real DriveTron day
Date: 2025-11-01
WooCommerce Revenue: €3,200
Meta Ad Spend: €500
COGS (50%): €1,600
Payment Fees (2%): €64
Shipping: €120
------------------------
Net Profit: €916
POAS: 1.83x (€916 / €500)
Why This Works: Cookie tracking tries to say "this sale came from this ad" - impossible with 96% iOS opt-out. Source-based tracking says "today we made €3,200 in sales and spent €500 on ads" - this data is 100% accurate because it comes directly from WooCommerce and Meta APIs, not cookies. The 7-day rolling average smooths daily variance to show real trends.
n8n vs Custom Code: I could have written 500+ lines of Node.js to handle all the API calls, retries, error handling, and scheduling. Instead, n8n provides visual workflows with built-in credential management, retry logic, and error handling. The entire profit sync runs on a $5/month DigitalOcean droplet.
Sprint Testing Feature: Added a testing framework where merchants can run controlled experiments (price changes, budget shifts, new audiences). The system tracks profit during the test period (default 7 days) and compares it to the baseline. Claude API analyzes the statistical significance and provides a verdict: "SCALE", "KEEP", or "REVERT".

AI Phone Receptionist for Construction Companies

Voice AI System for Automated Customer Service in Finnish

The Problem: Small construction companies (roofing contractors) miss 40-60% of incoming calls because they're on-site. Each missed call = potential €3,000-€8,000 lost job.

The Solution: Built an AI voice assistant that answers calls 24/7, understands Finnish, books appointments, and collects quote requests - all while sounding natural.

Technical Challenge: Finnish is a complex language with 15 grammatical cases. Getting voice AI to understand colloquial Finnish construction terminology required extensive prompt engineering and testing.

Technical Stack

  • VAPI (Voice AI platform)
  • Twilio (phone infrastructure)
  • Custom GPT-4 prompts (Finnish)
  • Webhook system to CRM
  • Calendar integration (Google)
  • SMS notifications
  • n8n workflow automation
24/7
Availability
Finnish
Native Language
3
Pilot Customers

Technical Deep Dive: Voice AI Flow

The system handles multi-turn conversations with context awareness:

# Voice AI conversation flow (conceptual)
conversation_flow = {
    "greeting": {
        "prompt": "Moi! Olet soittanut kattoremonttifirma X:lle. Olen AI-assistentti...",
        "next": ["appointment", "quote", "question"]
    },
    "appointment": {
        "collect": ["customer_name", "phone", "address", "preferred_date"],
        "validate": check_calendar_availability(),
        "action": book_appointment(),
        "webhook": send_to_crm()
    },
    "quote": {
        "collect": ["roof_type", "size", "current_condition", "urgency"],
        "action": create_quote_request(),
        "notify": send_sms_to_owner()
    }
}

# Real webhook integration
@app.route('/vapi-webhook', methods=['POST'])
def handle_call_completed():
    data = request.json
    
    if data['call_ended']:
        # Extract structured data from conversation
        conversation = data['transcript']
        extracted = parse_conversation_data(conversation)
        
        # Push to CRM
        create_crm_lead(extracted)
        
        # Notify owner via SMS
        send_sms(
            to=OWNER_PHONE,
            body=f"New lead: {extracted['name']}, needs {extracted['service']}"
        )
    
    return {"status": "processed"}
Finnish Language Challenge: Standard voice AI often struggles with Finnish. I solved this by: (1) Custom pronunciation guides in prompts, (2) Context-aware response generation that matches Finnish conversational patterns, (3) Extensive testing with real Finnish speakers to refine naturalness.

AI-Powered Cart Recovery System

Automated Email System with Dynamic Personalization

The Problem: DriveTron (e-scooter company) had 40,000-60,000€ monthly in abandoned carts. Only 15% of customers returned on their own. Standard cart recovery emails had ~8% recovery rate.

The Solution: Built an AI system that analyzes each abandoned cart, generates personalized recovery emails addressing specific concerns (price, product selection, financing), and sends them at optimal timing.

Result: Recovery rate increased from 15% to 24.6% (+64%), generating 100,000€ additional annual revenue with zero manual work.

Technical Stack

  • WooCommerce webhook listeners
  • n8n automation workflows
  • Claude API for email generation
  • Customer segmentation logic
  • HTML email templates
  • A/B testing framework
  • Analytics integration
24.6%
Recovery Rate
+100k€
Annual Revenue
40x
ROI First Year

Technical Deep Dive: Personalization Engine

The key was making each email feel hand-written. Here's the logic:

# Cart abandonment personalization logic
def generate_recovery_email(cart_data):
    # Analyze cart characteristics
    cart_value = cart_data['total']
    products = cart_data['items']
    customer_history = get_customer_data(cart_data['email'])
    
    # Determine personalization strategy
    concerns = identify_concerns(cart_data, customer_history)
    # Returns: ['high_price', 'product_uncertainty', 'payment_options']
    
    # Build context for AI
    context = f"""
    Cart Value: {cart_value}€
    Products: {format_products(products)}
    Customer Type: {'returning' if customer_history else 'new'}
    Identified Concerns: {concerns}
    
    Previous Purchases: {customer_history.get('past_orders', 'None')}
    Time Since Abandonment: 4.4 hours
    """
    
    # Generate personalized email with Claude
    prompt = f"""
    Write a personal cart recovery email for this customer.
    
    {context}
    
    Address these specific concerns:
    - If high_price: Mention financing options (Klarna 3 months)
    - If product_uncertainty: Validate their choice, mention specs
    - If payment_options: List all available payment methods
    
    Tone: Helpful, not pushy. Finnish casual business style.
    Length: 150-200 words max.
    """
    
    email_content = claude.messages.create(
        model="claude-sonnet-4-5-20250929",
        messages=[{"role": "user", "content": prompt}]
    )
    
    # Send via email service
    send_html_email(
        to=cart_data['email'],
        subject=generate_subject(concerns),
        body=format_html_email(email_content)
    )
Why 4.4 hours wait time? Through A/B testing, I found that immediate emails (< 1 hour) felt aggressive and had lower conversion. 4-6 hour delay gave customers time to reconsider naturally while still being top-of-mind. The system automatically tracks this timing via webhook + scheduled jobs.

Interested in Working Together?

I'm currently exploring opportunities in AI engineering where I can contribute my practical experience while learning enterprise-scale development practices from experienced teams.

Veeti Chat Widget
Veeti Sebastian
AI Konsultti
Vastaan tyypillisesti minuutissa