Skip to main content

Overview

The feedback table stores individual feedback items submitted for feature requests. Each feedback entry is associated with a request, an account, and optionally an opportunity.

Fields

id
uuid
required
Primary key. Auto-generated UUID for the feedback entry.
requestId
uuid
required
Foreign key reference to requests.id. The request this feedback belongs to.
accountId
text
required
Foreign key reference to sfdc_accounts.id. The Salesforce account associated with this feedback.
opportunityId
text
Foreign key reference to sfdc_opportunities.id. The Salesforce opportunity associated with this feedback, if any.
severity
severity
required
Impact level of this feedback. See Enums for possible values.
description
text
required
Detailed description of the feedback.
creator
uuid
required
Foreign key reference to users.id. The user who created this feedback entry.
createdAt
timestamp
required
Timestamp with timezone when the feedback was created. Default: now().
Array of external URLs related to this feedback (e.g., support tickets, Slack threads). Default: [].
slug
text
Optional URL-friendly identifier for the feedback within the request. Combined with requestId for uniqueness.
creationSource
feedback_creation_source
required
How this feedback was created. See Enums for possible values. Default: manual.
metadata
jsonb
Additional metadata stored as JSON.

Enums

severity

The severity field uses the severity enum with the following values:
  • low - Minor inconvenience or nice-to-have feature
  • medium - Moderate impact on user experience or workflow
  • high - Critical issue blocking important workflows or affecting revenue

feedback_creation_source

The creationSource field uses the feedback_creation_source enum with the following values:
  • manual - Feedback was manually entered by a user
  • agent - Feedback was automatically created by an AI agent or automation

Relationships

Belongs to

  • Request: feedback.requestIdrequests.id (cascade on delete)
  • User (creator): feedback.creatorusers.id
  • SFDC Account: feedback.accountIdsfdc_accounts.id
  • SFDC Opportunity: feedback.opportunityIdsfdc_opportunities.id (optional)

Indexes

feedback_request_slug_key
unique
Unique constraint on the combination of requestId and slug.
feedback_request_created_idx
index
Composite index on requestId and createdAt for efficient sorting of feedback within a request.
feedback_account_idx
index
B-tree index on accountId for querying feedback by account.
feedback_creator_idx
index
B-tree index on creator for querying feedback by creator.

Example queries

Query all feedback for a request

import { db } from './db';
import { feedback } from './schema';
import { eq } from 'drizzle-orm';

const requestFeedback = await db.query.feedback.findMany({
  where: eq(feedback.requestId, 'request-uuid-here'),
  orderBy: (feedback, { desc }) => [desc(feedback.createdAt)],
  with: {
    user: true,
    account: true,
    opportunity: true,
  },
});

Get high-severity feedback

import { db } from './db';
import { feedback } from './schema';
import { eq } from 'drizzle-orm';

const criticalFeedback = await db.query.feedback.findMany({
  where: eq(feedback.severity, 'high'),
  with: {
    request: true,
    account: true,
  },
});

Find feedback by account

import { db } from './db';
import { feedback } from './schema';
import { eq } from 'drizzle-orm';

const accountFeedback = await db.query.feedback.findMany({
  where: eq(feedback.accountId, 'sfdc-account-id'),
  with: {
    request: true,
    opportunity: true,
  },
});

Get feedback created by agent

import { db } from './db';
import { feedback } from './schema';
import { eq } from 'drizzle-orm';

const agentFeedback = await db.query.feedback.findMany({
  where: eq(feedback.creationSource, 'agent'),
  orderBy: (feedback, { desc }) => [desc(feedback.createdAt)],
});

Create new feedback

import { db } from './db';
import { feedback } from './schema';

const newFeedback = await db.insert(feedback).values({
  requestId: 'request-uuid-here',
  accountId: 'sfdc-account-id',
  opportunityId: 'sfdc-opportunity-id',
  severity: 'high',
  description: 'Customer is blocked by missing API authentication',
  creator: 'user-uuid-here',
  externalLinks: ['https://slack.com/archives/...'],
  creationSource: 'manual',
}).returning();

Delete feedback (cascades from request)

import { db } from './db';
import { requests } from './schema';
import { eq } from 'drizzle-orm';

// Deleting a request will automatically delete all associated feedback
// due to the cascade delete constraint
await db.delete(requests).where(eq(requests.id, 'request-uuid-here'));

Build docs developers (and LLMs) love