Skip to main content
← Back to Docs

Integration Guides

Step-by-step guides for popular platforms and custom integrations

CertNode integrates with your existing platform to automatically create cryptographic receipts for every transaction, delivery, or event.

⚑

Automatic

Set up once, receipts are created automatically via webhooks

πŸ”

Secure

Uses OAuth or API keys with automatic token refresh

πŸ“Š

Monitored

Dashboard shows all receipt creation activity in real-time

πŸ’³

Stripe Integration

Automatically create receipts for every Stripe payment

Status: Live β€’ Setup Time: 5 minutes β€’ Type: OAuth + Webhooks

1

Connect Your Stripe Account

In your CertNode dashboard, navigate to Integrations β†’ Stripe and click Connect with Stripe. This uses OAuth to securely connect your Stripe account.

What happens: CertNode receives read-only access to your payment intents and charges. We never access customer payment methods or bank details.

2

Configure Webhook (Automatic)

CertNode automatically registers a webhook endpoint with Stripe. No manual configuration needed.

Webhook URL:

https://certnode.io/webhooks/stripe/YOUR_ACCOUNT_ID

Events monitored: payment_intent.succeeded, charge.succeeded, charge.refunded

3

Test the Integration

Create a test payment in Stripe (using test mode) and verify that a receipt appears in your CertNode dashboard.

βœ… Success! Every Stripe payment now automatically creates a cryptographic receipt with:

  • β€’ Amount, currency, customer info (hashed)
  • β€’ ES256 signature + RFC 3161 timestamp
  • β€’ Legally timestamped proof of transaction

Advanced: Custom Receipt Data

Add custom metadata to your Stripe payments to include additional data in receipts:

// When creating Stripe payment
const paymentIntent = await stripe.paymentIntents.create({
  amount: 29999,
  currency: 'usd',
  metadata: {
    certnode_product_name: 'Annual Subscription',
    certnode_subscription_id: 'sub_123',
    certnode_customer_tier: 'premium'
  }
})

// CertNode automatically includes metadata in receipt
πŸ›’

Shopify Integration

Create receipts for Shopify orders with fulfillment tracking

Status: API Available β€’ Setup Time: 10 minutes β€’ Type: Shopify App + Webhooks

1

Install Shopify App

Visit the Shopify App Listing and click Install App. Approve the requested permissions.

Permissions Required: read_orders, read_customers (hashed), read_fulfillments

2

Configure Receipt Types

Choose which Shopify events should create receipts:

3

Test with Sample Order

Create a test order in Shopify and verify receipt creation:

Expected Receipt Chain:

rcpt_order_123β†’ Order receipt (type: transaction)
rcpt_fulfillment_456β†’ Fulfillment receipt (type: operations, parent: rcpt_order_123)
πŸ”§

Custom Integration

Integrate CertNode with any platform using our REST API

Setup Time: 30-60 minutes β€’ Difficulty: Intermediate

1

Identify Receipt Creation Points

Determine where in your application you want to create receipts:

Transaction Receipts:
  • β€’ After payment processor confirms charge
  • β€’ When refund is issued
  • β€’ When subscription renews
Content Receipts:
  • β€’ When file is downloaded
  • β€’ When AI content is generated
  • β€’ When video is streamed
Operations Receipts:
  • β€’ When API call is made
  • β€’ When critical event occurs
  • β€’ When compliance action taken
2

Create Receipt Helper Function

Create a reusable function to create receipts:

// lib/certnode.ts
import crypto from 'crypto'

export async function createReceipt(params: {
  type: 'transaction' | 'content' | 'operations'
  data: Record<string, any>
  metadata?: Record<string, any>
  parentId?: string
}) {
  // Hash any PII before sending
  const sanitizedData = {
    ...params.data,
    customer_email_hash: params.data.customer_email
      ? crypto.createHash('sha256').update(params.data.customer_email).digest('hex')
      : undefined,
  }
  delete sanitizedData.customer_email // Remove raw email

  const response = await fetch('https://certnode.io/api/v1/receipts', {
    method: 'POST',
    headers: {
      'X-API-Key': process.env.CERTNODE_API_KEY!,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      type: params.type,
      data: sanitizedData,
      metadata: params.metadata,
      parent_id: params.parentId,
    }),
  })

  if (!response.ok) {
    throw new Error(`Failed to create receipt: ${response.statusText}`)
  }

  return response.json()
}
3

Call from Your Application

Use the helper function where needed:

// Example: After processing payment
async function processPayment(orderId: string) {
  // 1. Process payment with your payment processor
  const payment = await paymentProcessor.charge(...)

  // 2. Create CertNode receipt
  const receipt = await createReceipt({
    type: 'transaction',
    data: {
      amount: payment.amount,
      currency: payment.currency,
      product: payment.product_name,
      customer_email: payment.customer_email, // Will be hashed
      order_id: orderId,
    },
    metadata: {
      platform: 'custom_app',
      payment_processor: 'stripe',
      environment: process.env.NODE_ENV,
    },
  })

  // 3. Store receipt ID for later reference
  await db.orders.update(orderId, {
    certnode_receipt_id: receipt.id,
    certnode_verification_url: receipt.verification_url,
  })

  // 4. (Optional) Send verification URL to customer
  await sendEmail(payment.customer_email, {
    subject: 'Receipt for your purchase',
    body: `Your cryptographic receipt: ${receipt.verification_url}`,
  })

  return receipt
}
4

Handle Receipt Chains (Optional)

Link related receipts together:

// Example: Order β†’ Fulfillment β†’ Delivery chain
async function fulfillOrder(orderId: string) {
  const order = await db.orders.findById(orderId)

  // Create fulfillment receipt linked to order receipt
  const fulfillmentReceipt = await createReceipt({
    type: 'operations',
    data: {
      event: 'order_fulfilled',
      order_id: orderId,
      tracking_number: '1Z999AA10123456784',
      shipped_date: new Date().toISOString(),
    },
    metadata: {
      platform: 'custom_app',
    },
    parentId: order.certnode_receipt_id, // Link to order receipt
  })

  return fulfillmentReceipt
}

Integration Best Practices

⚠️ Error Handling

Always handle receipt creation failures gracefully. A failed receipt should not block your core business logic.

try {
  await createReceipt({ ... })
} catch (error) {
  // Log error but don't fail the transaction
  console.error('Receipt creation failed:', error)
  await monitoring.logError('certnode_receipt_failure', error)
}

πŸ”„ Retry Logic

Implement exponential backoff for transient failures. CertNode automatically retries timestamp requests, but network failures may need client-side retries.

πŸ“Š Monitoring

Monitor receipt creation rates and failures in your CertNode dashboard. Set up alerts for unusual patterns.

πŸ§ͺ Testing

Use separate API keys for test and production environments. Test receipts are marked with metadata.environment = "test".