Portal.io Integration — Automated Proposals from Installation Manifests
> **Warning:** This Epic's description is managed as documentation and mirrors a file in the > website repository. Do not edit it directly. See [how we manage the roadmap](https://selorahomes.com/handbook/departments/product/roadmap-management/) > and propose all content changes via a Merge Request. [📝 Source](https://gitlab.com/selorahomes/products/selorahomes.com/-/blob/main/content/docs/roadmap/portalio-integration.md) {{< gitlab-epic >}} ## Summary Integrate Portal.io — a proposal and business management platform for AV, security, and IT/MSP integrators — with Selora Connect. The integration would automatically create proposals in Portal.io from installation manifests authored in Connect, eliminating the manual re-typing of room-by-room scopes, device lists, and labor items that installers currently do when preparing quotes. This Epic starts with a **feasibility spike** to determine whether the Portal.io API can support this workflow end to end before any product decision is made. ## Context Installation manifests in Connect already capture everything a proposal needs: the rooms and areas involved, the devices to install, the devices already in place, and the work that remains. Today, when an installer wants to send a formal proposal to a client, they rebuild that information by hand in their quoting tool. Portal.io is one of the quoting/proposal platforms used by our installer customers, and it now exposes a public API (<https://docs.portal.io/>), which makes an automated bridge feasible. ## What the Portal.io API Offers Per the [Portal.io API documentation](https://docs.portal.io/): - **Proposals** — create, retrieve, update, and manage the full proposal lifecycle. Proposals follow a four-level hierarchy: **Proposal → Areas → Options → Line Items**, where areas are unique room/zone names, each area supports up to 3 options (configuration variants), and line items are added from the Portal.io catalog. - **Contacts & Locations** — create, search, and assign the client contacts that proposals belong to, including site locations. - **Catalog** — search and browse product and service items by industry and category. - **Webhooks** — subscribe to real-time events when proposal, payment, or order statuses change (e.g. Draft → Submitted → Accepted). - **AI Builder** — upload source content and let Portal.io's own AI generate proposal outlines and builds. - **Environments & auth** — isolated sandbox (`https://sandbox.api.portal.io`) and production (`https://api.portal.io`) environments. All requests are signed with HMAC-SHA256 using an App Key, a Secret Key, and a per-user API Key. Production access requires approval from Portal.io. A Postman collection and an AI-tooling documentation index (llms.txt) are provided for exploration. ## Spike Objectives The spike's goal is a go / no-go recommendation with evidence, answering: 1. **Data mapping** — Can the structure of a Connect installation manifest (areas, devices, quantities, existing vs. new work) be mapped cleanly onto Portal.io's Proposal → Area → Option → Line Item model? Which manifest fields have no natural target, and which proposal fields must be filled manually? 2. **Catalog alignment** — Can devices from a manifest be matched to Portal.io catalog items (by SKU, name, or category)? What is the fallback when no catalog match exists (custom line items, or manual entry)? 3. **Contact mapping** — How should Connect project/owner data be mapped to Portal.io contacts and locations, and can the integration de-duplicate on re-runs? 4. **Authentication & security** — Verify the HMAC-SHA256 signing flow against the sandbox (credential exchange, User API Key handling) and define how Portal.io credentials (App Key, Secret Key) are stored and scoped in Connect. 5. **Status round-trip** — Can webhooks push proposal status changes (Accepted, Declined, …) back into Connect so the project record reflects the client's decision? 6. **AI Builder option** — Does uploading manifest content to Portal.io's AI Builder produce a usable proposal, and is that a viable alternative or complement to the direct API mapping? 7. **Operational constraints** — Rate limits, production-access requirements, error handling, and webhook delivery characteristics that would affect a production integration. ## Success Criteria - A working end-to-end prototype in the **sandbox**: a Connect installation manifest triggers the creation of a Portal.io proposal with correctly mapped areas, items, and a client contact. - A documented field-by-field mapping (Connect manifest → Portal.io proposal) with gaps explicitly called out. - A go / no-go recommendation with the main risks and effort estimate for a production-ready integration. ## Out of Scope (for the spike) - Production credential provisioning and client onboarding. - Payment, invoicing, and order management flows beyond reading proposal status. - Two-way item editing (proposals edited in Portal.io are not synced back into the manifest).
epic