One organization.
Room to grow.

Start with your first application. Make room for more teams and workloads as your organization grows. PlainQ handles the infrastructure.

Starter

For your first application.

$19/ month

Per organization · USD

  • Teams2
  • Queues10
  • Pub/Sub topics5
  • Team-scoped API keys
  • Managed infrastructure
Get started

Team

For teams building together.

$49/ month

Per organization · USD

  • Teams10
  • Queues100
  • Pub/Sub topics50
  • Team-scoped API keys
  • Managed infrastructure
Get started

Business

For more teams and workloads.

$149/ month

Per organization · USD

  • Teams50
  • Queues500
  • Pub/Sub topics250
  • Team-scoped API keys
  • Managed infrastructure
Get started

A few things to know.

What is a plan attached to?
Each organization has its own plan. Its teams share the organization's queue and topic limits. You do not choose or manage a server.
What does every plan include?
An organization workspace, queues, Pub/Sub topics, team access, team-scoped API keys, and managed infrastructure.
Can I subscribe today?
Cloud is in early access. These are planned launch prices; checkout and paid subscriptions are not enabled. Final usage allowances and billing terms will be available before paid launch.

Run the queue.
Skip the broker fleet.

Create your organization, connect your application, and put your queues to work. PlainQ takes care of the infrastructure underneath.

Go SDK · gRPC: receive and acknowledge a message from a native PlainQ server. Use the same PLAINQ_ADDR as the send example and set PLAINQ_QUEUE_ID to its printed queue ID. For Cloud HTTP connections, follow the Cloud quickstart.

receive.go · gRPC
package main

import (
    "context"
    "log"
    "os"
    "time"

    plainq "github.com/marsolab/plainq-go-sdk"
    v1 "github.com/marsolab/plainq-go-sdk/v1"
)

func main() {
    client, err := plainq.New(os.Getenv("PLAINQ_ADDR"))
    if err != nil { log.Fatal(err) }
    defer client.Close()

    ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
    defer cancel()
    queueID := os.Getenv("PLAINQ_QUEUE_ID")

    received, err := client.Receive(ctx, &v1.ReceiveRequest{
        QueueId: queueID, BatchSize: 1, WaitTimeSeconds: 5,
    })
    if err != nil { log.Fatal(err) }

    for _, message := range received.GetMessages() {
        log.Printf("received: %s", message.GetBody())
        ack, err := client.Delete(ctx, &v1.DeleteRequest{
            QueueId: queueID, MessageIds: []string{message.GetId()},
        })
        if err != nil { log.Fatal(err) }
        if len(ack.GetFailed()) > 0 { log.Fatal(ack.GetFailed()) }
    }
}