Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions docs/Features/marketing.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,18 @@ Every blast sends through a transport you choose. A fresh install already has on

The deliverability panel checks each transport's sender domain against SPF, DKIM and DMARC, so you know before you send whether Gmail and Yahoo will accept your mail in bulk.

## What is planned
## The six phases

The programme runs in six phases, ordered by value. Each phase is a set of openspec changes; the [architecture page](../Technical/marketing-architecture.md#phases) lists them.
The programme ran in six phases, ordered by value. Each phase is a set of openspec changes; the [architecture page](../Technical/marketing-architecture.md#phases) lists them. All six have shipped, with the limits each row names.

| Phase | You will be able to | Status |
| --- | --- | --- |
| 1 · Lists and mailings | Run mailing lists people subscribe to, with double opt-in and a preference centre. Compose a newsletter from articles. Record work, private and mobile numbers, several email addresses and social handles per contact. Sending through your own mail server, your own Mail account, or a bulk provider is already live, see [Sending](#sending). | Planned |
| 2 · Content hub and AI | Write an article once and reuse it in a newsletter, a social post and a portaliq page. Ask hermiq for a draft, a shorter subject line or a LinkedIn variant, in your organisation's voice. Every AI draft is marked and needs your approval before anything leaves. | Planned |
| 1 · Lists and mailings | Run mailing lists people subscribe to, with double opt-in and a preference centre. Compose a newsletter from articles. Record work, private and mobile numbers, several email addresses and social handles per contact. Sending through your own mail server, your own Mail account, or a bulk provider is already live, see [Sending](#sending). | Live |
| 2 · Content hub and AI | Write an article once and reuse it in a newsletter, a social post and a portaliq page. Ask hermiq for a draft, a shorter subject line or a LinkedIn variant, in your organisation's voice. Every AI draft is marked and needs your approval before anything leaves. | The content hub is live. Asking hermiq for a draft is not built yet: nothing can write into Pipelinq as an agent, so the mark exists and no agent sets it |
| 3 · Social publishing | Connect your company pages on LinkedIn, Mastodon, Bluesky, X, Facebook, Instagram and Threads, and let colleagues connect their own profiles. Schedule and approve posts in one calendar. Where a network does not allow posting on someone's behalf, they receive the prepared post and share it themselves. See which posts perform. | Live for Mastodon; the other networks wait on their developer applications |
| 4 · Campaigns and attribution | Group a mailing, posts and a landing page into one campaign. Create the landing page with a form in portaliq from Pipelinq. A form submission becomes a lead that remembers which mailing and which post brought it in. See attributed revenue per campaign, closed on paid invoices in shillinq. | Live |
| 5 · Search and competitors | Connect Google Search Console and Matomo. See which keywords you rank for, which are within reach, which pages compete with each other, and which terms to use more or less. Follow competitors through their feeds, sitemaps and public social timelines. Check which clients follow you and whom you follow. | Live. The keyword analysis needs a connected Search Console property; the watches and the Matomo reports need an OpenConnector source each |
| 6 · Integrated campaigns | Build audiences from bookkeeping: lapsed customers, top-tier customers, buyers of one product without another. Run journeys that start from a stage change or a renewal window. Get a weekly review from hermiq with what moved and what to try. | Planned |
| 6 · Integrated campaigns | Build audiences from bookkeeping: lapsed customers, top-tier customers, buyers of one product without another. Run journeys that start from a stage change or a renewal window. Get a weekly review from hermiq with what moved and what to try. | Live. The two CRM audiences work everywhere; the four bookkeeping ones need shillinq installed and a client linked to a shillinq organisation, and say so when they cannot answer |

## How it stays yours

Expand Down
6 changes: 4 additions & 2 deletions docs/Technical/marketing-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Pipelinq already ships a compliant blast engine. Everything below is live in the
| Performance dashboard with a chi-square A/B verdict | `BlastPerformanceDashboardView` | marketing-analytics |
| SMS and WhatsApp messaging with per-channel consent and budgets | `80-whatsapp-sms-channel.json` | outbound-messaging |

Two defects are known and are the first work of phase 1. The segment builder component is imported by nothing, so the Segments and Templates pages the user guide describes are not reachable. Segment validation fails on current OpenRegister because `SegmentService` still passes a removed `$published` argument to `SchemaMapper::find()` (pipelinq#773).
Both of the defects this page opened with are fixed. The segment builder was imported by nothing, so the Segments and Templates pages the user guide describes could not be reached; they are mounted now. Segment validation failed on current OpenRegister because `SegmentService` passed a removed `$published` argument to `SchemaMapper::find()`; that call site no longer does (pipelinq#773, pipelinq#1764).

## Five rules

Expand Down Expand Up @@ -107,7 +107,7 @@ flowchart LR

The transport is a per-tenant choice. The three endpoints on the right never change. They are `PublicPage` routes with signed tokens, throttled per ADR-082, and they fail closed.

The Nextcloud `IMessage` interface has no header setter. Setting `List-Unsubscribe` and `List-Unsubscribe-Post` on the default transport needs either the private `Message::getSymfonyEmail()` or a Symfony `Email` sent through the same transport DSN. Phase 0 decides which and records it in its spec.
The Nextcloud `IMessage` interface has no header setter. `List-Unsubscribe` and `List-Unsubscribe-Post` reach the default transport through the private `Message::getSymfonyEmail()`, called behind a `method_exists` guard so an install whose mailer does not expose it degrades with a logged warning rather than a fatal. Provider transports carry the headers natively.

## How a tenant connects an account

Expand Down Expand Up @@ -159,6 +159,8 @@ All schemas are OpenRegister configuration in `lib/Settings/register.d/`, follow

## Phases

> **All six phases have shipped**, together with the phase 0 prerequisites. What each row promised is live on `development` and covered by Playwright, with three limits worth naming: social publishing is provable on Mastodon alone until the LinkedIn, Meta and X developer applications are filed; the keyword analysis needs a connected Search Console property; and the bookkeeping audiences need shillinq installed and a client linked to a shillinq organisation. The per-phase status is on the [feature page](../Features/marketing.md#the-six-phases).

Phases are ordered by value and dependency. No dates. Tracks inside a phase can be built in parallel. Each phase names the openspec changes to open and the exit criterion that lets the next one start.

| Phase | Scope | Openspec changes | Exit criterion |
Expand Down
Loading