Atma Energy
Atma Energy is a bootstrapped Texas energy company offering a complete range of solutions for solar customers: solar and storage installation, battery subscriptions, VPP (Virtual Power Plant) and solar buyback plans, system monitoring, and service. When they approached me, they were a validated business entering growth stage with strong sales – but nearly every digital process was manual.
I led product strategy, design, and development across their customer-facing platforms and internal tools. I wrote specs, designed interfaces, and built the front end (TALL stack). I also led the rebrand, designing the logo, brand guidelines, and a design system that unified product and marketing.
Brand & design
When I joined Atma, the company had outgrown its original identity. I led the rebrand from discovery through delivery, starting with a stakeholder workshop to define the brand's positioning, voice, and visual direction, and carrying through to a design system that unified every surface.
To kick off the work, I facilitated a brand focus workshop with leadership to align on positioning and values, then delivered a Brand Focus book documenting the strategic foundation.
From there I designed the logo mark, wordmark, and logotype, defined the color palette, and crafted the visual direction:
The company's primary typeface is Area Normal by Blaze Type. Area Normal is a warm sans-serif font, geometric with neo-grotesque attributes that give it a feeling of stability, clarity, and humanity that matches the brand voice.
I workshopped and selected the company typeface with the goal to make the company typography as simple and clear as their products and services.
The full brand guidelines were delivered first as a PDF. When I established the company playbook using Outline, I moved the brand guidelines to this living document to increase their accessibility for the team as well as external marketing stakeholders:
I also created the company's big idea. The big idea captures the story of the brand in three simple words:
With the brand established, I created the company design system in Figma and designed the marketing site components and website. The system covered both the public-facing marketing site (Statamic + Tailwind) and the internal admin panel (Filament).
Case studies
I ran a small cross-functional product team with structured delivery: kick-off, scope finalization, UAT, go/no-go, launch. The systems I designed and built contributed to over $10M in annual sales in 2025, more than doubling the prior year.
Proposal tool
Summary
This custom solar proposal system replaced a manual, Excel-based workflow. It initially decreased proposal creation time by 78%, and a later automation integration reduced the time needed by another 40%. The proposal system supported annual sales growth from under $2M to over $10M.
Context
Atma sales reps create thousands of solar proposals for homeowners. Each proposal contains details about system design, savings projections, financing options, and equipment specs. When I joined, reps were working from a complex Excel spreadsheet filled with calculations. The manual workflow included preparing the data, populating the sheet, removing irrelevant sections, exporting a PDF, uploading it to Google Drive, and emailing it to the customer. The spreadsheet was time-consuming to fill out, difficult to adjust, and increased the risk of error.
Problem
The process couldn't scale, and it produced proposals with inconsistent quality and presentation. This destabilized the connection with homeowners at a critical stage of the sales funnel. Homeowners lacked a structured path from initial proposal delivery to contract signing, and reps handled responses ad-hoc as homeowners had no self-service option for reviewing options or taking next steps.
Approach
There was no off-the-shelf solution for this. Atma’s custom requirements and dedication to transparency with customers meant that no third-party proposal solution would suffice. Because a unique system was needed to accurately reflect Atma's sales process and product offering, there was no real blueprint to reference which made the design phase critical. I walked stakeholders through flowcharts and prototypes repeatedly to validate decisions and flush out hidden requirements before anything was built.
sequenceDiagram
autonumber
actor RSA
participant Monday
participant Panel as Atma Panel
participant Scanifly
actor Engineer
RSA->>Monday: Create lead (name, address, phone, email)
RSA->>Monday: Discovery call — lead wants to proceed
RSA->>Monday: Add hardware data (utility, panels, inverters, batteries)
RSA->>Monday: Change status to "Request Design"
Monday->>Panel: Webhook triggers automation
Panel->>Panel: Create user + proposal from Monday data
Panel->>Scanifly: Create project + design
Scanifly-->>RSA: Email: "Design ready" + link
RSA->>Scanifly: Open design
RSA->>Scanifly: Toggle Simple mode + auto-design (~60s)
RSA->>Scanifly: Finalize design (~30s)
Note over RSA: RSA is done
Engineer->>Panel: Check IP Status for pending proposals
Engineer->>Panel: Open proposal
Engineer->>Scanifly: Open design in Scanifly
Engineer->>Scanifly: Add consumption values + edit design
Engineer->>Scanifly: Save design
Scanifly-->>Panel: Design data synced
Engineer->>Panel: Fill missing proposal fields
Engineer->>Panel: Change IP Status to "IP Ready"
Note over Panel: IP ready for customer
A key architectural requirement lay in separating the two stages of the proposals: the Initial Proposal (IP) and the Engineered Proposal (EP). The IP is generated early in the sales process after a discovery call with the lead. Before the lead is committed, speed is the most important factor. The IP is like a rough draft – panel placement is approximate and measurements aren't exact, but it's good enough to give the homeowner a realistic picture. When the lead chooses to move forward, Atma schedules a drone flight to capture detailed roof imagery. Engineers use the drone data to design a precise system – this is the EP, the proposal the homeowner signs against.
On the customer side, I designed a tabbed proposal template that guided homeowners through a structured flow: Meet Atma, Your energy needs, Your solution, Savings, Financing, Benefits, Process, and Configure. The Configure tab served as the conversion point, where homeowners could move toward agreement creation on their own terms.
Scanifly integration
After the initial launch, the system went through multiple iterations and improvements based on feedback from sales team, engineers, and customers. As AI-powered design solutions came to market, our engineering team identified an opportunity to automate IP creation using a tool from Scanifly. I worked with engineering to translate this into a production feature.
The integration connected Monday (lead management), the Atma panel (Filament-based proposal system), and Scanifly (third-party solar design tool) into an automated pipeline. When a rep qualifies a lead and changes a status in Monday, the system automatically creates the user, generates the proposal, and creates a Scanifly account – all without manual data entry between systems. The rep then opens the proposal tool, triggers the automatic design in Scanifly, finalizes it in minutes, and hands off to the homeowner.
sequenceDiagram
autonumber
participant Job as SyncDesignJob
participant Scanifly as Scanifly API
participant Action as UpdateProposalAction
participant Proposal as Proposal
Job->>Scanifly: getDesign(projectId, designId)
Scanifly-->>Job: design data
Job->>Action: execute(proposal, design)
Action->>Proposal: update solarSystem + production data
Action-->>Job: success
This system reduced initial proposal creation time by an additional 40%, eliminated manual data entry between three systems, and ensured data consistency across the pipeline.
Build
The proposal system was built in Laravel with a Filament admin panel for reps, Vue components for the interactive customer-facing views, and Tailwind for styling. Chart.js handled savings and energy visualizations. The Scanifly integration used Monday webhooks and the Scanifly API, with validation logic to catch missing data before proposal creation.
Outcome
Proposal creation time decreased by 78%
Scanifly automation reduced IP creation time by an additional 40%
Proposal quality became consistent across all reps regardless of experience
Homeowners gained a self-service path from proposal review to agreement
The system contributed to annual sales growing from under $2M to over $10M
Reflection
The most difficult part of this project was the lack of reference points. Every feature was custom to Atma's process, and most problems didn't have existing patterns to borrow from. This was true for nearly every project at Atma. I learned quickly to take a hard and fast approach to validation, with multiple flowcharts, prototypes, and requirements docs requiring approval from stakeholders before any code was written. The cost of building the wrong thing in a bootstrapped company with a small team is high, so the up-front investment in alignment paid for itself many times over.
Service platform
Summary
This subscription-powered service platform replaced manual ticket management with an automated workflow. It reduced service response time from weeks to hours and established a new recurring revenue stream.
Context
Atma monitors customer solar systems for issues. This includes panels underperforming, batteries not reporting, inverters failing, and more. When I joined, the operations team managed service entirely through third-party monitoring, email, phone calls, and a Monday board. Tickets were created and updated manually. Customers had no visibility into their ticket status beyond whatever they were told on a call. The oldest unresolved ticket was several months old.
The company had validated demand for a service subscription product, but the existing subscription model contained design flaws: the pricing tiers were confusing to customers and the structure would have been difficult to implement technically.
Problem
There were several problems that compounded each other.
Manual ticket management didn't scale. Every status update depended on someone remembering to do it, and the risk of error was high.
Customers had zero self-service visibility, which meant every status inquiry required a phone call or email that pulled the ops team away from their work.
The validated subscription product couldn't ship in its current form without creating technical debt and customer confusion.
Approach
The subscription needed to be fixed before the platform could be built. I spent several weeks working with stakeholders to demonstrate the flaws in the existing subscription design – the tier structure was ambiguous and the pricing logic would have been fragile to implement. Eventually, after reframing the problem from the customer's perspective, stakeholders agreed to simplify. The final model was a single annual subscription at $365 with clear on-site service pricing: $150/hour for the first two hours, $100/hour after that.
For the platform itself, I designed a 20+ status ticket workflow that automated as much of the process as possible. The system used the Enphase API to monitor customer systems every 15 minutes, checking for a defined set of error statuses. When an issue was detected it triggered an alert. For Premium subscribers, detected issues automatically created a service ticket and started the workflow with no human intervention needed.
A key product decision was the subscription paywall for automatic ticket creation. Premium subscribers got automatic monitoring and ticket creation. Basic users saw system alerts on their dashboard but had to initiate a ticket themselves. This added clear value to the subscription without leaving basic users in the dark about their system health.
For customers, I designed a service section in the dashboard with ticket tracking, subscription management, and warranty information. For admins, I created a service management interface in Filament with role-based access: operations manager, service manager, service representative, and service technician — each with appropriate permissions and views.
Build
The platform was built in Laravel with:
Filament for the admin panel
Stripe for subscription billing and payment management
Enphase API for automated system monitoring.
The ticket workflow included:
Automated email notifications at key status changes
Calendly integration for scheduling service appointments
Image upload for documentation
Service report PDF generated at ticket close
sequenceDiagram
autonumber
actor Customer
participant UI as Dashboard UI
participant Tickets as TicketController
participant Ticket as Ticket Model
participant Observer as TicketObserver
participant Messages as SendTicketMessageController
participant Uploads as UploadTicketImagesController
participant Docs as TicketDocument
Customer->>UI: Create ticket
UI->>Tickets: POST /dashboard/service/tickets
Tickets->>Ticket: create (issue, system_id, user_id)
Ticket->>Observer: created() assigns ticket_number
Observer-->>Customer: TicketCreatedNotification
loop Messaging
Customer->>UI: Send message
UI->>Messages: POST /send-message
Messages->>Ticket: messages()->create()
end
opt Upload images
Customer->>UI: Upload images
UI->>Uploads: POST /upload-images
Uploads->>Ticket: saveUploadedImages()
Ticket->>Docs: create TicketDocument (Image)
end
Outcome
Service response time reduced from weeks to hours
Automated monitoring checks all customer systems every 15 minutes
Subscription model created a new recurring revenue stream
Customers gained real-time visibility into ticket progress, reducing inbound calls and emails
Ticket workflow automated status transitions, notifications, and handoffs that were previously manual
Reflection
The hardest part of this project wasn't the design or the technical build – it was adoption. The operations team knew the existing process was broken, but they were time-poor and deep in daily firefighting, which made adopting new practices difficult even when the new system was objectively better.
Every improvement met resistance at some point: the subscription model needed weeks of stakeholder alignment, Calendly required education and convincing people of its merits, and the in-app messaging system (designed specifically to replace email and phone for ticket communication) was initially bypassed in favor of the old methods.
After launch and for the first few months, the platform was seen internally as underwhelming. Then adoption caught on: the ops team integrated the workflows into their daily process, subscription revenue grew, and leadership's assessment shifted. What looked like a slow start was actually the normal cost of changing how people work.
The lesson learned was that shipping the product is not the end of the story. A well-designed system still requires patience, presence, and sometimes just time before the people it serves make it their own.
Contract automation
Summary
This project moved contract creation from a manual, rep-driven process into the customer's hands. It removed the friction that was losing deals at the final stage of the sales funnel.
Context
After a homeowner reviewed and approved their Engineered Proposal (EP), the next step was signing a contract. This was the last stage before becoming a customer, and it was where Atma was losing deals they'd already won. Reps estimated they lost up to 10% of deals at the contract stage. It wasn’t because homeowners had changed their mind about solar – it was the process itself that created discomfort and delay.
Problem
The contract process was entirely manual and rep-controlled. Homeowners wanted to understand what they were signing, but the only way to see the contract was to ask the rep to generate one – which felt like a commitment before they were ready. Reps tried to work around this by sharing blank contracts or walking leads through the terms over email and phone, but this created protracted back-and-forth discussions that drained momentum.
When a contract was finally ready, the rep created it manually in DocuSign. If the homeowner wanted to change their financing option or add a subscription, the rep would void the contract and recreate it from scratch, which generated more emails, more calls, more manual work, and more opportunities for the deal to stall.
Approach
The core insight was that the contract stage failed because it took control away from the homeowner at the last moment they most needed it most. We had already created a self-service proposal to support and increase efficiency for all users. We just needed to align the contract feature with the rest of the template. The solution was to invert the process: let the homeowner configure and generate their own contract.
I designed a contract page, separate from the proposal, where the homeowner could select their financing type (express loan, traditional loan, or cash), choose subscriptions (battery and service plans), enter a down payment amount, and generate the contract themselves. The contract was then presented for review and signing via an embedded DocuSign experience that didn’t require email attachments or back-and-forth discussions.
Key decisions:
Separated the contract page from the rest of the proposal to create a clear psychological shift from "reviewing options" to "making a decision"
Restricted contract creation to Engineered Proposals only, ensuring the homeowner was working from verified system specifications
Added a 30-day EP expiration – if the proposal was older than 30 days, the homeowner was redirected to contact their rep for an update before proceeding, protecting against outdated pricing or specs
Built five distinct states for the Configure tab so the homeowner always knew exactly where they stood: ready to configure, contract generated, homeowner signed, both signed, or proposal expired
On the rep side, I designed automated notifications at each stage — contract created, homeowner signed, ready for rep signature — and Monday board updates that moved the lead through pipeline stages automatically. After both signatures were collected, the system promoted the proposal to Contracted status, created an installation record, and updated the homeowner's role from Lead to Customer.
sequenceDiagram
autonumber
actor Customer
participant UI as Proposal UI
participant Controller as ProposalContractController
participant Action as GenerateProposalContractAction
participant Storage as Storage (local)
participant DocuSign as DocuSign
participant Jobs as CreateEnvelopeJob
participant Webhook as DocuSign Webhook
participant Contracted as ContractedProposalAction
Customer->>UI: Submit contract configuration
UI->>Controller: POST /proposals/{uuid}/contract
Controller->>Action: execute()
Action->>Storage: write DOCX
Action->>Jobs: dispatch CreateEnvelopeJob
Jobs->>DocuSign: createEnvelope
DocuSign-->>Jobs: envelopeId
Jobs->>Controller: status=Ready, envelopeId
DocuSign-->>Webhook: recipient.completed / envelope.completed
Webhook->>Contracted: handle contract completion
Contracted->>Contracted: create system + installation
Build
The system was built in Laravel with a new DocuSign service for contract generation, embedding, and webhook handling. Financing and subscription selections fed into the contract template dynamically. Stripe handled subscription billing setup. Monday API integration automated pipeline stage transitions and status column updates. The Configure tab used state-driven rendering in Vue, with each of the five states pulling from proposal and contract status data.
Outcome
Homeowners can configure and generate their own contract without rep involvement
Contract revisions no longer require manual recreation — homeowners can reconfigure before signing
Automated notifications and Monday updates eliminated manual pipeline management
The full flow from contract generation to installation creation runs without manual intervention after both signatures
Addressed the contract friction that reps estimated cost up to 10% of deals at the final stage
Reflection
This project reinforced something I'd seen in several of the major feature builds at Atma. The biggest gains often come not from building new capabilities but from removing the friction in processes people are already trying to complete. In this case, homeowners wanted to sign, and reps wanted to close, but the old process stood in the way of them both. The solution lay in handing over control to the person who needed it most at that moment.